神經網絡中的參數的求解:前向和反向傳播算法


神經網絡最基本的知識可以參考神經網絡基本知識,基本的東西說的很好了,然后這里講一下神經網絡中的參數的求解方法。

注意前一次的各單元不需要與后一層的偏置節點連線,因為偏置節點不需要有輸入也不需要sigmoid函數得到激活值,或者認為激活值始終是1.


一些變量解釋:

標上“\textstyle +1”的圓圈被稱為偏置節點,也就是截距項.

本例神經網絡有參數 \textstyle (W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}) ,其中 \textstyle W^{(l)}_{ij} (下面的式子中用到)是第 \textstyle l 層第 \textstyle j 單元與第 \textstyle l+1 層第 \textstyle i 單元之間的聯接參數(其實就是連接線上的權重,注意標號順序), \textstyle b^{(l)}_i 是第 \textstyle l+1 層第 \textstyle i 單元的偏置項。

 

\textstyle s_l 表示第 \textstyle l 層的節點數(偏置單元不計在內)

\textstyle a^{(l)}_i 表示第 \textstyle l 層第 \textstyle i 單元的激活值(輸出值)。當 \textstyle l=1 時, \textstyle a^{(1)}_i = x_i ,也就是樣本輸入值的第 \textstyle i 個特征。

 

\textstyle z^{(l)}_i 表示第image層各單元對第 \textstyle l 層第 \textstyle i 單元進行輸入加權和(包括偏置單元),比如, \textstyle  z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i ,所以 \textstyle a^{(l)}_i = f(z^{(l)}_i) ,這里的f(.)就是激活函數,一般是sigmoid函數ec62a4df6800f8c9ea680a08003df5c3

image表示最后的輸出量,如果網絡最終輸出是一個值,那么image就是一個標量,如果最終輸出不止一個值(樣本的label  y也是一個矢量),那么image就是一個矢量。

 


對於上圖:我們有

image

 

cf8cb56750f5aaca7dc59480a53d9676

把這些公式利用向量變成另一中公式形式(激活函數 \textstyle f(\cdot) 也擴展為用向量(分量的形式)來表示,即 \textstyle f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)])為:

image

這也就是我們把wij定義成上面那樣的元素,這樣直接根據wij的標號排成一個矩陣,而不用再變換或轉置之類的了。

假設w和b已知的話,我們根據上兩行的迭代公式不停的迭代就得到了神經網絡里各個單元的激活值\textstyle a^{(l)}_i

上面的計算步驟叫作前向傳播

 

因為我們w和b是不知道的,我們還得要通過訓練學習到這些參數,那么我們怎么訓練得到那?我們知道一些訓練樣本f178249571382c3921d2c46f7abd47da(注意這里里image不一定是一個標量,而是image),我們仍然使用梯度下降法來通過迭代得到收斂后的模型參數值。

我們在每一次迭代中,假設w和b是已知的,然后通過一次前向傳播得到模型中激活值\textstyle a^{(l)}_i

我們根據每一次迭代中模型最后輸出的image跟樣本的標記image做差平方(如果都是矢量的話,做差平方是向量里的各個元素分別對應做差然后平方和),然后求出所有樣本的這些誤差平方和。然后得到每一次迭代的cost function (含L2正則項):

image

雖然這里每一個神經元類似於logistic回歸模型,但是這里cost function中沒用似然函數方法,還是利用的均方誤差。其實這兩種方法得到的結果是一樣的(還記得利用似然函數求得的公式跟均方誤差公式一樣么)。類似的,在L2正則項中,參數不包括偏置參數,也就是常數項那些參數。

模型中如果使用的激活函數是sigmoid函數,那么這個模型最后輸出層里的每個節點輸出的值都在(0,1)之間,那么樣本的標記向量image里的元素就要求在(0,1)之間,所以我們首先要用某種方法轉變樣本的標記范圍(類似標准化,如果模型的激活函數使用的是tanh函數,那么這里就是采用的標准化轉變樣本標記值)(譯者注:也就是 \textstyle y),以保證其范圍為(0,1)之間。

我們有了cost function,接下來我們就需要最小化這個function,我們使用梯度下降法,也就是這倆公式:

image……………………………………………………………………………………………………………………………………………………...(1)

但是我們這時候不能直接對cost function對每一個參數進行求偏導,因為這些參數都是相互關聯的,沒辦法找到顯式的偏導。我們只能曲線救國。我們怎么求偏導呢?我們使用反向傳播算法求得,具體是這樣的:

我們不是一下對整個image操作,而是每一個樣本和通過模型得到的image做差平方,視為小image,也就是image,我們每一次處理一個樣本的cost function,使用反向傳播算法來計算 \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y)\textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y),一旦我們求出每個樣本的該偏導數,就可以推導出整體代價函數 \textstyle J(W,b) 的偏導數:

image………………………………………………………………………………………………………..(2)

 

下面接着說我們怎么求每一個樣本的 \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y)\textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y)

給定一個樣例 \textstyle (x,y),我們首先進行“前向傳導”運算,計算出網絡中所有的激活值,包括 \textstyle h_{W,b}(x) 的輸出值。

 

這時候我們不把單個的\textstyle W^{(l)}_{ij}看成輸入量,而是把每一個單元的所有\textstyle W^{(l)}_{ij}\textstyle b^{(l)}_i疊加和\textstyle z^{(l)}_i看成輸入,於是我們看成image\textstyle z^{(l)}_i求偏導。

求出的偏導分別叫每個單元的“殘差” \textstyle \delta^{(l)}_i,具體如下:

(1)最后一層(輸出層)單元的殘差:

 

我們通過前向傳播算法求出了網絡中所有的激活值\textstyle a^{(l)}_i,這個image也是可以求出來的,比如當\textstyle f(z) 是sigmoid函數,那么d4d5e09ac8e035283671cc03d942f955,所以這個殘差\textstyle \delta^{(l)}_i就求出來了。就是這個cost function  J(W,b;x,y)對求導。

 

(2)接下來我們求 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2  的各個層單元的殘差:

 

先求l= image各單元的殘差:

image

因為image等於image,所以紅框里面就是一個復合函數求導。

倒數第三個到倒數第二個公式 只有k=i的時候求導存在,wij是個系數,所以這一步也很好理解。

最后結果中的image代表的意義是:

然后再乘以image,就是image

 

再求l= image各個層單元的殘差:

將上式中的\textstyle n_l-1\textstyle n_l的關系替換為\textstyle l\textstyle l+1的關系,就可以得到

image

這時候每個單元的殘差就求出來了,接下來計算我們需要的偏導數,計算公式如下:

image

 

求出每個樣本cost function的各個偏導后,我們就能根據公式(2)求出所有整個cost function的各個偏導了。那么再根據公式(1),我們就求出了這一次梯度下降法迭代后的參數,然后我們不停的迭代,最終就找到了參數的收斂值。這里需要強調的是,一開始要將參數進行隨機初始化,不是全部置為 \textstyle 0。如果所有參數都用相同的值作為初始值,那么所有隱藏層單元最終會得到與輸入值有關的、相同的函數(也就是說,對於所有 \textstyle i\textstyle W^{(1)}_{ij}都會取相同的值,那么對於任何輸入 \textstyle x 都會有:\textstyle a^{(2)}_1 = a^{(2)}_2 = a^{(2)}_3 = \ldots )。隨機初始化的目的是使對稱失效。為了求解神經網絡,我們需要將每一個參數 \textstyle W^{(l)}_{ij}\textstyle b^{(l)}_i 初始化為一個很小的、接近零的隨機值(比如說,使用正態分布 \textstyle {Normal}(0,\epsilon^2) 生成的隨機值,其中 \textstyle \epsilon 設置為 \textstyle 0.01

 

 

參考: http://deeplearning.stanford.edu/wiki/index.php/反向傳導算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM