本文主要介紹多層感知器模型(MLP),它也可以看成是一種logister迴歸,輸入層通過非線性轉換,即通過隱含層把輸入投影到線性可分的空間中。
如果我們在中間加一層神經元作爲隱含層,則它的結構如下圖所示
單隱層的MLP定義了一個映射: ,其中 D和L爲輸入向量和輸出向量f(x)的大小。
隱含層與輸出層神經元的值通過激活函數計算出來,例如下圖:如果我們選用sigmoid作爲激活函數,輸入設爲x,要求出隱含層的激活值a,公式如下。其中 。
同理輸出的h(x)可以用同樣的公式得到,上述過程就是向前傳導,因爲這種聯接圖沒有閉環或迴路。
我們可以用反向傳播法(backpropagation)來訓練上面這個神經網絡。下面主要介紹backpropation算法。
假設對於單個樣例(x,y),它的代價函數(cost function)爲
對於一個樣本集 ,定義它的cost function爲:
我們要做的就是最小化上述式子,類似於最小二乘,不同的是加上了第二項的權重衰減,它是用來防止過擬合,可以把它看成是一個約束項,而整個式子就是求解最值的拉格朗日公式。我們的目標是針對參數 和 來求其函數 的最小值。爲了求解神經網絡,我們需要將每一個參數 和 初始化爲一個很小的、接近零的隨機值(比如說,使用正態分佈 生成的隨機值,其中 設置爲 ),之後對目標函數使用諸如批量梯度下降法的最優化算法。關於w和b的初值,我根據這篇論文(Understanding the difficulty of training deep feedforward neuralnetworks)得出的結論:如果激活函數爲tanh,我們設置爲之間的值,如果激活函數是sigmoid,則是 。
關於反向傳播算法的推導,UFLDL 中介紹的很清楚,我直接粘帖過來了。
既然是用梯度下降法,我們先對代價函數J求關於w和b 的偏導數,直接寫出結果:
反向傳播算法的思路如下:給定一個樣例 ,我們首先進行"前向傳導"運算,計算出網絡中所有的激活值,包括 的輸出值。之後,針對第 層的每一個節點 ,我們計算出其"殘差" ,該殘差表明了該節點對最終輸出值的殘差產生了多少影響。對於最終的輸出節點,我們可以直接算出網絡產生的激活值與實際值之間的差距,我們將這個差距定義爲 (第 層表示輸出層)。對於隱藏單元我們如何處理呢?我們將基於節點(譯者注:第 層節點)殘差的加權平均值計算 ,這些節點以 作爲輸入。下面將給出反向傳導算法的細節:
-
進行前饋傳導計算,利用前向傳導公式,得到 直到輸出層 的激活值。
-
對於第 層(輸出層)的每個輸出單元 ,我們根據以下公式計算殘差:
[譯者注:
]
-
對 的各個層,第 層的第 個節點的殘差計算方法如下:
{譯者注:
將上式中的與的關係替換爲與的關係,就可以得到:
以上逐次從後向前求導的過程即爲"反向傳導"的本意所在。 ]
-
計算我們需要的偏導數,計算方法如下:
最後,我們用矩陣-向量表示法重寫以上算法。我們使用"" 表示向量乘積運算符(在Matlab或Octave裏用".*"表示,也稱作阿達馬乘積)。若 ,則 。在上一個教程中我們擴展了 的定義,使其包含向量運算,這裏我們也對偏導數 也做了同樣的處理(於是又有 )。
那麼,反向傳播算法可表示爲以下幾個步驟:
-
進行前饋傳導計算,利用前向傳導公式,得到 直到輸出層 的激活值。
-
對輸出層(第 層),計算:
-
對於 的各層,計算:
-
計算最終需要的偏導數值:
實現中應注意:在以上的第2步和第3步中,我們需要爲每一個 值計算其 。假設 是sigmoid函數,並且我們已經在前向傳導運算中得到了 。那麼,使用我們早先推導出的 表達式,就可以計算得到 。
最後,我們將對梯度下降算法做個全面總結。在下面的僞代碼中, 是一個與矩陣 維度相同的矩陣, 是一個與 維度相同的向量。注意這裏""是一個矩陣,而不是" 與 相乘"。下面,我們實現批量梯度下降法中的一次迭代:
-
對於所有 ,令 , (設置爲全零矩陣或全零向量)
-
對於 到 ,
-
使用反向傳播算法計算 和 。
-
計算 。
-
計算 。
-
-
更新權重參數:
注意:爲了使代價函數更快的收斂,首先要對輸入數據進行歸一化。
上面忘了講tanh激活函數,,非線性數據圍繞原點對稱更容易很好的收斂代價函數,因爲它們傾向於產生零均值輸入到下一層,一般講,tanh有更好的收斂性能。
本文轉自:http://www.cnblogs.com/loujiayu/p/3545026.html