智慧型控制 Intelligent Control

感知器的初始化 Initialization

(原講義為 Matlab 手冊的英文截圖,以下改寫為中文。)函數 init 可以把網路的權值與偏權值重設為初始值。

重設為初值 init

從下面的網路開始,檢查權值與偏權值,果然都是 0:

net = newp([-2 2; -2 +2], 1);
wts = net.IW{1,1}
wts =
     0     0
bias = net.b{1}
bias =
     0

把權值設成 3 與 4、偏權值設成 5,再檢查一次,確實已經改變:

net.IW{1,1} = [3,4];
net.b{1} = 5;
wts =
     3     4
bias =
     5

用 init 把權值與偏權值重設回原來的值,再檢查:

net = init(net);
wts =
     0     0
bias =
     0

改用亂數初始化 rands

感知器的初始化方式可以更改。例如把輸入權值與偏權值的 initFcn 改成 rands,再執行 init:

net.inputweights{1,1}.initFcn = 'rands';
net.biases{1}.initFcn = 'rands';
net = init(net);

檢查權值與偏權值,可以看到它們被設成亂數:

wts =
    0.2309    0.5839
biases =
   -0.1106
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 3 節 init),可以直接在瀏覽器執行、修改參數。⬇ 下載 NN.ipynb

(補充)rands 產生 −1 到 1 之間的均勻亂數,所以每次執行的數字都不同,上面只是原講義那一次的結果。感知器用 0 當初值就能訓練;後面的倒傳遞網路則必須用亂數初值:若所有隱藏神經元的權值都相同,它們的梯度也相同,訓練後仍會一模一樣,等於只有一個神經元。

原圖對照(取自 Matlab 手冊)
原圖
原圖
原圖
原圖