智慧型控制 Intelligent Control

倒傳遞網路 Backpropagation

老師錄製的操作示範:建立並訓練一個倒傳遞(backpropagation)網路,再轉成 Simulink 模型。附檔為訓練好的網路 NetBp.mat 與產生的模型 NetBpmdl.mdl。

▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 7 節 NetBp.mat、NetBpmdl.mdl 與 traingd 訓練),可以直接在瀏覽器執行、修改參數。⬇ 下載 NN.ipynb

為什麼要多層 Why Multiple Layers

(以下為補充)單層感知器只能解線性可分的問題,連 XOR 都解不了。多層網路加上非線性的隱藏層就沒有這個限制,但感知器規則只能訓練輸出層:隱藏層的神經元沒有「目標值」可以比較。倒傳遞演算法用微積分的連鎖律,把輸出端的誤差一層層往回分攤到隱藏層,再用梯度下降調整所有權值。為了能微分,隱藏層改用 S 形轉移函數(tansig、logsig),而不是 hardlim。

附檔的網路 The Network in NetBp.mat

(以下讀取附檔整理)NetBp.mat 是 2 個輸入、3 個 tansig 隱藏神經元、1 個 purelin 輸出神經元的網路:

p1​p2​y輸入(2)隱藏層 tansig(3)輸出層 purelin(1)
屬性值
輸入範圍p₁:−1~2、p₂:0~5
轉移函數第 1 層 tansig(3 個)、第 2 層 purelin(1 個)
初始化initnw(Nguyen–Widrow)
訓練函數 trainFcntraingd(梯度下降);檔中參數 lr = 0.01、epochs = 100、goal = 0
誤差函數 performFcnmse(均方誤差)
$$\mathbf{IW}^{1,1} = \begin{bmatrix} 1.6104 & -0.0156 \\ -1.1816 & 0.5496 \\ 0.6509 & 0.8971 \end{bmatrix},\quad \mathbf b^1 = \begin{bmatrix} -3.1600 \\ -1.4308 \\ -0.2188 \end{bmatrix},\quad \mathbf{LW}^{2,1} = \begin{bmatrix} 0.2350 & -0.9496 & 0.6662 \end{bmatrix},\quad b^2 = -0.4439$$

輸入範圍、層數與轉移函數,都和 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 核對),這個網路應該就是用這組資料訓練的。

-1012012345t=-1、y=-0.91t=-1、y=-0.95t=1、y=1.05t=1、y=0.96p1​p2​NetBp.mat 網路的輸出 y(p₁, p₂)藍 = −1、暗 = 0、橘 = +1圓點:手冊 newff 範例的訓練資料p = [−1 −1 2 2; 0 5 0 5]t = [−1 −1 1 1]四點的 mse = 0.0035輸出大致隨 p₁ 由 −1 升到 +1;四點之間沒有資料約束,中間的形狀(含 p₂ 的影響)是網路自己內插的

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 隨回合數下降的情形:

自製動畫(依控制理論數值模擬)