機器學習:神經網絡-多層前饋神經網絡淺析(附代碼實現)

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
微信交流
多謝打賞

參考資料:周志華《機器學習》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章