反向传播算法 BackPropagation ,简称BP算法。常用于训练多层神经网络,那么它到底传播了个啥?又是怎么传播的呢?
我们知道,对于一个机器学习算法,其最终预测出的值与实际值一般会存在差异,那么我们定义这个差异为误差E。算法中有若干参数需要学习,那么怎么学习呢?以什么策略去变化参数,使得预测值更接近真实值呢?
这就是采用BP算法的初衷,我们知道预测值是由所有参数与相连的输入运算后得到的,也就是说预测值与真实值之间的误差E其实是与每个参数相关的,可以认为误差是由每个参数造成的,因此我们试图将误差进行反向传播,计算每个参数引起的误差大小,以此为依据来更新参数,使得重新进行前向传播计算出的预测值越来越接近真实值,由此起到训练的作用。
从西瓜书中摘取示例网络的图片来计算BP的过程:
注:该图示中输入层在最下面,输出层在最上面。我们可能更习惯输入层在左侧,输出层在右侧。如下图所示。
给定以上含一层隐层的神经网络,有 𝑑 个输入神经元、𝑞 个隐层神经元、𝑙个输出神经元。
给定:
训练集 ,即输入由 𝑑 个属性描述(𝑑 个𝑥),输出 𝑙 维实值向量(𝑙个𝑦)。
其中:
输出层第 𝑗 个神经元的阈值(偏置)用表示,
隐层第 ℎ 个神经元的阈值用 表示。
输入层第 𝑖 个神经元与隐层第 ℎ 个神经元之间的连接权重为,
隐层第 ℎ 个神经元与输出层第 𝑗 个神经元之间的连接权重为。
记隐层第 ℎ 个神经元接收到的输入为,
输出层第 𝑗 个神经元接收到的输入为,
其中为隐层第 ℎ 个神经元的输出,即
。
假设隐层和输出层的激活函数为Sigmoid函数(注:Sigmoid函数求导特性良好,见公式6)。
对训练集,假定神经网络的输出为
即:
则网络在上的均方误差为
(注:加是为了约掉平方求导得到的2。)
网络中需要更新的参数个数为个:输入层到隐层的
个权值、隐层到输出层的
个权值、 𝑞 个隐层神经元的阈值, 𝑙 个输出层神经元的阈值。
BP是一个迭代学习算法,在迭代的每一轮中,采用广义的感知机学习规则对参数进行更新估计。
对任意参数 𝑣 的更新公式为 ,
BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,对式子(2)的 ,给定学习率 𝜂 ,有
注意到, 先影响到第 𝑗 个输出层神经元的输入值
,再影响到其输出值
,然后影响到
,有
根据 定义,有:
Sigmoid函数的导数为:
于是根据式子(1)和(2),取出式(4)中的前两项并取负后设为(注:此处设为
是为了后面继续往前一层求导时复用此结果值,见式12第三行),有
将式(5)、(7)代入式子(4),再代入式(3)得到BP算法中关于的更新公式:
根据可以看出偏置
更新公式的计算方法与
类似,只需要特别注意相比
的式子(8)少了
而多了一个负号(
中的
),即:
又有:
其中:
注:
是因为输出层的各个元素都与
相连,需要综合影响。这也是式子(7)中设
的原因,保存中间值,加速上一层的计算,避免重复计算。另外,
将式子(11)中的部分值抽出来设为:
则得到:
同理得到,
注:需要特别注意的就是运算过程中的符号,是否需要
,中间结果的保存。
对于每一个训练样本,BP算法执行的步骤为:先将输入样本提供给输入层神经元,然后逐层将信号前传,指导产生输出层的结果;然后计算出输出层的误差,再将误差逆向传播到隐层神经元,最后根据隐层神经元的误差来对连接权重和阈值(偏量)进行调整。该过程为循环进行,直到满足某一过程为止。
如果直接能推理懂西瓜书中的内容,那就最好了。不过由于这个官方配图其实不太符合习惯而且没有标明偏置,所以我自己重新画了一遍并将原推理过程中省略的部分加上了,避免过程跳跃太快带来疑惑。
参考:
[1] 周志华, 机器学习, 北京: 清华大学出版社, 2016年1月.