反向传播算法

我们希望有个算法,能够让我们找到权重和偏置,以至于神经网络的输出y(x)y(x)能够拟合所有的训练输入xx。为了量化我们如何实现这个目标,我们定义一个代价函数:

C(w,b)=12nxy(x)aL(x)2 C(w,b)=\frac{1}{2n}\displaystyle\sum_{x}||y(x)-a^L(x)||^2

这里ww表示所有网络中权重的集合,bb是所有的偏置,nn是训练输入数据的个数,LL表示网络的层数,aL=aL(x)a^L=a^L(x)是表示当输入为xx时的网络输出的激活值向量,求和则是在总的训练输出xx 上进行的。符号v||v||是指向量vv的模。我们把CC称为二次代价函数;有时也别称为均方误差或者MSE

代价函数C(w,b)C(w,b)是非负的,因为求和公式中的每一项都是非负的。此外,当对于所有的训练输入xx y(x)y(x)接近于输出aa时,代价函数的值相当小,即C(w,b)0C(w,b)\approx0

反向传播算法给出了一个计算代价函数梯度的的方法:

  1. 输入xx:为输入层设置对应的激活值a1a^1
  2. 前向传播:对每个l=2,3,...,Ll=2,3,...,L计算相应的的zl=wla(l1)+blz^l=w^l\cdot a^{(l-1)} + b^lal=σ(zl)a^l = \sigma(z^l)
  3. 输出层误差δL\delta^L:计算向量δL=aCσ(zL)\delta^L=\nabla_aC \bigodot\sigma'(z^L)
  4. 反向误差传播:对每个l=L1,L2,...,2l= L-1, L-2, ..., 2,计算δl=((w(l+1)T)δ(l+1))σ(zL)\delta^l=(({w^{(l+1)}}^T)\delta^{(l+1)})\bigodot\sigma'(z^L)
  5. 输出:代价函数的梯度由CWjkl=akl1δjl\frac{\partial C}{\partial W^l_{jk}}=a^{l-1}_k\delta^l_jCbjl=δjl\frac{\partial C}{\partial b^l_{j}}=\delta^l_j得出。

反向传播算法的证明

两个假设

反向传播算法的目标是计算代价函数CC分别关于wwbb的偏导数CWjkl\frac{\partial C}{\partial W^l_{jk}}Cbjl\frac{\partial C}{\partial b^l_{j}}。为了让方向传播可行,我们需要做出关于代价函数的两个主要假设。

第一个假设就是代价函数可以被写成一个在每个训练样本xx上的代价函数CxC_x的均值C=1nxCxC=\frac{1}{n}\displaystyle\sum_{x}C_x。对于二次代价函数,每个独立的训练样本的代价是Cx=12y(x)aL(x)2C_x=\frac{1}{2}||y(x)-a^L(x)||^2,这个假设对于其他的代价函数也必须满足。需要这个假设的原因是反向传播实际上是对一个独立的训练样本计算了Cxw\frac{\partial C_x}{\partial w}Cxb\frac{\partial C_x}{\partial b},然后通过在所有的训练样本上进行平均化获得Cw\frac{\partial C}{\partial w}Cb\frac{\partial C}{\partial b}

第二个假设就是代价可以写成神经网络输出的函数

如图所示,将代价函数CC看成仅有输出激活值aLa^L的函数。

Hadamard乘积

Hadamard 乘积是按元素乘法的运算

[12][34]=[1324]=[38] \begin{bmatrix} 1 \\ 2 \end{bmatrix} \odot \begin{bmatrix} 3 \\ 4 \end{bmatrix}=\begin{bmatrix} 1*3 \\ 2*4 \end{bmatrix} =\begin{bmatrix} 3 \\ 8 \end{bmatrix}

假设sstt是两个相同维度的向量,那么我们使用sts \odot t 来表示按元素的乘积。所以sts \odot t 的元素就是(st)j=sjtj(s \odot t )_j=s_jt_j

反向传播的四个基本方程

反向传播其实是对权重和偏置变化影响代价函数过程的理解。最终的含义就是计算偏导数CWjkl\frac{\partial C}{\partial W^l_{jk}}Cbjl\frac{\partial C}{\partial b^l_{j}}。为了计算这些值,我们先引入一个中间量δjl\delta^l_j,这个称之为在lthl^{th}的第jthj^{th}个神经元上的误差。反向传播将给出计算误差δjl\delta^l_j的流程,然后将其关联到计算上面两个偏导数上面。

假定在lthl^{th}层的第jthj^{th}神经元上,对神经元的带权输入增加很小的变化Δzjl\Delta z^l_j,这使得神经元的输出由σ(zjl)\sigma(z^l_j)变成σ(zjl+Δzjl)\sigma(z^l_j+\Delta z^l_j),这个变化会向网络后的层进行传播,最终导致整个代价产生CzjlΔzjl\frac{\partial C}{\partial z^l_j} \Delta z^l_j的改变。 假如Czjl\frac{\partial C}{\partial z^l_j}是一个很大的值(或正或负),那么可以通过选择与其相反的符号的Δzjl\Delta z^l_j来降低代价。相反如果Czjl\frac{\partial C}{\partial z^l_j}是一个接近于00的值,这时候并不能通过调整输入zjlz^l_j来改善多少代价。所以这里有个启发式的认识,Czjl\frac{\partial C}{\partial z^l_j}是神经元的误差度量。

按照上面的描述,我们定义lthl^{th}层的第jthj^{th}个神经元的上的误差δjl\delta^l_j

δjl=Czjl \delta^l_j=\frac{\partial C}{\partial z^l_j}

我们使用δl\delta^l表示关联于ll层的误差向量。

接下来我们介绍四个基本方程。

results matching ""

    No results matching ""