倒傳遞網路 Backpropagation
老師錄製的操作示範:建立並訓練一個倒傳遞(backpropagation)網路,再轉成 Simulink 模型。附檔為訓練好的網路 NetBp.mat 與產生的模型 NetBpmdl.mdl。
為什麼要多層 Why Multiple Layers
(以下為補充)單層感知器只能解線性可分的問題,連 XOR 都解不了。多層網路加上非線性的隱藏層就沒有這個限制,但感知器規則只能訓練輸出層:隱藏層的神經元沒有「目標值」可以比較。倒傳遞演算法用微積分的連鎖律,把輸出端的誤差一層層往回分攤到隱藏層,再用梯度下降調整所有權值。為了能微分,隱藏層改用 S 形轉移函數(tansig、logsig),而不是 hardlim。
附檔的網路 The Network in NetBp.mat
(以下讀取附檔整理)NetBp.mat 是 2 個輸入、3 個 tansig 隱藏神經元、1 個 purelin 輸出神經元的網路:
| 屬性 | 值 |
|---|---|
| 輸入範圍 | p₁:−1~2、p₂:0~5 |
| 轉移函數 | 第 1 層 tansig(3 個)、第 2 層 purelin(1 個) |
| 初始化 | initnw(Nguyen–Widrow) |
| 訓練函數 trainFcn | traingd(梯度下降);檔中參數 lr = 0.01、epochs = 100、goal = 0 |
| 誤差函數 performFcn | mse(均方誤差) |
輸入範圍、層數與轉移函數,都和 Matlab 手冊的 newff 範例 newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd') 相同。手冊範例的訓練資料是 \(\mathbf p = [-1\ {-1}\ 2\ 2;\ 0\ 5\ 0\ 5]\)、\(\mathbf t = [-1\ {-1}\ 1\ 1]\);把附檔的權值代入這四點,輸出為 −0.91、−0.95、1.05、0.96,mse = 0.0035(verify_nn2.py 核對),這個網路應該就是用這組資料訓練的。
NetBpmdl.mdl 的結構和 AND 感知器的模型相同,只是有兩層:Layer 1 用 tansig、Layer 2 用 purelin,層間以 Goto/From 方塊傳遞 a{1}。模型的常數輸入是 [0.62; 0.79],輸出 y = 0.694。
倒傳遞演算法 The Algorithm
(補充)以這個兩層網路為例,前向計算:
$$\mathbf a^1 = \operatorname{tansig}(\mathbf W^1\mathbf p + \mathbf b^1),\qquad y = a^2 = \mathbf W^2\mathbf a^1 + b^2$$對 Q 筆訓練資料的均方誤差 \(F = \frac{1}{Q}\sum_q (t_q - y_q)^2\)。定義各層的敏感度 \(\mathbf s^m = \partial F / \partial \mathbf n^m\),由輸出層往回算(tansig 的導數為 \(1 - a^2\),purelin 的導數為 1):
$$s^2 = -\frac{2}{Q}(t - a^2),\qquad \mathbf s^1 = \operatorname{diag}\!\left(1 - (\mathbf a^1)^2\right)(\mathbf W^2)^{\mathsf T} s^2$$再以梯度下降更新(批次訓練時把各筆資料的梯度加總後更新一次,α 為學習率 lr):
$$\mathbf W^m \leftarrow \mathbf W^m - \alpha \sum_q \mathbf s^m (\mathbf a^{m-1})^{\mathsf T},\qquad \mathbf b^m \leftarrow \mathbf b^m - \alpha \sum_q \mathbf s^m,\qquad \mathbf a^0 = \mathbf p$$互動訓練 Try It
下方動畫用同樣的 2–3–1 結構與上面的公式,從亂數初值開始做批次梯度下降。左圖是網路輸出隨輸入的變化,右圖是 mse 隨回合數下降的情形:
- 手冊範例:學習率 0.05 時,幾十到一百多回合 mse 就降到 0.01 以下(依初值而定)。
- XOR:2 個以上的隱藏神經元就能解;只有 1 個時,mse 卡在 0.17 左右,因為輸出只能沿單一方向單調變化。
- 學習率:手冊範例把學習率調到 1 左右,幾步之內權值就爆掉(發散)。學習率太小則收斂很慢。
- 換一組初值:不同的亂數初值,收斂的速度與最後的曲面形狀都不同。