Backpropagation反向传播算法【总结】

概念介绍

Backpropagation本质上就是一个提升Gradient Descent效率的算法,核心在于其可以有效率地计算出一个偏移量来update下一组未知参数。

难点在于:Neural Network有很多层,而且每层参数都非常多,所以不能立即算出来该组未知参数的偏微分,如果只有一层当然可以快速计算,无需使用Backpropagation进行优化

推理步骤

1.Loss function定义:L(θ)=∑n=1NCn(θ)L(\theta)=\displaystyle\sum_{n=1}^NC^n(\theta)L(θ)=n=1NCn(θ)
在这里插入图片描述
CnC^nCn是一个function,代表模型计算出来的值yny^nyn和真实的值y^n\widehat{y}^nyn的距离,两个向量之间的距离。在所有参数θ\thetaθ已知的情况下yny^nyn也是一个已知量,那么他们之间的距离也是一个已知量(是通过CnC^nCn计算出来的一个已知量)

那么难点在于我们要求θ\thetaθ的偏微分

2.对w进行偏微分

这些未知参数用w来表示,b在计算微分的时候无用所以忽略

∂L(θ)∂w=∑n=1N∂Cn(θ)∂w\dfrac{{\partial}L(\theta)}{\partial{w}}=\displaystyle\sum_{n=1}^N\dfrac{{\partial}C^n(\theta)}{\partial{w}}wL(θ)=n=1NwCn(θ)

3.先考虑一个Neuron
在这里插入图片描述

(1)假设w只有2个w1和w2,并且n=1,现在要计算∂C∂w\dfrac{{\partial}C}{\partial{w}}wC

∂C∂w=∂z∂w∂C∂z\dfrac{{\partial}C}{\partial{w}}=\dfrac{{\partial}z}{\partial{w}}\dfrac{{\partial}C}{\partial{z}}wC=wzzC
(两个z的偏微分可以约掉,所以可以写成这样)

其中计算∂z∂w\dfrac{{\partial}z}{\partial{w}}wz叫做【Forward pass】,计算∂C∂z\dfrac{{\partial}C}{\partial{z}}zC叫做【Backword pass】

(2)求解∂z∂w\dfrac{{\partial}z}{\partial{w}}wz

假设w只有2个w1和w2

我们发现:w1的微分就是x1x_1x1;w1的微分就是x2x_2x2

∂z∂w=x1+x2\dfrac{{\partial}z}{\partial{w}}=x_1+x_2wz=x1+x2

如果我们知道输入,那可以很快求出任何一个w在activation function上的偏微分就是他的输入
在这里插入图片描述
第一层的输入x是已知量,第二层的输入也是可以通过activation function计算出来

现在已经解决了∂z∂w\dfrac{{\partial}z}{\partial{w}}wz,还需要解决的是∂C∂z\dfrac{{\partial}C}{\partial{z}}zC

(2)求解∂C∂z\dfrac{{\partial}C}{\partial{z}}zC

假设输出只有2个z
在这里插入图片描述

如图假设a是sigmoid function通过z计算出来的

因为∂C∂z=∂a∂z∂C∂a\dfrac{{\partial}C}{\partial{z}}=\dfrac{{\partial}a}{\partial{z}}\dfrac{{\partial}C}{\partial{a}}zC=zaaC,所以我们现在需要求后面两个偏微分

∂a∂z\dfrac{{\partial}a}{\partial{z}}za是很容易求出来的,因为是一个已知的激活函数sigmoid function,在进行forward pass计算的时候z就是一个已知量了,那么∂a∂z\dfrac{{\partial}a}{\partial{z}}za就可以当做一个常量

那么就只剩下∂C∂a\dfrac{{\partial}C}{\partial{a}}aC,它等于a在z1z^1z1上的偏微分加上其他其他输出a在z上的微分,那么如图很容易知道∂z′∂a=w3\dfrac{{\partial}z^{'}}{\partial{a}}=w^3az=w3∂z′′∂a=w4\dfrac{{\partial}z^{''}}{\partial{a}}=w^4az′′=w4

根据后面节点的微分就可以得到当前节点的微分,如下:
在这里插入图片描述

现在就只剩下∂C∂z′\dfrac{{\partial}C}{\partial{z^{'}}}zC需要求解了,上面只讨论了两层,但实际上有很多层,现在就是求解下面这个模型,下面这个模型和上面的求解是一样的,继续往下分解即可。

但是继续往下分解那不就是和一般的Gradient Descent一样了么?
在这里插入图片描述
我们发现正向的求解过程和逆向的求解过程完全一样
在这里插入图片描述
如果我们知道了∂C∂za\dfrac{{\partial}C}{\partial{z_a}}zaC∂C∂zb\dfrac{{\partial}C}{\partial{z_b}}zbC,就很容易求出∂C∂z′\dfrac{{\partial}C}{\partial{z^{'}}}zC

假设ZaZ_aZa已经是最后一层,那么是可以通过y来计算出ZaZ_aZa的微分,从而可以往上计算出所有的微分。

如果我们反向计算,那么效率就会高很多,之前是通过x往后计算,现在通过y往前计算,因为x是已知量y也是已知量,所以可以建立一个反向的Neural Network
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
那么现在我们可以很容易知道任何一个w的偏微分,然后就可以算出下一个w’的值
在这里插入图片描述

个人总结

一般的Gradient Descent是从上往下计算偏微分,但在一个函数里面不仅要展开当前层所有的Neuron,而且每个Neuron还要继续展开下一层所有的Neuron,直到最后一层。这样效率是不高的,主要是递归计算带来的开销。

那么优化方案就是递归改递推,就好像算法中【递归】改成【动态规划】,效率会提高很多倍,不仅每次计算的结果不会丢,而且没有栈溢出的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值