為了搞明白這個沒少在網上搜,但是結果不盡人意,最后找到了一篇很好很詳細的證明過程,摘抄整理為 latex 如下。
(原文:https://blog.csdn.net/weixin_41718085/article/details/79381863)
更新:為了讓看博客的帶哥們能直觀的看,我編譯截圖了,放在這里,latex 源碼在下面
這個只是為了應付作業總結的,所以沒有認真檢查過,如果內容、正確性(尤其是這個)和格式上有什么問題請務必在下面評論區中指出。
\documentclass{article} \usepackage{xeCJK} \usepackage{amsmath} \setCJKmainfont{Noto Serif CJK SC} \title{人工神經網絡反向傳播算法\\鏈式法則在人工智能中的應用} \begin{document} \maketitle \section{背景} \subsection{人工神經元} 人工神經元是一個運算,它將輸入分別以不同的權重組合相加並做一次偏移操作后進行某個非線性運算得到輸出,以數學語言描述即是 \[ x^{(j + 1)} = \sigma(b + \sum_i W_i x_i^{(j)}) \] 其中 \(j\) 指神經元所處的層數,本例中 \(x_i^{(j)}\) 是來自第 \(j\) 層的第 \(i\) 個神經元的輸入,\(W_i\) 是當前神經元所有提供輸入的神經元中的第 \(i\) 個的權重,\(b\) 是偏移值,\(f\) 被稱作激活函數,通常是一個非線性函數,一些經典的激活函數有 Sigmoid, ReLU, 和反正切函數。 \subsection{人工神經網絡} 人工神經網絡(Artificial Neural Network,后簡稱 ANN)由若干層人工神經元組成,在本文所考慮的模型中,每一層神經元接受上一層神經元的輸入,運算,並將結果輸出至下一層。事實上,若將整個網絡中每個神經元的參數記為矩陣 \(A\),則整個神經網絡可以認為是一個函數 \(f(A, x)\),其中 \(x\) 是整個網絡的輸出。 在應用的過程中,我們常常有一組輸入 \(x\) 和對應着的期望輸出 \(y\)。訓練神經網絡的過程就是尋找合適的 \(A_0\),使得 \(f(A_0, x) = y\)。為了解決這個問題,數學上我們引入損失函數\(J(y, y^*)\) 來指示 \(f(A, x)\) 訓練的程度,其中 \(y^*\) 是神經網絡的輸出。一個典型的損失函數是歐幾里得距離的平方,即 \(J_0(y, y^*) = (y - y^*)^T (y - y^*)\)。這樣一來,問題便被轉化為,尋找 \(A_0\) 使得 \(J(y, f(A_0, x))\) 可以取到最小值。 由於對於給定的訓練數據 \(y\) 是定值,為了直觀,不妨記 \(J(y, f(A, x)) = h(A, x)\),這樣一來我們需要解決的問題便是: 求參數 \(A\) 使得函數 \(h(A, x)\) 可以取到最小值。 這是我們在微積分的學習中經常解決的一類問題,只需要求出 \({\partial h(A, x)} / {\partial A}\) 並令其為 0 即可。但是事實上,對 \(h\) 求導函數幾乎是不可能的,我們常用的方法是在每次迭代中,求出 \(h\) 在某個點 \(A_0\) 處的導數值,並根據這個導數值的正負和絕對值大小適當地調整 \(A\) 並進入下一輪迭代。這種方法被稱作梯度下降法,他有一個顯著的缺點就是他只能求得局部最小值(這是顯然的),但考慮到通常神經網絡的局部最小值已經足夠優秀,我們便勉強可以接受這個缺點的存在。然而即便有了梯度下降法的思路,我們也需要一種可以求出導數值的算法,本文將描述的反向傳播算法(Back Propagation Algorithm,常簡稱 BP 算法)即是一例。 \section{推導} \subsection{符號定義} 為了方便推導過程的說明,在這里重新進行符號定義,接下來的推導過程將不會使用背景中使用的符號體系。 符號規約: \begin{itemize} \item 第 \(l - 1\) 層的第 \(k\) 個神經元傳播給第 \(l\) 層的第 \(j\) 個神經元的值的權重記為 \(W_{jk}^{(l)}\),每一層的所有權重記為矩陣 \(W^{(l)}\),所有的參數籠統地記作 \(W\); \item 第 \(l\) 層的第 \(j\) 個神經元的偏移值記為 \(b_j^{(l)}\),每層的所有偏移量記為向量 \(b^{(l)}\),所有的偏移籠統地記作 \(b\); \item 第 \(l\) 層的第 \(j\) 個神經元的輸入值記為 \(z_j^{(l)}\),每層的所有輸入值記為向量 \(z^{(l)}\); \item 第 \(l\) 層的第 \(j\) 個神經元的輸出值記為 \(x_j^{(l)}\),每層的所有輸出值記為向量 \(x^{(l)}\); \item 第 \(l\) 層的激活函數記為 \(\sigma_l\);(通常來講每層神經元擁有一樣的激活函數) \item 第 \(l\) 層的神經元個數記為 \(s_l\); - 神經網絡共有 \(n\) 層; \item 損失函數記為 \(J(W, b; y, y_0)\),其中 \(y_0\) 指真值,\(y\) 指網絡的輸出值;(在一次迭代中,\(y\) 和 \(y_0\) 是常數,因此后面將略去這兩個參數) \item \({\partial J(W, b)}/{\partial z_j^{(l)}}\) 記為 \(\Delta_j^{(l)}\),一層的所有 \(\Delta\) 記作 \(\Delta^{(l)}\); \item 訓練集為 \(T = \{(x_0, y_0), (x_1, y_1), ..., (x_m, y_m)\}\),且 \(|T| = m\); \item 被應用於矩陣或向量間的 \(*\) 運算指對位乘法。 \end{itemize} 根據定義,顯然有: $$ z_j^{(l+1)} = \left(\sum_{k=0}^{s_{(l-1)}} W_{jk}^{(l)} x_k^{(l - 1)}\right) + b_j^{(l)} \eqno(a) $$ $$ x_j^{(l)} = \sigma_l(z_j^{(l)}) \eqno(b) $$ \subsection{證明目的} 給出一種算法以計算任意神經網絡的 \(\partial J / \partial W_{jk}^{(l)}\) 和 \(\partial J / \partial b_{j}^{(l)}\)。出於篇幅的關系,本文僅說明對前者的計算,略去證明過程一致的后者證明部分。 \subsection{證明過程} 由鏈式法則知: $$ {\partial J(W, b) \over \partial W_{jk}^{(l)}} = {\partial J(W, b) \over \partial x_j^{(l+1)}}{\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}}{\partial z_j^{(l+1)} \over \partial W_{jk}^{(l)}} \eqno(0) $$ 將偏差拆分成了三部分,接下來分別對三個部分進行求解。 \paragraph{2.3.1. 第一部分} 對於第一部分有 $$ \begin{aligned} {\partial J(W, b) \over \partial x_j^{(l+1)}} &= \sum_{i = 1}^{s_{l + 2}} {\partial J \over \partial z_i^{(l+2)}} {\partial z_i^{(l+2)} \over \partial x_j^{(l+1)}} \\ &\overset{(a)}= \sum_{i = 1}^{s_{l+2}} {\partial J \over \partial z_i^{(l+2)}} {\partial \over \partial x_j^{(l+1)}} \left(b_j^{(l+1)} + \sum_{k = 0}^{s_{l+1}}{W_{ji}^{(l+1)}x_i^{(l+1)}}\right) \\ &= \sum_{i = 1}^{s_{l+2}} \Delta_i^{(l+2)} W_{ji}^{(l)} \end{aligned} \eqno(2) $$ \paragraph{2.3.2. 第二部分} 對於第二部分有 \[ \begin{aligned} \partial x_j^{(l+1)} \over \partial z_j^{(l+1)} &\overset{(b)}= {\partial \over \partial z_j^{(l+1)}} \sigma_{l+1}(z_j^{(l+1)}) \\ &= \sigma_{l+1}'(z_j^{(l+1)}) \end{aligned} \] 對於激活函數 \(\sigma_l\) 來說,假設存在函數 \(f_l\) 使得 \[ f_l(\sigma_l(x)) = \sigma_l'(x) \] 則有 \[ \begin{aligned} {\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}} = f^{(l+1)}(x_j^{(l+1)} \end{aligned} \tag{2} \] \paragraph{2.3.3. 第三部分} \[ \begin{aligned} {\partial z_j^{(l+1)} \over \partial W_{jk}^{(l)}} &\overset{(a)}= {\partial \over \partial W_{jk}^{(l)}} \left( b_j^{(l)} + \sum_{k=0}^{n_{l-1}} W_{jk}^{(l)} x_k^{(l - 1)}\right) \\ &= x_j^{(l)} \end{aligned} \tag{3} \] \paragraph{2.3.4. 綜合} 綜合 \((0)\),\((1)\),\((2)\),\((3)\) 式可得 \[ \begin{aligned} \left(\sum_{i = 1}^{s_{l+2}} \Delta_i^{(l+2)} W_{ji}^{(l)}\right) f^{(l+1)}(x_j^{(l+1)})x_j^{(l)} \end{aligned} \tag{4} \] 又因為 \[ \Delta_j^{(l+1)} = \frac{\partial J(W, b)}{\partial z_j^{(l + 1)}} = {\partial J(W, b) \over \partial x_j^{(l+1)}} {\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}} \overset{(1), (2)}{=} \left(\sum_{i = 1}^{s_{l+2}} \Delta_i^{l+2} W_{ji}^{(l)}\right) f^{(l+1)}(x_j^{(l+1)}) \tag{5} \] 其中 \( 0 < j < s_{l} + 1 \),\( 0 < l < n \). \paragraph{2.3.5. 向量形式改寫} 寫作向量形式有 \[ \frac{\partial J(W, b)}{\partial W^{(l)}} = \Delta^{(l+1)} \left(x^{(l)}\right)^T \tag{4*} \] \[ \Delta^{(l)} = \left(W^{(l)}\right)^T \Delta^{(l+1)} * f_l(x^{(l+1)}) \tag{5*} \] \paragraph{2.3.6. 邊界條件} 上文中我們求得了兩個遞推公式。顯然,對於 \((5^*)\) 式來說,由於 \(l = n\) 時 \(l + 1\) 越界,所以不可以應用於該情況。對於該邊界情況應當額外考慮。 \[ \begin{aligned} \Delta_j^{(n)} &= \frac{\partial J(W, b; y, y_0)}{\partial z_j^{(n)}} \\ &\overset{y = x^{(n)}}= \frac{\partial J(W, b; x^{(n)}, y_0)}{\partial x_i^{(n)}} \frac{\partial x_i^{(n)}}{\partial z_i^{(n)}} \\ &\overset{(2)}= \frac{\partial J(W, b; x^{(n)}, y_0)}{\partial x_i^{(n)}} f^{(n)}(x_j^{(n)}) \end{aligned} \tag{6} \] 之后的計算與損失函數的具體形式有關,無法一般地給出,但考慮到接下來的運算都是顯而易見的,此處略去無傷大雅。 \section{結論} 通過一個邊界條件和兩個遞推公式: \[ \begin{cases} \Delta_j^{(n)} = \frac{\partial J}{\partial x_i^{(n)}}(W, b; x^{(n)}, y_0) f^{(n)}(x_j^{(n)}) \\ \frac{\partial J}{\partial W^{(l)}}(W, b) = \Delta^{(l+1)} \left(x^{(l)}\right)^T \\ \Delta^{(l)} = \left(W^{(l)}\right)^T \Delta^{(l+1)} * f_l(x^{(l+1)}) \end{cases} \eqno(conclusion) \] 可以完成一次傳播中對神經網絡的求導過程。 \end{document}