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
参考资料:周志华《机器学习》