先總結上一篇:

上一篇mnist入門例子,講述的是給出已知圖片集,經過訓練後,可以識別出圖片集中任意一張圖片是什麼數字。有兩個問題需溫故,一是經過訓練後,為什麼可以程序自己識別圖片?二是怎麼訓練的?

答案是經過訓練後,得到並存儲了權矩陣W(10*784)和偏置量矩陣B(10*1)的值,當給定一張需識別的圖片時,程序會運用W和B去計算該圖片的每個象素點,得到識別結果,從每個識別結果中選取概率最大的一個,即得到圖片的數字。至於怎麼訓練的,上一篇並沒詳述,有的只是Tensorflow的一句話train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) ,這裡指定了運用梯度下降演算法去訓練,該演算法也正是這篇文章討論的話題。

感慨下:

前幾天包括週末看了下CNN卷積神經網路,沒有去細細研究,畢竟卷積神經網路在圖片處理方面用的成熟。我目前還沒研究圖像識別,反而比較緊迫的是聊天機器人項目,所以往RNN方向走。RNN比CNN要難,RNN難在循環需要開闢一個巨大的權值矩陣來存儲當前情況的前一個條件是啥,這個新加的邏輯嚴重影響建模複雜度。以及我現在正在看的lstm,如何處理長短記憶問題,更覺得lstm更難,但我竟然沒放棄!我是不是我中毒了?

分兩塊講,「神經網路」和「BP反向傳播」,必備知識如下:

1)求和,矩陣加法和乘法,E^T代表E矩陣的轉置

2)常用函數的導數,複合函數(鏈式法則)的偏導數,以及梯度

a. 假設一維函數 f(x)=(a-x)^2 / 2

則f對x的導數 f`(x)=-(a-x)

b. 假設n維函數 f(X)=a1*x1+a2*x2+...+ai*xi+...+an*xn ,其中矩陣 X=(x1,x2,...xi,...xn)

則f對第i維xi的偏導數 f`(xi)=ai

c. 假設有標量變數x,且有 s=a*xt=f(s)=s^b ,且有矩陣C=(c1*t,c2*t,...ci*t,...cn*t) ,如果y=d1*C(1)+d2*C(2)+...+di*C(i)+...+dn*C(n),則通過鏈式法則,可求y對x的導數 y`(x)=s`(x)*t`(s)*C`(t)*y`(A)=a*b(ax)^(b-1)*(c1*d1+c2*d2+...ci*di+...+cn*dn)

此處變換高度概括就是把初始變數x經過一維線性縮放a,再經過一維非線性變換b,再經過一對多多維線性投影C,再經過多對一線性聚集到y,然後求y對x的導數,導數是變化率,自然每一步都影響著變化率,因此藉助鏈式法則求之(實際應用中多用偏導符號,但偏導符號不知怎麼打出來)。

d. 至於梯度,針對三維空間會比較好解釋,假設三維曲面上有個點A,且假設可以針對該點作出一個切平面,然後可作出n條經過A點且在切平面內的直線。所有直線中,斜率值最大的那個就是梯度值,也即自變數沿著該方向移動,函數值有最大變化量。就像一個人置身於半山坡A點,想最快走下山腳,如果計算機處理該問題,那麼計算機首先圍繞A點所在的切平面,旋轉360度,依次求得各方向的斜率值,沿著斜率值最大方向的反方向每次等間距的行走一小段距離,然後依次重複該步驟,即可快速到達谷底(除非到達局部最低點,這個問題不在本文討論範疇,另外為啥不是斜率最小值,而是斜率最大值的反向向?可以自己意會)。

3)基於矩陣的一對多以及多對一映射的偏導數

矩陣只是一種描述數值的工具,尤其對於離散值集合而言,個人感覺再也找不到比矩陣更好的描述工具了,除非自己創造一種新的描述工具。所以矩陣的偏導,即矩陣中每個值對自變數的偏導並滿足上述鏈式法則。矩陣維度變換的運算,有點類似分解(投影)與合成(聚焦)的原理。

一、神經網路

先上張圖如下(此文所有圖均原創),用美顏相機拍的但還是模糊,大家可放大看,圖中複雜的符號和下標真的不複雜,只要想看就一定看得懂。

這是個簡單的神經網路,暫時沒考慮偏置量,一共有n層,由X開始到f函數結束算一層,每層先把X當成輸入向量,向量的每個元素跟權矩陣W相乘,然後求和,得到向量P,我們把P當成神經元向量或者隱藏層向量,再把向量P的每個元素值作自變數,加上f函數,得到下一層的輸入X (由於第一層是輸入層,為了特別標識,第一層的X上標寫成了0,所以X^(0),W^(1),P^(1)共同組成第一層,依此類推,後面層的X上標依然會比W和P的上標小1)。每層的X,W,P元素個數不一樣,圖中畫成4個而已,圖中下標代表第幾個,可以看到第一層有n0個輸入,第k層的P下標是nk,意味著第k層有nk個神經元,這nk個神經元的第i個和第k+1層的第i個,這裡的兩個i大小不一致,本來我應該寫成i(k)和i(k+1)的,跟n(k)和n(k+1)一樣寫法但更難看。圖中nk和nk+1沒帶括弧,因為下標的n比k和k+1寫的更大所以能區分開,但是這裡寫文章很難區分,所以加個括弧。圖中還可得知,P^(k)的元素個數和X^(k)的個數相同,即第k層的神經元個數P和第k+1層的輸入X個數相同,因為他們相對應元素之間只用了一個非線性函數f作映射。圖中E和f是求和操作和函數映射操作。

舉例說明上下標的意思,^代表上標,下述k值均小於n,因一共才n層:

X^(0)代表第1層,即輸入層的向量,大小是1 * n0,它有n0個元素

X^(0)(n0)代表第1層向量的第n0個元素值,X^(0)(i)代表第1層向量的第i個元素值

X^(k)代表第k+1層的輸入向量,大小是1 * nk,它有nk個元素

X^(k)(i)代表第k+1層向量的第i個值,注意各層之間的i值不相等,i只是一個標記

W^(1)代表第1層的權矩陣,大小是n0 * n1,W^(1)(i,j)代表第一層權矩陣的第i行第j列值

W^(k)代表第k層的權矩陣,大小是n(k-1) * nk,有n(k-1) * nk個值,即圖中密集連線的條數

(0)W代表初始化的所有權值,(0)W^(k)代表第k層的初始權值矩陣,大小n(k-1) * nk,(0)W^(k)(i,j)代表初始化時第k層權矩陣的第i行第j列值

(s)W代表訓練s個樣本集後的所有權值,(s)W^(k)代表第k層的經s步訓練之後的權值矩陣,大小n(k-1) * nk,(s)W^(k)(i,j)代表經訓練s步之後第k層權矩陣的第i行第j列值

P^(1)代表第1層的神經元向量,大小是1 * n1,它一共有n1個元素值,P^(1)(i)代表第1層神經元的第i個值

P^(k)代表第k層的權矩陣,大小是1 * nk,一共有nk個元素值,P^(k)(i)代表第k層神經元的第i個值

好了上車!

神經元網路可以用下面我總結出來的這3個式子高度概括(暫時沒把偏置量加進去):

f=1 /(1+e^(-x))

E=Y-f( (...( f( f(X^0 * W^1 ) * W^2) * W^3 )...) * W^n)

min=(E^T * E) / 2

上面Y是輸入樣本X的真實結果向量,比如輸入一張圖片,X是圖片的像素點,Y是圖片的真實數字,省略號是神經元層數,^T代表上標是T,即矩陣的轉置。神經網路訓練一個樣本的過程就是把樣本值套入上述公式,BP反向傳播是一個演算法,用該演算法求解數學問題:求W^1,W^2...W^i...的各元素值,使得min值最小。由此可知,神經網路簡要說就是:建立一套簡單模型(如上圖模型),求得所有權係數和偏置量,使得樣本數據的輸入經過該模型,並基於這些權係數和偏置量計算之後得到的輸出,跟樣本真實輸出值無限逼近。

二、BP反向傳播

由上一段分析可知,BP反向傳播只是一種求解上述數學問題的方法,接下來我演算怎麼求解。我們假設初始化的所有權係數為(0)W,我們要做的是輸入一個樣本後,得到輸出值和真實值得誤差E(0),用該誤差對(0)W求導數,以此求得梯度D(1)。我們設定一個步長u,表示每次調整的幅度,那麼經過第一次訓練後的權值矩陣更新為(1)W=(0)W-u*D(1),以此類推,每訓練一個樣本就按照該公式調整W,直到最後輸入一個樣本時,計算出來的結果和真實結果的誤差E等於一個能容忍的值。於是可以認為該訓練後的模型滿足業務需求,針對任何輸入都可以智能的輸出結果。所以針對第s步,我們有(s+1)W=(s)W-u*D(s)。

u可以假設一個已知常量,比如0.01,這個值很大程度決定了訓練的效率。問題的關鍵之處在於求梯度,即導數得最大值,而該導數是基於多維向量的偏導數,所以我們需要把誤差攤到權係數的每一個分量W*(k)(i,j)中,這需要用到偏導數和鏈式法則。

如上圖針對W^(n-1)(j,i)這個第n-1層的第j行第i列的權係數值,我們根據圖中箭頭方向,首先X^(n-2)(j) * W^(n-1)(j,i),再加上其他跟W^(n-1)(j,i)無關的量,可得到P^(n-1)(i);對P^(n-1)(i)作非線性函數f變換,得到X^(n-1)(i);針對該值,又被映射到P^(n)向量的每個元素中,該向量共有nn個值,P^(n)向量的每個值再經過非線性函數f變換,得到輸出值y向量(注意y被加粗了,表示一個向量),該向量包含nn個值。用得到的向量跟真實的樣本的結果集Y向量按如下公式求誤差E,(1/2是為了求導時能把係數消掉):

於是可以用E對模型中各層的各權係數W^(k)(i,j)求偏導,一共有n層,剛才舉例的是第n-1層,所以接下來可以求得對第n-2層的偏導...依此反向求偏導,直到第1層,所以叫做BP反向傳播。其中推導演算法中極其重要的一個值是E對各層神經元P^(k)的偏導,該值是一個向量,可以作為鏈式法則中的連接因子,也有點不完全歸納法歸納因子的韻味。主要分兩步,第一步求E對第n層的權矩陣W^(n),第二步求第n-1層的權矩陣W^(n-1),到時規律就出來了,具體求解過程中很多符號,不便於電腦打字,所以直接上我的手寫演算步驟:

第一步,先算E對第n層的權矩陣更新公式

第二部分,求n-1層的權矩陣更新公式,順便得到第k層的更新公式

通過上圖通用公式,可以從第n層依次往第一層進行權值數據的迭代更新,也因此得名叫BP反向傳播演算法。


推薦閱讀:
相關文章