在学习神经网络的过程中一直理解不了反向传播的思想,故参考吴恩达老师的神经网络公开课重新学习进行总结。如有错误的地方望大佬指正。
要理解反向传播的话不可避免的就是理解导数的概念,并会求导。但想要理解反向传播,并不需要特别强的求导能力,只需了解简单的求导即可。
首先我们假设有一个函数F(a)=3a。
a = 2, f(a) = 6
a = 2.0001, f(a) = 6.0003
如图,当a扩大了0.001,f(a)扩大了0.003。
此时我们观察绿色的三角形,根据我们高中学过的斜率公式来表示。
也就是说,当a=2时,斜率是3。这意味着,当a扩大0.001时,我们的f(a)将扩大其3倍也就是0.003。
导数也可以称为斜率或变化率,如果我们了解导数公式的话,可以轻易的算出来F(a)的导数。
小结: 导数可以简单理解为,当我们的一个函数x增加了α,y就相应的增加(导数*α)。
当我们了解导数以后,接下来就是了解梯度下降。
直观的讲,梯度下降法就是让计算机去猜你的参数,假设我们有一个公式。 那么我们要找的就是参数w和b,怎么找呢?
我们最简单的想法就是通过计算机去暴力求解,去尝试所有的可能,然后判断哪个值使损失最小,那个值就是我们的最优解。
但如果这样的话,哪怕计算机现在已经速度非常快了,但当你的参数变多了以后,时间也是成几何倍的增长的。
在机器学习算法中,我们需要最小化损失函数,此时我们就可以通过梯度下降法一步步进行迭代求解,直到找到使损失函数最小的参数。
梯度是什么?梯度就是导数,就是斜率。
那根据高数老师讲过的
导数大于0的点一定在定义域上单调递增。
那么最小值肯定是小于这个点的,那么下一次进行预测的时候,我们就去猜比这个数小的点(我们的目的就是找到最小值的点呀)。
画个图其实就理解了。
假设我们有一个损失函数,F(w),初始点为P1
当想要最小化损失函数的话,我们需要让P1向着P2移动并接近最小值点O,这个移动的距离就是我们的斜率。
此时我们定义一个学习速率α,来帮助我们进行梯度下降,这个α可以理解成我们改变的量,这个值可以通过我们自己来定义。
通过 对w进行迭代。
每一次更新w都会变小,且使函数越来越接近点O。
同理当我们的初始点在点O左侧时候,因为我们的导数为负,所以同理。
通过梯度下降使我们的损失函数越来越接近点O。
小结: 梯度下降总结起来其实就是猜参数,使我们在机器学习和神经网络中的最终目标,目标函数|损失函数|误差函数等,求他们最小值点x,使其最小化让模型更加完美。
了解了梯度下降,接下来就继续讨论反向传播了,不过在讨论反向传播之前,我们需要先讨论一下前向传播。
我们可以看到有三个输入 x1,x2,x3,我们一般将上图这种神经网络划分为几层,输入层为L0,第二层为隐藏层L1,第三层为输出层L2,所以我们可以将上图神经网络称为“三层的神经网络”,但一般都称为双层神经网络,因为输入层一般不计算在内。
假设我们有一个函数 :
计算过程:
画图表示:
这个其实就是前向传播的思想,只不过我们用的是一个比较简单的函数。当我们的输入特征和层数变多了以后,也是同样的方法在计算机里面进行计算。
不管我们的模型如何设计,前向传播只需要一步步计算下去就可以得到一个结果,但这个结果不一定是我们想要的结果。
在最开始的时候我们曾经说过一个公式 现在我们画一个三层的神经网络
根据最小化损失函数的思想,我们需要确定b1和b2的最优参数,此时就需要进行反向传播。
根据上面讨论梯度下降的思想,我们求参数的方法就是求导,反向传播也是同理。
v = 11, J = 33
v = 11.001, J = 33.003
可知:
同理
a = 5, v = 11, J=33
a = 5.001, v = 11.001, J=33.003
可知:
在高数的多元微分里面,这个方法叫做链式求导法则。
先列一下逻辑回归的公式
我们这时候根据上图开始导数
再向后一步计算
计算
在计算导数后,我们就可以直接通过 来迭代参数,调优模型效果,其他参数也同理可得。
综上所述,反向传播简单来讲就是一个链式求导,通过链式求导来确定参数进行调参(这里指参数而非超参数)来确定最佳的参数。上面我们讨论的是简单情况,在实际的模型中,我们一般可能会用到多层神经网络,但归根结底其实还是进行求导,理解了导数的定义也就理解了什么是反向传播。
下面是吴恩达老师的公开课
其实可以看出来,对参数的调整就是一直在求导并调整的过程。
梯度下降法和反向传播对于机器学习和深度学习领域起到了极大的推进作用,他帮助我们可以更好更方便的去调整参数从而获得更好的模型效果。
反向传播其实就是梯度下降法在神经网络上的具体实现方式。
在漫长的跑模型的过程中,向量化对于神经网络的贡献也是不可磨灭的,他帮助我们极大的加快了模型的运算速度,从而帮助工程师更好的构建模型。