反向傳播示範
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

反向傳播演算法

反向傳播演算法對於訓練大型類神經網路至關重要。本文將說明演算法的運作方式。

請向下捲動...

簡單的類神經網路

畫面右側顯示一個類神經網路,其中包含一個輸入項目、一個輸出節點,以及兩個隱藏層 (每個節點為兩個節點)。

鄰近圖層中的節點會與網路參數 (權重) 相互連結 \(w_{ij}\)。

激勵函式

每個節點都有輸入總數 \(\color{input}x\)、啟動函式 \(f(\color{input}x\color{black})\)和輸出結果。 \(\color{output}y\color{black}=f(\color{input}x\color{black})\)\(f(\color{input}x\color{black})\) 必須是非線性函式,否則類神經網路只能學習線性模型。

常用的啟動函式為 Sigmoid 函式: \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\)。

錯誤函式

其目標是自動根據資料學習網路的權重,讓預測的輸出 \(\color{output}y_{output}\)\(\color{output}y_{target}\) 更接近目標輸入的 \(\color{input}x_{input}\)。

為評估離目標有多遠,我們會使用錯誤函式 \(E\)。常用的錯誤函式為 \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \)。

轉送傳播

我們先使用輸入範例 \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) 並更新網路的輸入層。

為保持一致性,我們會將輸入視為任何其他節點,但未啟用啟動函式。因此,輸出內容等同於輸入的內容,例如 \( \color{output}y_1 \color{black} = \color{input} x_{input} \)。

轉送傳播

現在,我們要更新第一個隱藏層。我們會使用前一個圖層中的節點 \(\color{output}y\) ,並使用權重計算下一個圖層中的節點輸入 \(\color{input}x\) 。
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

轉送傳播

接著,我們會更新第一個隱藏層中的節點輸出內容。為此,我們使用啟用函式 \( f(x) \)。
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

轉送傳播

透過這 2 個公式,我們會傳播到其餘網路,並取得網路的最終輸出內容。
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

衍生錯誤

反向傳播演算法在將預測輸出內容與特定範例的輸出結果進行比較後,決定了每個網路權重的更新頻率。因此,我們需要計算每個權重之間的錯誤變化。 \(\color{dweight}\frac{dE}{dw_{ij}}\)
取得衍生錯誤後,我們可以使用簡單的更新規則來更新權重:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
其中 \(\alpha\) 為正常數,稱為學習率,因此我們必須進行微調。

[注意事項] 更新規則非常簡單:如果權重隨著權重增加 (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)) 減少,請增加權重,否則如果權重增加時錯誤增加 (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)),請降低權重。

其他衍生項目

為協助進行運算 \(\color{dweight}\frac{dE}{dw_{ij}}\),我們還為每個節點額外儲存兩個衍生變數: 錯誤的變化方式:
  • 節點的輸入總數 \(\color{dinput}\frac{dE}{dx}\)
  • 節點 \(\color{doutput}\frac{dE}{dy}\)的輸出內容。

背傳播

讓我們開始回溯錯誤錯誤衍生工具。 由於我們有這個特定輸入範例的預測輸出內容,因此可以計算錯誤隨著該輸出內容的變化情形。 基於我們的錯誤函式 \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) ,我們擁有:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

背傳播

現在,我們可以 \(\color{doutput} \frac{dE}{dy}\) 使用 \(\color{dinput}\frac{dE}{dx}\) 鏈結。
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
其中 \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) 是 \(f(\color{input}x\color{black})\) 為 Sigmoid 啟用函式時。

背傳播

一旦我們取得關於節點總輸入的錯誤衍生錯誤,就可以取得該節點的權重衍生錯誤。
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

背傳播

使用鏈規則,也可以從上一個圖層取得 \(\frac{dE}{dy}\) 。我們已建立完整圓圈。
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

背傳播

我們要做的,請重複先前的三個公式,直到計算出所有錯誤衍生工具。

結尾。

運算中...