機器學習整理(神經網路)

北極烏布發表於2022-04-10

神經元

神經網路由多個神經元組成,其中神經元由幾個部分組成:輸入、輸入權重、輸出和啟用函式組成,類似於生物神經元的樹突、軸突的組成。

神經元的輸入由左邊的神經元輸出 \(x\) 乘以權重 \(w\) 並加和得到,輸出的時候,類似於生物神經元的軸突,將神經元的輸出通過啟用函式才能傳送給接下來的神經元。

常用的啟用函式(activation function)是Sigmod,它的函式影像如下,在邏輯迴歸的時候使用過:

其中偏置單元 \(b\) 是用於提高神經網路的靈活性而加入的,它的存在可以讓啟用函式更快或者更慢達到啟用狀態。

神經網路

多個神經元組層一個神經網路:

神經網路第一層是輸入層(input),最後一層是輸出層(output),而中間的就是神經網路的隱藏層(hidden layer)

神經網路的訓練過程如下:

  1. 隨機初始化權重 \(w_i\)
  2. 代入執行前向傳播得到神經網路的輸出 \(o_i\)
  3. 計算代價函式 \(J(W)\)
  4. 執行反向傳播,計算偏導數 \(\frac{\partial J(W)}{\partial w_i}\) ,依次更新網路的權重
  5. 將樣本 \((x_i,y_i)\) 不斷代入第2步到第4步。

前向傳播

前向傳播的過程目的是計算出神經網路的輸出:

首先開始計算 \(net_0\) :

\[net_0 = w_0 * x_0 + w_2 * x_1 + b_0 * 1 \]

到達隱藏層的神經元后,會通過啟用函式作為神經元的輸出 \(a_0\)

\[a_0 = Sigmoid(net_0) = \frac{1}{1-e^{-net_0}} \]

計算該神經元后繼續向前計算,和前面一層的計算類似:

\[ o_0 = Sigmoid(w_4 * a_0 + w_6 * a_1 + b_2 * 1) \]

按照這樣的傳播過程,這樣就能計算出神經網路的輸出 \(o_1,o_2,\dots,o_n\) ,即神經網路的前向傳播,就像把樣本 \(x\) 代入\(y = ax + b\)裡求出 \(y\) 值的過程一樣。

反向傳播

按照神經網路的訓練過程,接下來是希望計算代價函式 \(J(W)\) ,並求出 \(J(W)\)\(w_i\) 的偏導數 \(\frac{\partial J(W)}{\partial w_i}\) ,並按照學習率 \(a\) 更新引數:

\[w_i = w_i - a * \frac{\partial J(W)}{\partial w_i} \]

以更新 \(w_5\) 為例,如果需要知道 \(\frac{\partial J(W)}{\partial w_5}\) 的值,根據鏈式求導法則:

\[\frac{\partial J(W)}{\partial w_5} = \frac{\partial J(W)}{\partial o_1 } * \frac{\partial o_1}{\partial net_3} * \frac{\partial net_3}{\partial w_5} \]

(1)首先求\(\frac{\partial J(W)}{\partial o_1 }\) ,其中代價函式 \(J(W)\) ,如果是線性迴歸,那麼表示式就是:

\[J(W) = \frac{1}{2}\sum_{i=1}^{m}(y_i - o_i)^2 = \frac{1}{2}(y_0 - o_0)^2 + \frac{1}{2}(y_1 - o_1)^2 \]

其中對 \(o_1\) 的偏導數為:

\[\frac{\partial J(W)}{\partial o_1 } = 0 + 2 * \frac{1}{2} (y_1 - o_1) * -1 = -(y_1 - o_1) \]

(2)然後是求 \(\frac{\partial o_1}{\partial net_3}\)

\[o_1 = Sigmoid(net_3) \]

其中對 \(net_3\) 的偏導數為:

\[\frac{\partial o_1}{\partial net_3} = Sigmoid(net_3)' = Sigmoid (net_3) * (1 - Sigmoid(net_3) \]

啟用函式Sigmoid的函式 \(f(x)\) 的導數等於 \(f(x)*(1-f(x))\)見證明

(3)最後是求 \(\frac{\partial net_3}{\partial w_5}\) :

\[net_3 = w_5 * a_0 + w_7 * a_1 + b_1 \]

\[\frac{\partial net_3}{\partial w_5} = a_0 * 1 + 0 = a_0 \]

所以最終求得偏導項:

\[\frac{\partial J(W)}{\partial w_5} = -(y_1 - o_1) * Sigmoid (net_3) * (1 - Sigmoid(net_3)) * a_0 \]

\(w_5\) 也能在反向傳播中更新自己的權重,通過減去 \(a * \frac{\partial J(W)}{\partial w_5}\)

第三個導數項求偏導時都會等於上一層的啟用函式的輸出值,如果把前兩個導數項 \(\frac{\partial J(W)}{\partial o_i } * \frac{\partial o_i}{\partial net_i}\) 用符號 \(\delta_i\) 代替的話,那麼:$$\frac{\partial J(W)}{\partial w_5} = a_j\delta_i$$

如果要更新隱藏層的權重 \(w_1\) ,則

\[\frac{\partial J(W)}{\partial w_1} = \frac{\partial J(W)}{\partial a_0 } * \frac{\partial a_0}{\partial net_0} * \frac{\partial net_0}{\partial w_1} \]

因為 \(\frac{\partial J(W)}{\partial a_0 }\) 同時受到 \(o_0\)\(o_1\) 的影響,所以:

\[\frac{\partial J(W)}{\partial w_1} = (\frac{\partial J(W)_0}{\partial a_0 } + \frac{\partial J(W)_2}{\partial a_0 }) * \frac{\partial a_0}{\partial net_0} * \frac{\partial net_0}{\partial w_1} \]

其中 \(J(W)_0\) 代表在 \(o_0\) 的損失,計算和前面的規則類似,依次根據鏈式求導規則展開即可對給定的 \((x_i, y_i)\) 擬合。

其他資料

在這裡基本開啟了神經網路的大門,雖然目前學到只是一個全連線網路和基本的BP演算法,但是在這篇文章中可以看到還有支援增量學習的自適應諧振理論網路(ART),以及自動連線神經元的自我組織網路(SOM)等等網路架構。

其他我用到的資料:

相關文章