多层神经网络
对于多层神经网络的训练,delta规则是无效的,因为应用delta规则训练必须要误差,但在隐含层中没有定义。输出节点的误差是指标准输出和神经网络输出之间的差别,但训练数据不提供隐藏层的标准输出。
真正的难题在于怎么定义隐藏节点的误差,于是有了反向传播算法。反向传播算法的重要性在于,它提供了一种用于确定隐含节点误差的系统方法。在该算法中,输出误差从输出层逐层后移,直到与输入层相邻的隐含层。
1.反向传播算法
在反向传播算法中,隐含节点误差的计算方式是求取delta的反向加权和,节点的delta是误差与激活函数导数之积。该过程从输出层开始,并重复于所有隐含层。
MATLAB代码实现:
输入数据为 { [(0,0,1),0],[(0,1,1),1],[(1,0,1),1],[(1,1,1),0] },网络结构为三个输入节点,四个节点组成的隐含层,一个输出节点。Sigmoid函数为激活函数,采用SGD实现反向传播算法。
function [W1, W2] = BackpropXOR(W1, W2, X, D)
% 以神经网络的权重和训练数据作为输入,返回调整后的权重
% 其中W1和W2为相应层的权重矩阵;X和D分别是训练数据的输入和标准输入
alpha = 0.9;
N = 4;
for k = 1:N
x = X(k, :)';
d = D(k);
v1 = W1*x;
y1 = Sigmoid(v1);
v = W2*y1;
y = Sigmoid(v);
e = d - y;
delta = y.*(1-y).*e;
e1 = W2'*delta; % 反向传播
delta1 = y1.*(1-y1).*e1;
dW1 = alpha*delta1*x';
W1 = W1 + dW1;
dW2 = alpha*delta*y1';
W2 = W2 + dW2;
end
end
Sigmoid函数定义如下:
function y = Sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
验证函数效果程序