Bootstrap

反向传播与梯度下降


前言

之前对反向传播和梯度下降一直不太通透,感觉理解的很模糊,理解层次仅仅局限在概念上。因此为了能够对反向传播和梯度下降的具体的原理和计算过程有一个清晰的认识,本人又去重温一遍李宏毅老师的课,在此将学习过程和自己的见解记录在此。


一、梯度下降(Gradient Descent)

Alt
神经网络的参数用 θ \theta θ 表示,选一个初始的参数 θ 0 \theta ^{0} θ0 ,然后计算 θ 0 \theta ^{0} θ0对loss function的gradient,也就是计算神经网络中每一个参数对loss function的偏微分,计算出来所有参数的偏微分之后,得到一个向量,然后就可以更新网络的参数。更新一次参数就可以得到 θ 1 \theta ^{1} θ1 ,更新两次就得到 θ 2 \theta ^{2} θ2 ,然后不断更新直到找到那组让loss最小的参数。
但是计算gradient descent的时候,梯度神经网络有无比庞大的数量的参数,因此如何有效的计算loss对每个参数偏导是最大的困难,而backpropagation(反向传播)正好可以解决了计算大量参数梯度的效率问题。

二、链式法则(chain rule)

反向传播中用到的数学就是链式法则,为了更好的理解反向传播,这里简单介绍一下链式法则。
Alt
Case1:在这里, y y y是关于 x x x的函数, z z z是关于 y y y的函数,因此给 x x x一个变化,则 y y y会变化
进而 z z z也会跟着变化。如果计算 x x x z z z的微分的话,可以拆成两项,分别是 y y y z z z的微分和 x x x y y y的微分, y y y z z z的微分和 x x x y y y的微分相乘就得到 x x x z z z的微分。

Case2:在这里,有三个函数, x x x是关于 s s s的函数, y y y是关于 s s s的函数, z z z是关于 x x x y y y的函数。这时如果 s s s变化了,则 x x x y y y会跟着变化,进而 z z z也会因为 x x x y y y的变化而变化。如果计算 s s s z z z的微分的话,因为 s s s是通过两条路径去影响 z z z的,可以通过 x x x去影响 z z z,也可以通过 y y y去影响 z z z,所以 x x x z z z的微分,就可以根据两条通路拆成两项,然后加起来就是 s s s z z z的微分。

三、反向传播(backpropagation)

在这里插入图片描述
反向传播是为了方便计算每个参数的梯度,所以反向传播只能算是梯度下降算法中的一步准备工作,反向传播的整个计算过程又可以分为两步,forward pass和backward pass两步。

1.forward pass(前向模式)

在这里插入图片描述
forward pass 就是在每一次计算中记录下来这次计算对参数的梯度,如上图。在计算的过程中保留这些梯度以供后面的backward pass使用。

2.backward pass

在这里插入图片描述
通过计算z对C的偏导,可以得到上述公式,下面我们可以将这个公式抽象成下面的步骤。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9a02f9a0030d4b07a74a4b705eeaf83f.png在这里插入图片描述

现在我们将前向计算的过程抽象成了反向计算的过程,现在是不是有反向传播的味道了!!!
下面以一个有六个神经元的例子来说明这个计算过程。
在这里插入图片描述
从后往前挨个计算loss对z的偏微分,是很好计算的,然后根据在forward pass中保存的微分计算,就可以往前推出所有的loss对前面的z的偏微分,一直向前推就可以将所有的loss对z的偏微分计算出来,这时就可以计算出任意参数对loss的导数了。

3.summary

在这里插入图片描述
forward pass和backward pass计算的结果相乘就是我们要计算的参数的梯度。


总结

反向传播是为了计算每个参数对loss的导数的;反向传播中的forward pass是为了保留计算图中的任意一次计算的w对z 的导数的,这样在backward pass计算的时候就可以根据forward pass计算的导数计算出来loss对w的导数。
梯度下降是利用反向传播计算出来的所有参数的梯度更新参数的。

;