神經網絡的訓練

如何訓練:

既然我們希望網絡的輸出儘可能的接近真正想要預測的值。那麼就可以通過比較當前網絡的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網絡的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義“如何比較預測值和目標值的差異”,這便是損失函數或目標函數(loss function or objective function),用於衡量預測值和目標值的差異的方程。loss function的輸出值(loss)越高表示差異性越大。那神經網絡的訓練就變成了儘可能的縮小loss的過程。
所用的方法是梯度下降(Gradient descent):通過使loss值向當前點對應梯度的反方向不斷移動,來降低loss。一次移動多少是由學習速率(learning rate)來控制的。

 

梯度下降的問題:

然而使用梯度下降訓練神經網絡擁有兩個主要難題。

 

1、局部極小值

梯度下降尋找的是loss function的局部極小值,而我們想要全局最小值。如下圖所示,我們希望loss值可以降低到右側深藍色的最低點,但loss有可能“卡”在左側的局部極小值中。

                       

試圖解決“卡在局部極小值”問題的方法分兩大類:

  • 調節步伐:調節學習速率,使每一次的更新“步伐”不同。常用方法有:
  • 隨機梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個樣本所計算的梯度
  • 小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計算的梯度的平均值
  • 動量(Momentum):不僅僅考慮當前樣本所計算的梯度;Nesterov動量(Nesterov Momentum):Momentum的改進
  • Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率,部分也綜合動量
  • 優化起點:合理初始化權重(weights initialization)、預訓練網絡(pre-train),使網絡獲得一個較好的“起始點”,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分佈初始權重(Gaussian distribution)、均勻分佈初始權重(Uniform distribution)、Glorot 初始權重、He初始權、稀疏矩陣初始權重(sparse matrix)

2、梯度的計算

機器學習所處理的數據都是高維數據,該如何快速計算梯度、而不是以年來計算。
其次如何更新隱藏層的權重?
解決方法是:計算圖:反向傳播算法
這裏的解釋留給非常棒的Computational Graphs: Backpropagation
需要知道的是,反向傳播算法是求梯度的一種方法。如同快速傅里葉變換(FFT)的貢獻。
而計算圖的概念又使梯度的計算更加合理方便。

 

基本流程圖:

下面就結合圖簡單瀏覽一下訓練和識別過程,並描述各個部分的作用。要結合圖解閱讀以下內容。但手機顯示的圖過小,最好用電腦打開

     

 

  • 收集訓練集(train data):也就是同時有input以及對應label的數據。每個數據叫做訓練樣本(sample)。label也叫target,也是機器學習中最貴的部分。上圖表示的是我的數據庫。假設input本別是x的維度是39,label的維度是48。
  • 設計網絡結構(architecture):確定層數、每一隱藏層的節點數和激活函數,以及輸出層的激活函數和損失函數。上圖用的是兩層隱藏層(最後一層是輸出層)。隱藏層所用激活函數a( )是ReLu,輸出層的激活函數是線性linear(也可看成是沒有激活函數)。隱藏層都是1000節點。損失函數L( )是用於比較距離MSE:mean((output - target)^2)。MSE越小表示預測效果越好。訓練過程就是不斷減小MSE的過程。到此所有數據的維度都已確定:
    • 訓練數據:input \in R^{39} ;label \in R^{48}
    • 權重矩陣:W_{h1}\in R^{1000x39};W_{h2}\in R^{1000x1000} ;W_{o}\in R^{48x1000}
    • 偏移向量:b_{h1}\in R^{1000};b_{h2}\in R^{1000} ;b_{o}\in R^{48}
    • 網絡輸出:output \in R^{48}

 

  • 數據預處理(preprocessing):將所有樣本的input和label處理成能夠使用神經網絡的數據,label的值域符合激活函數的值域。並簡單優化數據以便讓訓練易於收斂。比如中心化(mean subtraction)、歸一化(normalization)、主成分分析(PCA)、白化(whitening)。假設上圖的input和output全都經過了中心化和歸一化。
  • 權重初始化(weights initialization)W_{h1},W_{h2},W_{0}在訓練前不能爲空,要初始化才能夠計算loss從而來降低。W_{h1},W_{h2},W_{0}初始化決定了loss在loss function中從哪個點開始作爲起點訓練網絡。上圖用均勻分佈初始權重(Uniform distribution)。
  • 訓練網絡(training):訓練過程就是用訓練數據的input經過網絡計算出output,再和label計算出loss,再計算出gradients來更新weights的過程。
    • 正向傳遞:,算當前網絡的預測值output =linear (W_{o} \cdot Relu(W_{h2}\cdot Relu(W_{h1}\cdot input+b_{h1})+b_{h2}) +b_{o})
    • 計算loss:loss = mean((output - target)^2)
    • 計算梯度:從loss開始反向傳播計算每個參數(parameters)對應的梯度(gradients)。這裏用Stochastic Gradient Descent (SGD) 來計算梯度,即每次更新所計算的梯度都是從一個樣本計算出來的。傳統的方法Gradient Descent是正向傳遞所有樣本來計算梯度。SGD的方法來計算梯度的話,loss function的形狀如下圖所示會有變化,這樣在更新中就有可能“跳出”局部最小值。

                                          

 

    • 更新權重:這裏用最簡單的方法來更新,即所有參數都 W = W - learningrate * gradient
    • 預測新值:訓練過所有樣本後,打亂樣本順序再次訓練若干次。訓練完畢後,當再來新的數據input,就可以利用訓練的網絡來預測了。這時的output就是效果很好的預測值了。下圖是一張實際值預測值的三組對比圖。輸出數據是48維,這裏只取1個維度來畫圖。藍色的是實際值,綠色的是預測值。最上方的是訓練數據的對比圖,而下方的兩行是神經網絡模型從未見過的數據預測對比圖。(不過這裏用的是RNN,主要是爲了讓大家感受一下效果)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章