如題,比如我用vgg16作為預訓練模型,除了修改最後的全連接層,我還想讓第一層的卷積層參數進行更新。為什麼一般沒有人進行這麼做呢,前層和後層的區別在哪裡?

我自己做了個實驗,發現修改第一層參數後的模型,它的準確率和只修改最終全連接層不相上下(有時候低比較多)。

我想改第一層的原因是因為我導師的方向是模型安全,所以想找出一種方法來防禦一種攻擊。


遷移學習一般針對的是目標任務訓練數據較少的情況,因為如果目標任務訓練數據較多,直接訓練就可以了。目標訓練集的訓練樣本少,就要注意避免過擬合的問題。如果開放全部的網路參數進行訓練,那麼就很容易陷入對目標訓練集的過擬合狀態,從而降低模型的泛化性能。網路的前幾層一般都是來進行特徵的提取和抽像的,如果源任務和目標任務差別不是很大,而且模型在源任務中已經取得了較好的效果,那麼就沒有必要再對其進行訓練了。關於fine-tune的時候,固定哪些層,訓練哪些層有著比較廣泛的討論,在CVPR2019有一篇文章,使用增強學習的方法來生成fine-tune策略,想法很不錯,可能會對題主有一些幫助,如果感興趣可以瀏覽一下。

SpotTune: Transfer Learning through Adaptive Fine-tuning


這是實踐中檢驗的結果吧,我記得語音處理領域中的的遷移學習控制的是後面層的,前面層進行訓練。


不請自來,說說我的看法,嘻嘻

1.首先之所以叫遷移學習,那肯定是需要將以前學習到的知識遷移到新的問題上,才叫遷移學習。而網路所學習到的知識體現在網路參數上面(如果你用nas的話,網路結構也算),如果你把高層-底層的全訓練了,那就不叫遷移了。

2. 在「how transferable are features in deep neural networks」這篇論文中,yosinski他們用實驗證明瞭,舊網路學習到的底層特徵是比較通用的(比如第一層學習到的特徵與garbor濾波器很像,這種底層濾波器是通用的),恰當的利用會提高網路的泛化性能,而高層特徵是比較task-specific的,所以需要根據任務變化來進行微調。


那不然做遷移學習的意義在哪(手動狗頭),可以參考ACL2019的一篇文章《what does BERT learn 。。。》就是揭示了BERT網路架構從低層到深層,低層學習的是圖片的通用特徵(比如線條邊緣啥的)或者文本的通用單詞特徵,再往裡面走就是學比如句子語義特徵,最深層就是學的段落特徵。我覺得這也是遷移學習的一個驅動點所在吧,既然現在面臨的很多時候都是小樣本或者需要學習的參數很多,而低層的特徵對於同一個任務裡面來說又都相似,所以直接用訓練好的模型然後針對具體任務場景修改深層參數能夠更快更高效的完成任務。至於題主說的模型安全我也不是很瞭解,好像AAAI和ICLR2019都有關於圖神經網路來對抗攻擊的文章題主可以看一下~


我自己的理解是,神經網路實際最終就是表示學習,一層層的最終提取表示對象的特徵,一般第一層的提取是最初的提取,還是屬於對原對象的初步抽象,所以不會有太大差別,後面幾層纔是抽象出來足以區別類別的特徵,所以,調節第一層的參數對於最後結果的影響必定不大。哈,缺乏理論公式表示的直觀理解。


對於計算機視覺應用而言, 模型提取的底層特徵是圖像的低級特徵, 如邊緣等, 這些特徵是通用的; 模型提取的高層特徵則具有特定的語義, 是與具體任務相關的.

遷移學習一般是將大規模數據訓練的模型向相關任務上遷移, 且這個相關任務只有少量的訓練數據. 因為大規模數據訓練的模型提取的底層特徵的泛化能力更高, 所以一般凍結底層權重, 又因為是不同的任務, 所以要放開高層權重.


神經網路可以理解為複合函數,你訓練的話,肯定是需要用反向傳播演算法的:

如果你的梯度是逐層傳播的,很有可能梯度傳到前面,梯度就消失了,這樣就難以訓練這個神經網路了;

如果你直接把梯度作用於前面的層的話,前面參數比較小的變化就會引起最後的損失爆炸,有點像蝴蝶效應的感覺,同樣也難以訓練。

有的遷移學習,比如原來100個分類,現在變成120個分類,那麼就直接改最後一層的節點——從100個節點變為120個節點,並計算新的交叉熵損失。


對遷移學習瞭解較少,在此分享自己的看法,同時向大家請教。

如果把網路學習過程看成從低級特徵提取到高級特徵提取的過程的話。那麼不改變前面層參數,就是保持學習到的低級特徵不變。

就計算機視覺而言,低級特徵就是點、線、面。可以粗略的認為視覺對象都是由點、線、面構成的。所以,不訓練前面層參數可以認為這些較為簡單的低級特徵可以被很好的掌握,而我們只需要改變他們的組合方式從而形成不同的高級語義(遷移)就好了。另一方面就是避免過擬合,因為一般遷移學習是因為目標域樣本不多,所以如果我們過分學習目標域的點、線、面,很可能導致這不完備的點線面沒法兒組合成更豐富的視覺對象。

那如果就語音來說,是不是應該去微調前面幾層呢?在此拋出我的疑問,向大家請教。舉個例子,中文的「蘋果」和英文的「apple」表達同一個高級語義,但是他們的表達方式不同。如果這裡做一個語言的遷移,是否應該保持高級語義不變,而去微調錶達方式呢?


神經網路前面的層和後面的層可以分別看作特徵提取器和分類器,它們的參數可以看作模型學到的知識,前者的知識通用性更好。一般用遷移學習的任務是數據量不充分的,此時如果訓練整個模型會導致過擬合。那為什麼一般不訓練前面的參數而不是不訓練後面的參數呢?

相似的任務可以使用相似的特徵,只要分類器重新訓練就好。比如對人劃分為貧窮、小康、富裕三類時,特徵提取器學到了年齡、性別、職業、工作單位、月均消費、家庭地址等特徵(舉這幾個例子是為了人容易理解,實際上神經網路學到的是人很難直觀理解的特徵,但本質都是特徵),分類器可以根據這些特徵進行分類。這個模型訓練好之後,如果我想對人的學歷進行分類,比如研究生、本科、高中及以下,同樣可以使用剛剛的特徵提取器,因為它提取的特徵依然有用。但是剛剛的分類器知識跟具體任務關聯緊密,所以需要重新訓練。


遷移學習的目的是用大數據集訓練好的模型參數來微調新的任務,vgg這種前面幾層的參數在大數據集上訓練好的參數已經具備良好的特徵提取的功能了,所以只需要修改後面幾層針對新任務進行少量數據訓練就能取得不錯的結果


前面層的神經網路用來特徵提取,一般情況是當你訓練集比較小是用遷移學習,可以防止過擬合。假如原來網路在之前訓練的數據集上能有不錯的結果,而你的數據集特徵包含在之前數據集的特徵裡面,那特徵提取部分就可以拿過來直接用,只訓練分類部分的參數即可。


基於參數的遷移學習就是要利用源域和目標域的共同參數,先用源域數據只訓練網路前面幾層或者後面幾層,然後用目標域數據對其他層進行優化,都是可以的。但是針對不同數據效果差別可能比較大。


我說說我的個人理解,不一定準確。首先遷移學習本身就是在相似的任務之間進行知識的遷移;更形象地,可以把知識看作是「磚」,這些「磚」通過不同的組合可以變為不同風格的建築。而神經網路的學習其實就是通過各種參數來擬合輸入對應的真實值,且它的學習是循序漸進的,從最簡單的特徵(抽象的特徵)逐漸到複雜的特徵(具象的特徵),例如CNN對圖像的處理;這些最簡單的特徵有時候是通用的,尤其是在相似任務之間表現的更加明顯。最後,我一直覺得圖像處理時的預訓練+微調其實就是遷移學習。


推薦閱讀:
相關文章