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

我的小程序:

待办计划:在不确定中前行
随笔日记:祭那些逝去的时光

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
待办计划:在不确定中前行
随笔日记:祭那些逝去的时光

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值