知識回顧
1:首先引入一些便於稍后討論的新標記方法:
假設神經網絡的訓練樣本有m個,每個包含一組輸入x和一組輸出信號y,L表示神經網絡的層數,S表示每層輸入的神經元的個數,SL代表最后一層中處理的單元個數。
之前,我們所講到的,我們可以把神經網絡的定義分為2類:
1)二元分類:SL = 1,其中y = 1 或 0
2)多元分類:當有K中分類時候,SL = K,其中yi = 1表示分到第i類(k>2)
2:再讓我們回顧之前所講到的邏輯回歸問題中的代價函數

在邏輯回歸中,我們只有一個輸出變量,但是再神經網絡問題中,我們可以有多個輸出變量,因此h函數是一個k維的向量(hΘ(x)∈R^k),並且我們訓練集中的因變量是一個同等維度的向量,因此代價函數為

這個函數和之前的邏輯回歸基本相同,不同之處是對於每一個特征,我們都會給出一個預測,基本上對每一個特征預測K個不同的結果,然后利用循環在K個預測中我們選擇可能性最高的一個,將其與y中的實際數據進行比較。
歸一化的那一項只是排除每一層Θ0后,每一層的Θ矩陣和最里層的循環j循環所有的行,循環i則循環所有的列。
即:hΘ(x)與真實值之間的距離為每個樣本-每個類輸出的加和,對參數進行正則化的偏置項處理所有參數的平方和。
反向傳播算法的介紹
反向傳播(英語:Backpropagation,縮寫為BP)是“誤差反向傳播”的簡稱,是一種與最優化方法(如梯度下降法)結合使用的,用來訓練人工神經網絡的常見方法。該方法計算對網絡中所有權重計算損失函數的梯度。這個梯度會反饋給最優化方法,用來更新權值以最小化損失函數。反向傳播要求有對每個輸入值想得到的已知輸出,來計算損失函數梯度。因此,它通常被認為是一種監督式學習方法,雖然它也用在一些無監督網絡(如自動編碼器)中。它是多層前饋網絡的Delta規則的推廣,可以用鏈式法則對每層迭代計算梯度。反向傳播要求人工神經元(或“節點”)的激勵函數可微。
之前,我們在神經網絡預測結果的時候,我們采用了一種正向傳播的方法,我們從第一層開始,依次計算,直到算出最后一層的hΘ(x)。現在,為了計算出代價函數的偏導數
,我們需要采用一種反向傳播的方法,來計算出網絡中所有權重計算損失函數的梯度,也就是,我們首先計算出最后一層的誤差,然后再一層層的反向求出上一次層的誤差,直到第二層結束。
例如,我們現在有訓練集合{x(1),y(1)},我們的神經網絡是一個四層的神經網絡,其中K = 4,SL = 4,L =4;
我們首先用向前傳播的方法計算出hΘ(x)。

如圖所示:

我們在計算的誤差時,誤差的激活單元的預測a(4)與實際值y(k)之間的誤差k = 1:K。
若我們用δ來表示誤差,則δ(4) = a(4) - y
向前推:
其中g‘(z(3))是s形函數的導數,即就是g’(z(3))= a(3).*(1-a(3))。而Θ(3)T δ(4)則是權重導致的誤差的和。接下來同理計算第二層的誤差
。
因為第一層是輸入變量,所有沒有誤差。
這時我們有了所有誤差的表達式,這時候就可以計算代價函數的偏導數了,
其中l代表目前計算的層數,j代表目前計算的激勵單元的下標,即就是下一層的第j個輸入變量的下標。i代表下一層中誤差單元的下標,即就是收到權重矩陣中第i行影響的下一層中個的誤差單元的下標。
如果我們這時候再考慮歸一化的處理,就需要計算每一層的誤差單元的偏導數,計算每一層的誤差單元。但是我們需要為整個訓練集計算誤差單元,此時的誤差單元就是一個矩陣,我用△ (l)ij表示第l層的第i個激勵單元受到第j個參數的影響而導致的誤差。
算法表示為

即首先用正向傳播算法計算出每一層的激勵單元,利用訓練集的結果與神經網絡預測的結果求出最后一層的誤差,然后反向的計算出前一層的誤差,直到第二層。在求出 △ (l)ij后,我們就可以就按代價函數的偏導數了。

在octave中,我們要用fminuc來求出權重矩陣,我們就需要將矩陣展開為向量,再利用算法求出最優解,然后轉換回矩陣,假設我們有三個權重的矩陣,可以用reshape函數實現。
為了更加直觀的理解反向傳播算法,我們舉一個栗子,加入我有如圖所示的神經網絡結構:

我們可以得出

根據正向傳播方法,我們可以得出z1(3)的結果。
反向傳播算法可以總結為兩個步驟
step1:
計算這些δ(i)j項,可以看做是激勵值的誤差,a(l)j(表示第l層中的第j項)
δ(i)j = “error”of cost for a(l)j
step2:
δ(i)j 是關於z(l)j的偏微分

初始化網絡權值(通常是小的隨機值)
do
forEach 訓練樣本 ex
prediction = neural-net-output(network, ex) // 正向傳遞
actual = teacher-output(ex)
計算輸出單元的誤差 (prediction - actual)
計算
\Delta w_{h} 對於所有隱藏層到輸出層的權值 // 反向傳遞
計算
\Delta w_{i} 對於所有輸入層到隱藏層的權值 // 繼續反向傳遞
更新網絡權值 // 輸入層不會被誤差估計改變
until 所有樣本正確分類或滿足其他停止標准
return 該網絡
對這該算法的數學理解是 代價函數關於中間項的偏微分,他們度量着對神經網絡中的權值做多少的改變,對中間計算量的影響。
δ(4)1 = y(i)-a(4)1
例如,現在需要計算δ(2)2
根據上圖,我們可以得出和δ(2)2有關系的參數是Θ(2)1 2->z(3)1 ->a(3)1-Θ(3)1 1->z(4)1->a(4)1 以及參數Θ(2)2 2 ->z(3)2->a(3)2-Θ(3)1 2->z(4)1->a(4)1 則 δ(2)2 = Θ(2)1 2 δ(3)1 + Θ(2) 2 2δ(3)2
δ(3)2 = Θ(3)1 2 δ(4)1
δ(3)1 = Θ(3)1 1δ(4)1
以上內容是我們怎樣用反向傳播算法計算代價函數的導數。現在我們需要解決如何吧參數矩陣展開成向量,以便在高級優化步驟中使用。
參數展開
function[jVal,gradient] = cost Function(theta) ... optTheta = fminunc(@costFunction,initialTheta,options)
當我們假設L = 4時,Θ(1),Θ(2),Θ(3) = matrices(Theta1,Theta2,Theta3)
D(1),D(2),D(3) = matrices(Theta1,Theta2,Theta3)
eg1:

eg2:假設有初始參數值Θ(1),Θ(2),Θ(3),我們選取這些參數展開成一個長向量,稱作"initialtheta",作為參數傳入fminunc,步驟如下:
step1:用thetaVec重組Θ(1)Θ(2)Θ(3) 此處調用reshape函數
step2:正向傳播/反向傳播,得到D(1),D(2),D(3)和J(Θ)
step3:取出導數值D(1),D(2),D(3),展開與0相同的順序,得到gradientVec
