训练多层网络要比感知机复杂多了,感知机的学习方法是不够的。误差逆传播算法(error BackPropagation,简称BP)也称为反向传播算法,是最为成功的一种神经网络学习方法之一。一般而言,BP神经网络是指用BP算法训练的多层前馈神经网络,但BP算法也能训练其他类型的神经网络,如递归神经网络。
标准BP算法
假设要训练的是一个单隐层的前馈神经网络,BP算法使用均方误差作为性能度量,基于梯度下降(gradient descent)策略,以目标函数的负梯度方向对参数进行调整。
流程如下:
输入:训练集 %7D%5Em%7Bk%3D1%7D#card=math&code=D%20%3D%20%7B%28%5Cmathbf%7Bx%7D_k%2C%5Cmathbf%7By%7D_k%29%7D%5Em%7Bk%3D1%7D&id=BAMZy),学习率
。
过程:
1:在 #card=math&code=%280%2C1%29&id=ji9rQ) 范围内随机初始化网络中所有连接权和阈值
2:
3:
#card=math&code=%28%5Cmathbf%7Bx%7D_k%2C%5Cmathbf%7By%7D_k%20%5Cin%20D%29&id=Or8yg)
4:
根据当前参数计算出样本的输出
5:
计算输出层神经元的梯度项
6:
计算隐层神经元的梯度项
7:
更新连接权与阈值
8:
9: 达到停止条件
输出:连接权与阈值确定的多层前馈神经网络
所谓逆传播其实就是从输出层开始逐步往后更新,因为输出层的误差确定后就可以对输出层的连接权和阈值进行更新,并且可以推算出隐含层输出的“真实值”,从而计算出隐含层的“误差”,然后更新隐含层的连接权和阈值。BP就是这样一种利用一层层倒推来最终更新整个神经网络的方法,每一层的更新公式其实和感知机用的是类似的。
在学习过程中,学习率 控制着每一轮迭代的更新步长,太大则容易振荡,太小则收敛速度太慢。有时为了精细调节,输出层和隐含层更新参数时会使用不同的学习率。
累积BP算法
BP算法的目标是最小化训练集 上的累积误差:
而标准BP算法每输入一个样例就进行一次更新,所以它的参数更新非常频繁,而且不同样例可能会对更新起到抵消效果,从而使得模型需要更多次迭代才能到达累积误差的极小点。
标准BP算法和累积BP算法的区别类似于随机梯度下降和标准梯度下降的区别。
如果把更新方式变为每输入一遍训练集进行一次更新,就得到累积BP算法,更新公式需要重新推导一下。这样更新一次就称为一轮(one round,亦称one epoch)学习。
使用累积BP算法时参数更新的频率要低得多,但是!在很多人任务中,累积误差在下降到一定程度后,进一步下降会非常缓慢。此时标准BP算法能更快地获得较好的解(特别是训练集 很大的时候)。
隐层神经元个数
已证明只需一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数。那么该怎样设置隐层神经元的个数呢?并不是越多越好,因为可能会出现过拟合问题而得不偿失。
目前尚未有成熟的理论可以确定怎样设置隐层神经元的个数还有隐层的层数。实际应用中主要靠试错法(trial-by-error)来调整,也即是不断改变设置,试验模型给出的应答,然后选择结果最好的。
过拟合问题
鉴于BP神经网络强大的表达能力,很容易会遇到过拟合问题。主要有以下两种应对策略:
- 早停(early stopping):把数据集分为训练集和验证集,若训练集误差降低但测试集误差升高,就停止训练,并返回具有最小验证集误差的连接权和阈值。
- 正则化(regularization):在目标函数中添加一个用于描述网络复杂度的部分,比如连接权和阈值的平方和。这样训练时就会偏好较小的连接权和阈值,从而令输出更“光滑”。带正则化项的目标函数如下:
%5Csumi%20w_i%5E2%0A#card=math&code=E%20%3D%20%5Clambda%5Cfrac%7B1%7D%7Bm%7D%5Csum%7Bk%3D1%7D%5Em%20E_k%20%2B%20%281-%5Clambda%29%5Csum_i%20w_i%5E2%0A&id=ufG95)
其中 是用于对经验误差和网络复杂度折中的参数,常通过交叉验证法来估计。