M-P神經元模型
神經網絡中最基本的組成成分:神經元模型。如下圖是一個典型的“M-P神經元模型”:
上圖中,神經元接收到n個其他神經元傳遞過來的輸入信號,這些信號通過權重的連接進行傳遞,神經元接收到的總輸入值與神經元的閾值進行比較,並通過“激活函數”處理產生神經元輸出。常用S函數作爲激活函數:y=1/(1+e^-x);
多層前饋神經網絡
定義:每層神經元與下一層神經元全互聯,不存在同層連接和跨層連接。包含一個輸入層,一個輸出層和若干個隱層。如下圖:
BP算法(反向傳播算法,誤差逆傳播算法)
BP算法推導:
BP算法僞代碼如下:
BP算法的目標:最小化訓練集D上的累積誤差:
E=(E1+E2+...+Em)/m;
上面的推導是針對單個樣本更新連接權重。若是基於累積誤差最小化更新連接權重,就得到“累積誤差逆傳播算法”。
優缺點:標準BP算法參數更新非常頻繁,而且對不同樣本更新可能會出現“抵消”現象;累積BP算法參數更新頻率小,但誤差下降到一定程度後,進一步下降會很慢。
過擬合處理:1、將樣本分成訓練集和驗證集,當訓練集誤差降低但驗證集誤差升高,則停止訓練;2、正則化:誤差目標函數變爲:E=lambda*(E1+E2+...+Em)/m+(1-lambda)(w1^2+w2^2+...+wi^2).
標準BP算法和累積BP算法matlab代碼如下:
if alg_type == 0,%標準BP算法
for j=1:loops_num,%設定的梯度次數
for i=1:rows,
%前向計算輸出
z1 = x_1(i,:)*w1_b;
%隱層輸出
output1 = 1./(1+exp(-z1));
output1_b = [output1,1];
z2 = output1_b*w2_b;
%輸出層輸出
output2 = 1./(1+exp(-z2));
%誤差
%error = (output2-y(i))*(output2-y(i))';
%反向傳播更新參數
g = (y(i)-output2).*output2.*(1-output2);
%隱層與輸出層之間的權重變更
c_w2 = lambda2*output1'*g;
%輸出層的閾值變更
c_b2 = -lambda2*g;
c_w2_b = [c_w2;c_b2];
e = g*w2_b'(:,1:hidden_num).*output1.*(1-output1);
%輸入層和隱層之間的權重變更
c_w1 = lambda1*x(i,:)'*e;
%隱層的閾值變更
c_b1 = -lambda1*e;
c_w1_b = [c_w1;c_b1];
%更新權重和閾值參數
w1_b = w1_b + c_w1_b;
w2_b = w2_b + c_w2_b;
endfor;
%error
endfor;
else%累積BP算法
for j=1:loops_num,
c_w2 = zeros(hidden_num,2);
c_b2 = zeros(1,2);
c_w1 = zeros(cols-1,hidden_num);
c_b1 = zeros(1,hidden_num);
error = 0;
%累積
for i=1:rows,
z1 = x_1(i,:)*w1_b;
output1 = 1./(1+exp(-z1));
output1_b = [output1,1];
z2 = output1_b*w2_b;
output2 = 1./(1+exp(-z2));
g = (y(i)-output2).*output2.*(1-output2);
c_w2 = c_w2 + lambda2*output1'*g;
c_b2 = c_b2 - lambda2*g;
e = g*w2_b'(:,1:hidden_num).*output1.*(1-output1);
c_w1 = c_w1 + lambda1*x(i,:)'*e;
c_b1 = c_b1 - lambda1*e;
endfor;
c_w2_b = [c_w2;c_b2]/rows;
c_w1_b = [c_w1;c_b1]/rows;
%累積更新
w1_b = w1_b + c_w1_b;
w2_b = w2_b + c_w2_b;
endfor;
endif
參考資料:周志華《機器學習》