在深度學習領域,預訓練有一定作用的本質原因是什麼?
請問根本理論是什麼?
剛好有一篇理論文章可以部分解答這個問題:
Exact solutions to the nonlinear dynamics of learning in deep linear neural networks?arxiv.org我們先把研究對象放在非常簡單的線性網路動力學上面,獲得一個比較嚴格的解,希望從中獲得一些啟發(類比到非線性網路)。
這篇文章給出的答案是:如果(且僅當)輸入的統計結構與要學習的輸入-輸出映射的結構一致時,無監督的預訓練可以幫助後續的監督學習任務。
我們來看具體如何得到:
動力學方程
考慮一個三層的線性網路:
很自然,我們有方程
其中,
為了簡化參數的動力學方程,我們將輸入白化(whiten):
其中
此時動力學方程被改寫成:
新的矩陣
動力學的解
至此我們獲得了動力學方程(5)。這組動力學方程可以寫成一個能量的梯度下降,這個能量方程為:
分析這個能量方程,我們可以獲得非常重要的信息。由於是梯度下降,所以能量越低越好。第一項要求
通過分析分析方程的固定點(fixed-point):
而其餘的固定點都是鞍點(saddle point)。因此,當學習收斂時,網路將表示最接近真實輸入-輸出相關矩陣的
預訓練和初始化
由於方程(5)對於任意的初始條件並不好解,我們考慮其中容易解的初始化:
其中
其中不同的曲線族為不同
現在我們來看預訓練做了什麼:
由於預訓練中,輸出就是輸入,此時的輸入輸出關聯矩陣和輸入關聯矩陣是一樣的。所以SVD分解就變成
在預訓練中,由於訓練時間有限,最終
所以我們有
然而,當從小的隨機權重開始時,每個權重矩陣最終將對整個映射做出大致平衡的貢獻。這種平衡對應於
對比上面的公式(1),我們發現預訓練可以達到解耦的(decouped)初始化僅僅需要滿足:
如果(且僅當)輸入的統計結構與要學習的輸入-輸出映射的結構一致時,無監督的前訓練可以幫助後續的監督學習任務,這是一個直觀概念的精確量化實例。
從實驗角度而言,我們需要驗證
左圖為MNIST
我們注意到,這種分析不太可能完全適用於非線性網路。一些非線性網路在初始化後是近似線性的(例如tanh非線性),因此我們的解可以在學習的早期很好地描述這些動態。然而,當網路進入非線性狀態時,我們的解不應該期望保持精確。
希望這個回答可以幫助大家對這個問題有個更好的理解~
我覺得預訓練很多模型能work的根本原因就是引入了更多的信息吧。
cv的imagenet預訓練也好,nlp的word2vec預訓練也好,包括最近非常火的graph embedding對實體進行向量表徵也好,都是從模型數據本身之外引入了大量的信息(來自大規模預訓練數據集),這個思路其實不止預訓練,只要模型合理的利用了新的信息,能夠work不是水到渠成的事情嗎?比如cw2vec在詞之外引入了筆畫信息和n-gram信息,只要用的好,理論上應該都是有提升的。
因為深度學習模型並不完全是個黑箱子,在模型設計的時候,網路層所承擔的作用,是有模式的。雖然不可能精確到說每一層網路層是做什麼的,但是中間層在幹什麼,大體還是知道的。網路層的模式,可以被複用。
其次,深度學習的學習,本質上還是機器對於數據的一種歸納總結,深度學習這種數據大殺器,要的就是見多識廣,而常用來作為預訓練數據集的ImageNet,無論是在圖像數量還是類別上,其實都比我們想像的要豐富。
遷移ImageNet上預訓練的模型到無人駕駛應用上一般會有好的效果,因為ImageNet是一個種類龐大的數據集,且在ImageNet上訓練的模型,已經見過了道路、車輛等與自動駕駛任務相關的場景
當然這並不是說遷移學習怎麼用怎麼好。比如在無人駕駛中,識別車道線和車輛是很常見的任務,但是預訓練了其中一個任務的模型,再遷移到另一個任務上時,表現卻不一定就好。(想想這是為什麼?)
所以,回到本質上,預訓練要想有作用,得看兩件事 ——數據量大小,數據相似度
而在遷移預訓練模型這件事情上,一般採取以下策略:
1. 數據量小,數據相似度高
Fine tune the output dense layer of the pretrained model
2. 數據量大,數據相似度高
Fine tune the pretrained model
3. 數據量小,數據相似度低
Fine tune the lower layers of the pretrained model
4. 數據量大,數據相似度低
Train the model from scratch
最後,最後的最後,預訓練模型至少給迷茫的深度學習模型提供了一個不錯的初始參數,看成是一種參數初始化的方式也無妨。
這個這個問題也一直使我感到疑惑和驚訝。我的圖片數據集和ImageNet差別很大,但是使用在ImageNet上預訓練的權值進行微調卻得到了不錯的效果。我想可能是1.ImageNet囊括了非常多的不同類別的數據,這些數據有各種各樣淺層和深層的特徵,在ImageNet上訓練好的權值很好的提取到了這些特徵。
2.不同圖片數據之間或多或少都存在共性,包括我們能看到和看不到的,因此在ImageNet上的權值能提取到我的圖片數據集上的這些共性特徵。
3.ImageNet上特徵在別的數據集上可能是不同的表現形式,用ImageNet上預訓練的權值在我的圖片數據集上提取到的這些特徵剛好有一些特徵可以很好地區分我的圖片數據集中的圖片,當然也有一些提取到的特徵可能對區分我的圖片根本沒有用,但是沒有進一步實驗研究哪些權值對我的數據集有用哪些有用。
如果從底層邏輯來看,deep network很大的困境就是難以收斂,預訓練可以看成是一個較為完備的參數初始化過程,盡量使網路不要因為不好的初始化而無法訓練收斂。
更加抽象一些的說法就是,通過ImageNet訓練之後,你的模型本身「特徵抽取」的能力已經具備,接下來就是根據具體任務數據對模型的「判別能力」做調整,使其適應不同的任務。
推薦閱讀: