反向传播(Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(e.g., 梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。
BP 在前向传播过程计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。
用 θ 表示模型要学习的参数,J 表示损失函数,η 表示学习率,BP 的更新公式为:
θ=θ−η∂θ∂JBP 求解的是 ∂θ∂J,即损失函数相对于参数的偏导数。这里的 ∂θ∂J 是一个向量,它的每个元素是 ∂θi∂J,即损失函数相对于参数 θi 的偏导数。
考虑一个简单的三层网络,如下图所示:
假定:
- 输入层有 n 个神经元,输出层有 m 个神经元,隐藏层有 h 个神经元。
- xi1 表示输入的第 i 个特征,x1 表示输入层的输入,x1=[x11,x21,⋯,xn1]。
- yi 表示输出层的第 i 个输出,y=[y1,y2,⋯,ym]。
- wjkl 表示第 l−1 层的第 k 个神经元到第 l 层的第 j 个神经元的权重。
- bjl 表示第 l 层的第 j 个神经元的偏置。
- zjl 表示第 l 层的第 j 个神经元的输入,zjl=∑k=1nwjklakl−1+bjl。
- ajl 表示第 l 层的第 j 个神经元的输出,ajl=σ(zjl),其中 σ 表示激活函数。
为方便起见,用均值平方误差(Mean Squared Error,MSE)作为损失函数,即: J=2m1∑i=1m(yi−ail)2,用 Sigmod 作为激活函数。
首先,前向传播的计算方式如下:
zjlajl=k=1∑nwjklakl−1+bjl=σ(zjl)直觉:获得最终模型的输出结果 ajl 之后,它跟真实结果的误差为 yj−ajl,损失函数为 J=2m1∑i=1m(yi−ail)2。理想状态下,模型完美拟合,误差为 0,即 J=0。但是,实际上模型的输出结果 ajl 与真实结果 yj 之间的误差是不可避免的,这时我们可以利用损失来指导模型的学习,即通过调整模型的参数,使得损失函数 J 最小化。
四大步骤:
- 计算损失函数 J 相对于输出层的偏导数 ∂ajl∂J (上标 l 指第 l 层网络)。
- 计算损失函数 J 相对于输出层的输入 zjl 的偏导数 ∂zjl∂J。
- 计算损失函数 J 相对于输出层的权重 wjkl 的偏导数 ∂wjkl∂J。
- 计算损失函数 J 相对于输出层的偏置 bjl 的偏导数 ∂bjl∂J。
第一步,计算损失函数 J 相对于输出层的偏导数 ∂ajl∂J:
∂ajl∂J=∂ajl∂2m1i=1∑m(yi−ail)2=2m1i=1∑m∂ajl∂(yi−ail)2=2m1i=1∑m2(yi−ail)∂ajl∂(yi−ail)=m1i=1∑m(yi−ail)∂ajl∂(−ail)=m1i=1∑m(yi−ail)(−1)=m1i=1∑m(ail−yi)写成向量形式,即: ∂al∂J=m1(al−y),其中 al=[a1l,a2l,⋯,aml],y=[y1,y2,⋯,ym]。计算这一层的意义:当输出层的输出 ajl 增加 1 个单位时,损失函数 J 的变化量是 ∂ajl∂J。
第二步,计算损失函数 J 相对于输出层的输入 zjl 的偏导数 ∂zjl∂J:
∂zjl∂J=∂ajl∂J∂zjl∂ajl=m1i=1∑m(ail−yi)∂zjl∂σ(zjl)=m1i=1∑m(ail−yi)σ′(zjl)=m1i=1∑m(ail−yi)σ(zjl)(1−σ(zjl))=m1i=1∑m(ail−yi)ajl(1−ajl)第三步,计算损失函数 J 相对于输出层的权重 wjkl 的偏导数 ∂wjkl∂J:
∂wjkl∂J=∂zjl∂J∂wjkl∂zjl=m1i=1∑m(ail−yi)ajl(1−ajl)∂wjkl∂(k=1∑nwjklakl−1+bjl)=m1i=1∑m(ail−yi)ajl(1−ajl)akl−1第四步,计算损失函数 J 相对于输出层的偏置 bjl 的偏导数 ∂bjl∂J:
∂bjl∂J=∂zjl∂J∂bjl∂zjl=m1i=1∑m(ail−yi)ajl(1−ajl)∂bjl∂(k=1∑nwjklakl−1+bjl)=m1i=1∑m(ail−yi)ajl(1−ajl)真正需要更新的是 wjkl 和 bjl,前两项的计算是为了计算后两项。我们可以将上面的公式写成向量形式:
∂wl∂J∂bl∂J=m1(al−1)T(al−y)⊙σ′(zl)=m1i=1∑m(ail−yi)⊙σ′(zl)其中,⊙ 表示向量的逐元素相乘,σ′(zl) 表示向量 zl 中每个元素的激活函数的导数。
最后,我们可以得到 BP 的更新公式:
wlbl=wl−η∂wl∂J=bl−η∂bl∂J其中,η 表示学习率。