BP(反向传播)神经网络

这篇文章主要讨论神经网络的反向传播的细节,“误差”是如何反向传播的,我们又是如何利用梯度来优化参数的。

在学吴恩达机器学习视频的神经网络那节时,给出了许多公式,比如计算每层的误差,每层参数的梯度,但并没有给出推导过程,可能也是考虑入门级,大多人并不要知道其中含义就可以运用算法了。接下来我会给出详细的推导过程,帮助大家理解。

注意接下来所讲是未正则化的神经网络。

1 计算公式

1.1 正向传递

假设现在有一个三层的神经网络,如图:

BP(反向传播)神经网络_第1张图片

参数含义:

  • θ ( i ) \theta^{(i)} θ(i) i i i 层的参数矩阵
  • z ( l ) z^{(l)} z(l) l l l 层的输入
  • a ( l ) a^{(l)} a(l) l l l 层的输出

传递过程:

  • a ( 1 ) = x ​ a^{(1)}=x​ a(1)=x
  • z ( 2 ) = θ ( 1 ) a ( 1 ) z^{(2)}=\theta^{(1)}a^{(1)} z(2)=θ(1)a(1)
  • a ( 2 ) = g ( z ( 2 ) ) ( a d d    a 0 ( 2 ) ) a^{(2)}=g(z^{(2)}) (add\;a_0^{(2)}) a(2)=g(z(2))(adda0(2))
  • z ( 3 ) = θ ( 2 ) a ( 2 ) z^{(3)}=\theta^{(2)}a^{(2)} z(3)=θ(2)a(2)
  • h = a ( 3 ) = g ( z ( 3 ) ) h=a^{(3)}=g(z^{(3)}) h=a(3)=g(z(3))

其中 g g g 为sigmoid激活函数。

1.2 反向传播

我们用 δ ( l ) \delta^{(l)} δ(l) 表示每层的”误差“, y y y 为每个样本的标签, h h h 为每个样本的预测值。

吴恩达在课里面提到,”误差“的实质是 δ ( l ) = ∂ J ∂ z ( l ) \delta^{(l)}=\frac{\partial J}{\partial z^{(l)}} δ(l)=z(l)J ,没错,后面详细说明。

先来从后往前计算每层的“误差“。注意到这里的误差用双引号括起来,因为并不是真正的误差。

  • δ ( 3 ) = h − y \delta^{(3)}=h-y δ(3)=hy (1)
  • δ ( 2 ) = ( θ ( 2 ) ) T δ ( 3 ) g ′ ( z ( 2 ) ) \delta^{(2)}=(\theta^{(2)})^T\delta^{(3)}g^{'}(z^{(2)}) δ(2)=(θ(2))Tδ(3)g(z(2)) (2)

注意第一层是没有误差的,因为是输入层。

然后来计算每层参数矩阵的梯度,用 Δ ( l ) \Delta^{(l)} Δ(l) 表示

  • Δ ( 2 ) = a ( 2 ) δ ( 3 ) \Delta^{(2)}=a^{(2)}\delta^{(3)} Δ(2)=a(2)δ(3) (3)
  • Δ ( 1 ) = a ( 1 ) δ ( 2 ) \Delta^{(1)}=a^{(1)}\delta^{(2)} Δ(1)=a(1)δ(2) (4)

最后网络的总梯度为:

  • D = 1 m ( Δ ( 1 ) + Δ ( 2 ) ) D=\frac{1}{m}(\Delta^{(1)}+\Delta^{(2)}) D=m1(Δ(1)+Δ(2)) (5)

到这里反向传播就完成了,接着就可以利用梯度下降法或者更高级的优化算法来训练网络。

2 推导

这里只推导 δ    和    Δ \delta\;和\;\Delta δΔ 是怎么来的,其余的比较好理解。

首先明确我们要优化的参数有 θ ( 1 ) \theta^{(1)} θ(1) θ ( 2 ) \theta^{(2)} θ(2) ,利用梯度下降法的思想,我们只需要求解出代价函数对参数的梯度即可。

假设只有一个输入样本,则代价函数是:
J ( θ ) = − y l o g h ( x ) − ( 1 − y ) l o g ( 1 − h ) J(\theta)=-ylogh(x)-(1-y)log(1-h) J(θ)=ylogh(x)(1y)log(1h)
回顾下正向传递的过程,理解其中函数的嵌套关系:

  • a ( 1 ) = x ​ a^{(1)}=x​ a(1)=x
  • z ( 2 ) = θ ( 1 ) a ( 1 ) z^{(2)}=\theta^{(1)}a^{(1)} z(2)=θ(1)a(1)
  • a ( 2 ) = g ( z ( 2 ) ) ( a d d    a 0 ( 2 ) ) a^{(2)}=g(z^{(2)}) (add\;a_0^{(2)}) a(2)=g(z(2))(adda0(2))
  • z ( 3 ) = θ ( 2 ) a ( 2 ) z^{(3)}=\theta^{(2)}a^{(2)} z(3)=θ(2)a(2)
  • h = a ( 3 ) = g ( z ( 3 ) ) h=a^{(3)}=g(z^{(3)}) h=a(3)=g(z(3))

然后我们来求解代价函数对参数的梯度, ∂ ∂ θ ( 2 ) J ( θ ) \frac{\partial}{\partial \theta^{(2)}}J(\theta) θ(2)J(θ) ∂ ∂ θ ( 1 ) J ( θ ) \frac{\partial}{\partial \theta^{(1)}}J(\theta) θ(1)J(θ)

根据链式求导法则,可以计算得到:

BP(反向传播)神经网络_第2张图片

把我画红线的地方令为 δ ( 3 ) \delta^{(3)} δ(3) ,是不是就得到了反向传播中的公式(1)?

把画绿线的部分令为 Δ ( 2 ) \Delta^{(2)} Δ(2) ,就得到了公式(3)。我们接着算:

BP(反向传播)神经网络_第3张图片

同样把红线部分令为 δ ( 3 ) \delta^{(3)} δ(3) ,紫色部分令为 δ ( 2 ) \delta^{(2)} δ(2) ,就得到了公式(2)。

绿线部分令为 Δ ( 1 ) \Delta^{(1)} Δ(1) ,就得到了公式(4)。

至此,推导完毕。得到这个规律后,便可以应用到深层次的网络中,计算反向传播时就很方便了。

上面的公式因为书写麻烦,便只写了结果。如果你用笔去慢慢推几分钟,会发现其实很简单。


下面是大半年前给实验室做报告做的PPT,没想到现在重新学到这里,感觉许多小细节记不清,故温故一遍。
BP(反向传播)神经网络_第4张图片
BP(反向传播)神经网络_第5张图片
BP(反向传播)神经网络_第6张图片
BP(反向传播)神经网络_第7张图片
BP(反向传播)神经网络_第8张图片
BP(反向传播)神经网络_第9张图片
BP(反向传播)神经网络_第10张图片
BP(反向传播)神经网络_第11张图片
BP(反向传播)神经网络_第12张图片
BP(反向传播)神经网络_第13张图片
BP(反向传播)神经网络_第14张图片
BP(反向传播)神经网络_第15张图片
BP(反向传播)神经网络_第16张图片
BP(反向传播)神经网络_第17张图片BP(反向传播)神经网络_第18张图片BP(反向传播)神经网络_第19张图片

你可能感兴趣的:(MachineLearning)