詳解遷移學習
深度學習中,最強大的理念之一就是,有的時候神經網路可以從一個任務中習得知識,並將這些知識應用到另一個獨立的任務中。所以例如,也許已經訓練好一個神經網路,能夠識別像貓這樣的物件,然後使用那些知識,或者部分習得的知識去幫助您更好地閱讀x射線掃描圖,這就是所謂的遷移學習。
來看看,假設已經訓練好一個影像識別神經網路,所以首先用一個神經網路,並在\((x,y)\)對上訓練,其中\(x\)是影像,\(y\)是某些物件,影像是貓、狗、鳥或其他東西。如果把這個神經網路拿來,然後讓它適應或者說遷移,在不同任務中學到的知識,比如放射科診斷,就是說閱讀\(X\)射線掃描圖。可以做的是把神經網路最後的輸出層拿走,就把它刪掉,還有進入到最後一層的權重刪掉,然後為最後一層重新賦予隨機權重,然後讓它在放射診斷資料上訓練。
具體來說,在第一階段訓練過程中,當進行影像識別任務訓練時,可以訓練神經網路的所有常用引數,所有的權重,所有的層,然後就得到了一個能夠做影像識別預測的網路。在訓練了這個神經網路後,要實現遷移學習,現在要做的是,把資料集換成新的\((x,y)\)對,現在這些變成放射科影像,而\(y\)是想要預測的診斷,要做的是初始化最後一層的權重,讓稱之為\(w^{[L]}\)和\(b^{[L]}\)隨機初始化。
現在,在這個新資料集上重新訓練網路,在新的放射科資料集上訓練網路。要用放射科資料集重新訓練神經網路有幾種做法。可能,如果的放射科資料集很小,可能只需要重新訓練最後一層的權重,就是\(w^{[L]}\)和\(b^{[L]}\)並保持其他引數不變。如果有足夠多的資料,可以重新訓練神經網路中剩下的所有層。經驗規則是,如果有一個小資料集,就只訓練輸出層前的最後一層,或者也許是最後一兩層。但是如果有很多資料,那麼也許可以重新訓練網路中的所有引數。如果重新訓練神經網路中的所有引數,那麼這個在影像識別資料的初期訓練階段,有時稱為預訓練(pre-training),因為在用影像識別資料去預先初始化,或者預訓練神經網路的權重。然後,如果以後更新所有權重,然後在放射科資料上訓練,有時這個過程叫微調(fine tuning)。如果在深度學習文獻中看到預訓練和微調,就知道它們說的是這個意思,預訓練和微調的權重來源於遷移學習。
在這個例子中做的是,把影像識別中學到的知識應用或遷移到放射科診斷上來,為什麼這樣做有效果呢?有很多低層次特徵,比如說邊緣檢測、曲線檢測、陽性物件檢測(positive objects),從非常大的影像識別資料庫中習得這些能力可能有助於的學習演算法在放射科診斷中做得更好,演算法學到了很多結構資訊,影像形狀的資訊,其中一些知識可能會很有用,所以學會了影像識別,它就可能學到足夠多的資訊,可以瞭解不同影像的組成部分是怎樣的,學到線條、點、曲線這些知識,也許物件的一小部分,這些知識有可能幫助的放射科診斷網路學習更快一些,或者需要更少的學習資料。
這裡是另一個例子,假設已經訓練出一個語音識別系統,現在\(x\)是音訊或音訊片段輸入,而\(y\)是聽寫文字,所以已經訓練了語音識別系統,讓它輸出聽寫文字。現在說想搭建一個“喚醒詞”或“觸發詞”檢測系統,所謂喚醒詞或觸發詞就是說的一句話,可以喚醒家裡的語音控制裝置,比如說“Alexa”可以喚醒一個亞馬遜Echo裝置,或用“OK Google”來喚醒Google裝置,用"Hey Siri"來喚醒蘋果裝置,用"好百度"喚醒一個百度裝置。要做到這點,可能需要去掉神經網路的最後一層,然後加入新的輸出節點,但有時可以不只加入一個新節點,或者甚至往的神經網路加入幾個新層,然後把喚醒詞檢測問題的標籤\(y\)喂進去訓練。再次,這取決於有多少資料,可能只需要重新訓練網路的新層,也許需要重新訓練神經網路中更多的層。
那麼遷移學習什麼時候是有意義的呢?遷移學習起作用的場合是,在遷移來源問題中有很多資料,但遷移目標問題沒有那麼多資料。例如,假設影像識別任務中有1百萬個樣本,所以這裡資料相當多。可以學習低層次特徵,可以在神經網路的前面幾層學到如何識別很多有用的特徵。但是對於放射科任務,也許只有一百個樣本,所以的放射學診斷問題資料很少,也許只有100次\(X\)射線掃描,所以從影像識別訓練中學到的很多知識可以遷移,並且真正幫加強放射科識別任務的效能,即使的放射科資料很少。
對於語音識別,也許已經用10,000小時資料訓練過的語言識別系統,所以從這10,000小時資料學到了很多人類聲音的特徵,這資料量其實很多了。但對於觸發字檢測,也許只有1小時資料,所以這資料太小,不能用來擬合很多引數。所以在這種情況下,預先學到很多人類聲音的特徵人類語言的組成部分等等知識,可以幫建立一個很好的喚醒字檢測器,即使的資料集相對較小。對於喚醒詞任務來說,至少資料集要小得多。
所以在這兩種情況下,從資料量很多的問題遷移到資料量相對小的問題。然後反過來的話,遷移學習可能就沒有意義了。比如,用100張圖訓練影像識別系統,然後有100甚至1000張圖用於訓練放射科診斷系統,人們可能會想,為了提升放射科診斷的效能,假設真的希望這個放射科診斷系統做得好,那麼用放射科影像訓練可能比使用貓和狗的影像更有價值,所以這裡(100甚至1000張圖用於訓練放射科診斷系統)的每個樣本價值比這裡(100張圖訓練影像識別系統)要大得多,至少就建立效能良好的放射科系統而言是這樣。所以,如果的放射科資料更多,那麼這100張貓貓狗狗或者隨機物體的圖片肯定不會有太大幫助,因為來自貓狗識別任務中,每一張圖的價值肯定不如一張\(X\)射線掃描圖有價值,對於建立良好的放射科診斷系統而言是這樣。
所以,這是其中一個例子,說明遷移學習可能不會有害,但也別指望這麼做可以帶來有意義的增益。同樣,如果用10小時資料訓練出一個語音識別系統。然後實際上有10個小時甚至更多,比如說50個小時喚醒字檢測的資料,知道遷移學習有可能會有幫助,也可能不會,也許把這10小時資料遷移學習不會有太大壞處,但是也別指望會得到有意義的增益。
所以總結一下,什麼時候遷移學習是有意義的?如果想從任務\(A\)學習並遷移一些知識到任務\(B\),那麼當任務\(A\)和任務\(B\)都有同樣的輸入\(x\)時,遷移學習是有意義的。在第一個例子中,\(A\)和\(B\)的輸入都是影像,在第二個例子中,兩者輸入都是音訊。當任務\(A\)的資料比任務\(B\)多得多時,遷移學習意義更大。所有這些假設的前提都是,希望提高任務\(B\)的效能,因為任務\(B\)每個資料更有價值,對任務\(B\)來說通常任務\(A\)的資料量必須大得多,才有幫助,因為任務\(A\)裡單個樣本的價值沒有比任務\(B\)單個樣本價值大。然後如果覺得任務\(A\)的低層次特徵,可以幫助任務\(B\)的學習,那遷移學習更有意義一些。
而在這兩個前面的例子中,也許學習影像識別教給系統足夠多影像相關的知識,讓它可以進行放射科診斷,也許學習語音識別教給系統足夠多人類語言資訊,能幫助開發觸發字或喚醒字檢測器。
所以總結一下,遷移學習最有用的場合是,如果嘗試最佳化任務B的效能,通常這個任務資料相對較少,例如,在放射科中知道很難收集很多\(X\)射線掃描圖來搭建一個效能良好的放射科診斷系統,所以在這種情況下,可能會找一個相關但不同的任務,如影像識別,其中可能用1百萬張圖片訓練過了,並從中學到很多低層次特徵,所以那也許能幫助網路在任務\(B\)在放射科任務上做得更好,儘管任務\(B\)沒有這麼多資料。遷移學習什麼時候是有意義的?它確實可以顯著提高的學習任務的效能,但有時候也見過有些場合使用遷移學習時,任務\(A\)實際上資料量比任務\(B\)要少,這種情況下增益可能不多。