今日学习——反向传播(Back Propagation算法BP算法)

在学习神经网络的过程中,反向传播过程对初学者来说可能是比较难的部分,因为该过程有复杂的公式推导,对于非理科背景的同学来讲或许理解起来有些难度。

所以我根据自身阅读的大量文章,尝试用比较简明的语言来解释和推导一下反向传播过程,希望对你有所帮助~

什么是反向传播/为什么要进行反向传播

前向传播和反向传播是神经网络进行参数优化运算时必不可少的两个步骤。

前向传播是指:神经网络前一层的输出作为下一层神经元的输入,带入去计算下一层的输出并且不断前进,直到得到整个神经网络的输出。

反向传播与之对应,是指:每次前向传播过程结束得到整个网络的输出后,计算神经网络输出和真实样本标记之间的差距作为损失函数,并以此损失函数反过来从网络的输出层开始往网络的输入层不断计算各层参数的梯度的方法。看似它叫反向传播算法,其实它本质上是一种计算神经网络各层参数梯度的方法,通过该方法得到参数梯度之后,才会利用梯度下降、随机梯度下降等方法进行参数更新。

所以总结一下就是:通过前向传播从输入数据得到神经网络的输出,然后通过反向传播不断向前求梯度,得到神经网络的输出对于参数的梯度,然后根据求得的梯度,使用梯度下降算法更新网络参数。

计算过程

以一个很简单的单层全连接神经网络为例,来推导反向传播的过程。这个明白了的话,再复杂的神经网络原理都是一样的。

网络结构如下:

center

定义一下参数符号:

w i j w_{ij} wij:表示 h i h_i hi 对于 x j x_j xj 的权重项, b i b_i bi :表示 h i h_i hi 的偏置项

w 1 w_1 w1:表示输出层的线性过程对于 h 1 h_1 h1 的权重, w 2 w_2 w2:表示输出层的线性过程对于 h 2 h_2 h2 的权重

前向传播过程如下:

输入层 → \rightarrow 隐藏层:
h 1 = w 11 x 1 + w 12 x 2 + w 13 x 3 + b 1 h 2 = w 21 x 1 + w 22 x 2 + w 23 x 3 + b 2 (1) h_1 = w_{11}x_1 + w_{12}x_2 + w_{13}x_3 + b_1\\ h_2 = w_{21}x_1 + w_{22}x_2 + w_{23}x_3 + b_2 \tag{1} h1=w11x1+w12x2+w13x3+b1h2=w21x1+w22x2+w23x3+b2(1)
隐藏层 → \rightarrow 输出层:(先进行一次线性过程,再进行一次激活)
z = w 1 h 1 + w 2 h 2 y = f ( z ) (2) z = w_1h_1 + w_2 h_2\\ y = f(z)\tag{2} z=w1h1+w2h2y=f(z)(2)
(这里在隐藏层 h h h 层没有加激活层函数,只用了简单的线性过程,另外输出层激活函数的具体函数形式也没有给出,用 f ( x ) f(x) f(x)表示,便于后续推导过程简洁)

反向传播求梯度:

现在,根据上一节讲的,有了网络的输出了,我们要计算一个损失函数对吧,这里我们就用平方损失吧。

假定,输入 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 对应的真实的输出为 Y Y Y,网络的预测输出为 y y y,那么损失函数为:
J ( θ ) = 1 2 ( y − Y ) 2 (3) J(\theta) = \frac{1}{2}(y-Y)^2\tag{3} J(θ)=21(yY)2(3)
这里 θ \theta θ 代指网络中的参数, y y y 是根据上面 ( 1 ) (1) (1) ( 2 ) (2) (2) 计算得到的。

下面我们根据损失函数来对各个权重和偏置求梯度。

在计算之前,我们先来复习一下求导的链式法则

对于函数 f ( g ( x ) ) f(g(x)) f(g(x)),要求 f f f 对于 x x x 的导数,可以利用链式法则,记 z = g ( x ) z = g(x) z=g(x) ,则有:
d d x f ( z ) = d f d z d z d x \frac{d}{dx}f(z) = \frac{d{f}}{dz}\frac{d z}{dx} dxdf(z)=dzdfdxdz
(求偏导链式法则也一样)

好,现在先来计算损失函数对于 w 1 , w 2 w_1,w_2 w1,w2 的梯度。

对于 w 1 w_1 w1,根据链式法则:
∂ J ( θ ) ∂ w 1 = ∂ J ( θ ) ∂ y ∗ ∂ y ∂ w 1 \frac{\partial J(\theta)}{\partial w_1} =\frac{\partial J(\theta)}{\partial y}* \frac{\partial y}{\partial w_1} w1J(θ)=yJ(θ)w1y
根据 ( 1 ) (1) (1) ( 2 ) (2) (2) ( 3 ) (3) (3) 式的计算,可以得到上式两个偏导,进而得到结果:
∂ J ( θ ) ∂ w 1 = ( y − Y ) ∗ d y d z ∗ ∂ z ∂ w 1 = ( y − Y ) ∗ f ′ ( z ) ∗ h 1 \begin{align} \frac{\partial J(\theta)}{\partial w_1} & = (y - Y) * \frac{d y}{dz} * \frac{\partial z}{\partial w_1}\\ & = {\color{red}(y - Y) * f'(z)} * h_1 \end{align} w1J(θ)=(yY)dzdyw1z=(yY)f(z)h1
同理,可以求得 w 2 w_2 w2 的梯度为:
J ( θ ) ∂ w 2 = ( y − Y ) ∗ f ′ ( z ) ∗ h 2 \frac{J(\theta)}{\partial w_2} = {\color{red}(y-Y) * f'(z)} * h_2 w2J(θ)=(yY)f(z)h2

可以看到,关于 w 1 w_1 w1 w 2 w_2 w2 的梯度中,有一部分是一样的,所以其实在实际的计算过程中,不需要每次都计算这些重复的结果,只需要计算一次,然后将其保存下来,之后用到的话直接使用即可。其他层的参数的梯度也是一样,也有很多相同的部分,下面来看看。

对于 w 11 w_{11} w11,根据链式法则求梯度的过程如下
∂ J ( θ ) ∂ w 11 = ∂ J ( θ ) ∂ y ∗ d y d z ∗ ∂ z ∂ h 1 ∗ ∂ h 1 ∂ w 11 = ( y − Y ) ∗ f ′ ( z ) ∗ w 1 ∗ x 1 \begin{align} \frac{\partial J(\theta)}{\partial w_{11}} & = \frac{\partial J(\theta)}{\partial y} * \frac{d y}{dz} * \frac{\partial z}{\partial h_1} * \frac{\partial h_1}{\partial w_{11}}\\ & = {\color{red}(y-Y) * f'(z)} * {\color{blue}w_1} * x_1 \end{align} w11J(θ)=yJ(θ)dzdyh1zw11h1=(yY)f(z)w1x1
同理,对于 w 12 w_{12} w12,可以求得梯度为:
∂ J ( θ ) ∂ w 12 = ∂ J ( θ ) ∂ y ∗ d y d z ∗ ∂ z ∂ h 1 ∗ ∂ h 1 ∂ w 12 = ( y − Y ) ∗ f ′ ( z ) ∗ w 1 ∗ x 2 \begin{align} \frac{\partial J(\theta)}{\partial w_{12}} & = \frac{\partial J(\theta)}{\partial y} * \frac{d y}{dz} * \frac{\partial z}{\partial h_1} * \frac{\partial h_1}{\partial w_{12}}\\ & = {\color{red}(y-Y) * f'(z)} * {\color{blue}w_1} * x_2 \end{align} w12J(θ)=yJ(θ)dzdyh1zw12h1=(yY)f(z)w1x2
其他的都是一样的道理,就不一一计算了。

这里可以看到,在计算 h 1 h_1 h1 对于三个输入的梯度时,得到的结果前面的部分都是一样的,并且前面的部分里面,有一部分是“前一层”的计算结果(这里的“前一层”不是真正网络的前一层,而是在反向传播过程中在当前层前一步计算的那一层,实际在网路中应该是当前层的后一层)。不难想象,在计算 h 2 h_2 h2 对于三个输入的梯度时,也会有一部分是一样的,并且其中还会有一部分是由“前一层”计算得到。

网络的层数再多,激活函数再复杂,反向传播过程也就是这个样子,只不过是参数量多了而已。

当然,我这里没有在隐藏层加激活函数,实际上隐藏层经过线性过程之后还要经过一个激活函数。但是我在最后一层加了激活函数,道理都是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值