机器学习:神经网络-多层前馈神经网络浅析(附代码实现)

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

参考资料:周志华《机器学习》

猜你喜欢

转载自blog.csdn.net/weixin_35732969/article/details/80650962
今日推荐