该篇记录学习深度学习中相对复杂的概念。
梯度下降
概述
在深度学习中为了使模型达到最优值,需要通过迭代找到目标函数的最小值,或者收敛到最小值,这个步骤称为梯度下降。
形象化梯度
梯度下降法的基本思想可以类比为一个下山的过程。
假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了。
梯度计算
梯度下降的基本过程就和下山的场景很类似。
首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向(在后面会详细解释)。所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。那么为什么梯度的方向就是最陡峭的方向呢?接下来,我们从微分开始讲起:
α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号;那么如果时上坡,也就是梯度上升算法,当然就不需要添加负号了。
实例与代码见
link
链式法则
复合函数
已知函数y=f(u),当u表示为u=g(x)时,y作为x的函数就可以表示为y=f(g(x))这样的嵌套结构,这种嵌套结构的函数,就称为f(u)、g(x)的复合函数。
链式法则
单变量函数链式法则
已知单变量函数y=f(u),当uu表示为单变量函数u=g(x)时,复合函数f(g(x))的导函数可以如下简单地求出来。
上面这个公式称为单变量函数的复合函数求导公式,也称为链式法则。
公式的右边,如果将dx、dy、du都看作一个单独的字母,那么公式的左边可以看作将右边进行简单的约分的结果,这个看法总是成立的。通过将导数用dx、dy等表示,我们可以这样记忆链式法则:复合函数的导数可以像分数一样使用约分。,但是这个约分的法则不适用于dx、dy的平方等情形。
下面我们来试试对sigmoid与wx+b的复合函数进行求导:
多变量函数链式法则
在多变量函数的情况下,链式法则的思想也同样适用。只要像处理分数一样对导数的式子进行变形就行了,但是事情并没有想的那么简单,因为必须要对相关的全部变量应用链式法则。
让我们来看看两个变量的情形。变量z为u、v的函数,如果u、v分别为x、y的函数,则z为x、y的函数,此时下方的多变量函数的链式法则成立。
变量z为u、v的函数,u、v分别为x、y的函数,z关于x求导时,先对u、v求导,然后与z的相应导数相乘,最后将乘积加起来。
z关于y求导时,也是如此。下方式子依旧成立。
该段转自link
前向传播求损失,反向传播回传误差更新权重。为避免大计算,链式法则是反向传播的关键。如下图所:
总结
链式法则是反向传播算法的关键之一,因为它允许我们有效地计算神经网络中每个参数的梯度,从而更新参数以最小化损失函数。
在神经网络中,反向传播算法用于计算损失函数对于每个参数的梯度。梯度告诉我们损失函数随着参数变化的速度,从而帮助我们确定如何更新参数以减小损失。
链式法则提供了一种将复合函数的导数分解为多个简单函数导数的方法。在神经网络中,每个神经元都有一个激活函数作为非线性变换,并且网络的输出是多个神经元的组合。链式法则允许我们计算损失函数对于每个参数的导数,通过将网络中的每个神经元的导数相乘得到最终的梯度。
具体而言,链式法则可以应用于每一层的参数更新。对于每个参数,我们可以计算该参数对于网络输出的变化的贡献,然后计算网络输出对于损失函数的变化的贡献,最后将两者相乘得到该参数对于损失函数的变化的贡献。通过反向传播算法,我们可以有效地将这些贡献传递回每个参数,并根据梯度下降的原则来更新参数。
总结起来,链式法则允许我们在神经网络中有效地计算参数的梯度,从而实现反向传播算法。它通过将复杂的函数导数分解为简单的函数导数相乘的形式,使得计算梯度变得可行和高效。这使得神经网络可以通过反向传播算法学习和调整参数,以最小化损失函数并提高性能。