【李宏毅机器学习笔记】BP算法

Backpropagation

神经网络中,我们利用梯度下降法来对损失函数进行优化,这在神经元数量不多的时候很有效。但是深层神经网络中,有上百万的参数需要调整,单纯使用梯度下降法可以算,但几乎不可能算完。因此我们需要更有效的方法来优化损失函数,这也就引出了反向传播(backpropagation)

链式法则

下图是多层神经网络的一个模型,现在我们要对损失函数L进行优化,即对其中每个参数求偏导。以图中三角部分为例,展开:

Backpropagation

假设该部分的模型函数如下:

z = w 1 x 1 + w 2 x 2 + b z=w_1x_1+w_2x_2+b z=w1x1+w2x2+b

z是即将输入给激活函数的值, w 1 w_1 w1 x 1 x_1 x1的权重, w 2 w_2 w2 x 2 x_2 x2的权重,b是偏置值,如下:

forward_backward_pass
根据链式法则,我们将损失函数(这里的C是整个损失函数中的某一个加项)对某一个 w w w的偏导,拆成了上图中的形式。

前/后向传播

就像上图中标出的那样,我们把 ∂ z ∂ w \frac{\partial z}{\partial w} wz,称为前向传播项;把 ∂ C ∂ z \frac{\partial C}{\partial z} zC,称为后向传播项。

1、前向传播

之所以 ∂ z ∂ w \frac{\partial z}{\partial w} wz称为前向传播,是因为它的值只和与参数直接相连的输入有关。例如在上图中, ∂ z ∂ w 1 = x 1 \frac{\partial z}{\partial w_1} = x_1 w1z=x1 ∂ z ∂ w 2 = x 2 \frac{\partial z}{\partial w_2} = x_2 w2z=x2

2、反向传播

∂ C ∂ z \frac{\partial C}{\partial z} zC是很复杂的,因为C和z并不直接相关,我们用链式法则对其可以继续分解(假设经过激活函数后的输出可表示为 a = σ ( z ) a=\sigma(z) a=σ(z)):

∂ C ∂ z = ∂ a ∂ z ∂ C ∂ a \frac{\partial C}{\partial z}=\frac{\partial a}{\partial z}\frac{\partial C}{\partial a} zC=zaaC

Backward_pass

其中 ∂ a ∂ z \frac{\partial a}{\partial z} za就是激活函数在z处的值,可以简单的表示为 σ ′ ( z ) \sigma^{'}(z) σ(z)。而 ∂ C ∂ a \frac{\partial C}{\partial a} aC又要求我们继续进行链式展开:

∂ C ∂ a = ∂ z ′ ∂ a ∂ C ∂ z ′ + ∂ z ′ ′ ∂ a ∂ C ∂ z ′ ′ \frac{\partial C}{\partial a}=\frac{\partial z^{'}}{\partial a}\frac{\partial C}{\partial z^{'}}+\frac{\partial z^{''}}{\partial a}\frac{\partial C}{\partial z^{''}} aC=azzC+azzC

很容易发现这是一个迭代的过程,因为我们总需要继续求解下一层的偏导数。这里我们先假设 ∂ C ∂ z ′ \frac{\partial C}{\partial z^{'}} zC ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z^{''}} zC已知,那么可以把最初的式子改写为:

∂ C ∂ z = σ ′ ( z ) [ w 3 ∂ C ∂ z ′ + w 4 ∂ C ∂ z ′ ′ ] \frac{\partial C}{\partial z}=\sigma^{'}(z)\left[w_3 \frac{\partial C}{\partial z^{'}} + w_4 \frac{\partial C}{\partial z^{''}} \right] zC=σ(z)[w3zC+w4zC]

下面这张图能够让你更好的理解,为什么它被称为“反向”传播。

为什么叫后向传播

如何继续计算

1、单隐层

如果,上图中红色的就是output层,那么我们上面给出的假设已知是成立的,因为此时:

∂ C ∂ z ′ = ∂ y 1 ∂ z ′ ∂ C ∂ y 1 \frac{\partial C}{\partial z^{'}}=\frac{\partial y_1}{\partial z^{'}}\frac{\partial C}{\partial y_1} zC=zy1y1C

∂ C ∂ z ′ ′ = ∂ y 2 ∂ z ′ ′ ∂ C ∂ y 2 \frac{\partial C}{\partial z^{''}}=\frac{\partial y_2}{\partial z^{''}}\frac{\partial C}{\partial y_2} zC=zy2y2C

y与z之间的关系,由激活函数得出;而C与y之间的关系,正是你定义的损失函数,这些偏导都是已知的。

2、多隐层

那如果红色的之后还有很多层,我们其实只需要继续迭代,直到达到output层即可。我们可以想象成有一个逆向的神经网络,其优化过程如下:

逆向网络

总结

BP算法分为三个步骤(对某一个参数):

  1. forward pass。正向求取各个 ∂ z ∂ w = a \frac{\partial z}{\partial w}=a wz=a
  2. backward pass。反向求取各个 ∂ C ∂ z \frac{\partial C}{\partial z} zC
  3. combine。 a × ∂ C ∂ z = ∂ C ∂ w a \times \frac{\partial C}{\partial z} = \frac{\partial C}{\partial w} a×zC=wC
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值