屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...
一、參數初始化的重要性
參數初始化又稱為權重初始化(weight initialization)或權值初始化。深度學習模型訓練過程的本質是對weight(即參數 W)進行更新,這需要每個參數有相應的初始值。說白了,神經網絡其實就是對權重參數w不停地迭代更新,以達到較好的性能。
模型權重的初始化對于網絡的訓練很重要,不好的初始化參數會導致梯度傳播問題,降低訓練速度;而好的初始化參數能夠加速收斂,并且更可能找到較優解。如果權重一開始很小,信號到達最后也會很小;如果權重一開始很大,信號到達最后也會很大。
不合適的權重初始化會使得隱藏層數據的方差過大(例如,隨著輸入數據量的增長,隨機初始化的神經元的輸出數據的分布中的方差也增大),從而在經過sigmoid這種非線性層時離中心較遠(導數接近0),因此過早地出現梯度消失。
但是對于其他的方法,輸入的數據經過多層神經網絡,數據分布的方差可能會越來越大,也可能會越來越小。這主要取決于當前層的參數量和初始權重的分布情況。對于一個多層的網絡,某一層的方差可以用累積的形式表達:
在深度學習中,神經網絡的權重初始化方法對對模型的收斂速度和性能有著至關重要的影響。在深度神經網絡中,隨著層數的增多,我們在梯度下降的過程中,極易出現梯度消失或者梯度爆炸。一個好的權重初始化雖然不能完全解決梯度消失和梯度爆炸的問題,但是對于處理這兩個問題是有很大的幫助的,并且十分有利于模型性能和收斂速度,在某些網絡結構中甚至能夠提高準確率。因此,對權重w的初始化則顯得至關重要。
二、常見的參數(權重)初始化方法
1. 全零初始化
我們在線性回歸,logistics回歸的時候,基本上都是把參數初始化為0,我們的模型也能夠很好的工作。然后在神經網絡中,把
初始化為0是不可以的。這是因為如果把 初始化0,那么每一層的神經元學到的東西都是一樣的(輸出是一樣的),而且在BP的時候,每一層內的神經元也是相同的,因為他們的gradient相同,weight update也相同。這顯然是一個不可接受的結果。2. 隨機初始化
隨機初始化是很多人經常使用的方法,一般初始化的權重為高斯或均勻分布中隨機抽取的值。然而這是有弊端的,一旦隨機分布選擇不當,就會導致網絡優化陷入困境。
把權重初始化為較小的值,如均值為0,方差為0.01的高斯分布:
w隨著層數的增加,我們看到輸出值迅速向0靠攏,在后幾層中,幾乎所有的輸出值 x 都很接近0。高斯初始化,給權重較小的值,這種更新方式在小型網絡中很常見,然而當網絡deep的時候,會出現梯度消失的情況。
但是如果把權重初始成一個比較大的值,如均值為0,方差為1的高斯分布:
w = np.random.randn(node_in, node_out) * 1.0幾乎所有的值集中在-1或1附近,則會造成前向傳播時,神經元要么被抑制,要么被飽和。當神經網絡的層數增多時,會發現越往后面的層的激活函數(tanh在-1和1附近的gradient都接近0)的輸出值幾乎都接近于0。梯度更新時,梯度非常接近于0,就會導致梯度消失。
3. Xavier初始化
Xavier初始化可以幫助減少梯度消失的問題,使得信號在神經網絡中可以傳遞得更深,在經過多層神經元后保持在合理的范圍(不至于太小或太大)。
Xavier初始化的基本思想:保持輸入和輸出的方差一致(服從相同的分布),這樣就避免了所有輸出值都趨向于0。
根據輸入和輸出神經元的數量自動決定初始化的范圍:定義參數所在的層的輸入維度為
,輸出維度為 ,那么參數將從 均勻分布中采樣。注意,為了問題的簡便,Xavier初始化的推導過程是基于線性函數的(假設激活函數是線性的)。
w = np.random.randn(node_in, node_out) / np.sqrt(node_in)能夠看出,深層的激活函數輸出值還是非常漂亮的服從標準高斯分布。雖然Xavier initialization能夠很好的 tanh 激活函數,但是對于目前神經網絡中最常用的 ReLU 激活函數,還是無能能力,請看下圖:
前面看起來還不錯,后面的趨勢卻是越來越接近0,更深層的話就會很明顯。Xavier初始化主要用于tanh,不適用于ReLU。
4. He initialization(MSRA)
為了解決上面的問題,何愷明大神提出了一種針對ReLU的初始化方法,一般稱作 He initialization 或 MSRA。論文鏈接:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
主要想要解決的問題是由于經過relu后,方差會發生變化,因此我們初始化權值的方法也應該變化。只考慮輸入個數時,MSRA初始化是一個均值為0,方差為2/n的高斯分布:
He initialization的思想是:在ReLU網絡中,假定每一層有一半的神經元被激活,另一半為0(x負半軸中是不激活的),所以要保持variance不變,只需要在Xavier的基礎上再除以2:
w = np.random.randn(node_in, node_out) / np.sqrt(node_in/2)效果是比Xavier initialization好很多。現在神經網絡中,隱藏層常使用ReLU,權重初始化常用He initialization這種方法。
5. Batch Normalization Layer
在網絡中間層中使用 Batch Normalization 層一定程度上能夠減緩對較好的網絡參數初始化的依賴,使用方差較小的參數分布即可。
關于Batch Normalization(BN)的詳細內容可以參考我之前的文章——常用的 Normalization 方法:BN、LN、IN、GN
【隨機初始化,無Batch Normalization】
w = tf.Variable(np.random.randn( node_in, node_out)) * 0.01 ... fc = tf.nn.relu(fc)【隨機初始化,有Batch Normalization】
w = tf.Variable(np.random.randn( node_in, node_out)) * 0.01 ... fc = tf.contrib.layers.batch_norm(fc,center = True, scale = True,is_training = True) fc = tf.nn.relu(fc)很容易看到,Batch Normalization的效果非常好,推薦使用。
6. pre-training (“鍋甩給別人,機智地一匹” )
初始化這個問題明顯比較麻煩,不然大家也不會這么喜歡用pre-training模型了。
pre-training是早期訓練神經網絡的有效初始化方法,一個便于理解的例子是先使用greedy layerwise auto-encoder做unsupervised pre-training,然后再做fine-tuning。
pre-training階段:將神經網絡中的每一層取出,構造一個auto-encoder做訓練,使得輸入層和輸出層保持一致。在這一過程中,參數得以更新,形成初始值。
fine-tuning階段:將pre-train過的每一層放回神經網絡,利用pre-train階段得到的參數初始值和訓練數據對模型進行整體調整。在這一過程中,參數進一步被更新,形成最終模型。
隨著數據量的增加以及activation function 的發展,pre-training的概念已經漸漸發生變化。目前,從零開始訓練神經網絡時我們也很少采用auto-encoder進行pre-training,而是直奔主題做模型訓練。如果不想從零開始訓練神經網絡時,我們往往選擇一個已經在任務A上訓練好的模型(稱為pre-trained model),將其放在任務B上做模型調整(稱為fine-tuning)。
三、總結
1. 當前的主流初始化方式 Xavier,MSRA 主要是為了保持每層的輸入與輸出方差相等, 而參數的分布采用均勻分布或高斯分布都行。
2. 在廣泛采用 Batch Normalization 的情況下,使用普通的小方差的高斯分布即可。
3. 在遷移學習的情況下,優先采用預訓練的模型進行參數初始化。
總結
以上是生活随笔為你收集整理的屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有没有非金属的烤瓷牙吗
- 下一篇: 烤瓷牙和种植牙的优缺点