前面文章(通过 AutoGrad 来理解 TextGrad ,反向传播中的自动微分)提到梯度了,那么梯度、梯度下降法是什么?本篇再深入一点来看看。
梯度下降法对于神经网络来说,真的是太重要了。可以说是没有梯度下降法,就不会有现代的神经网络。如果没有梯度下降法,神经网络可能都没有办法被训练。梯度其实是微积分里的一个技术概念。
通过前文介绍,对损失函数有了一定理解,损失函数计算出来的值其实就是神经网络里的概率模型和理想中的概率模型之间的差距的定量表达。
那么差距找到了,接下来就是要缩短差距了。至于怎么缩短呢?肯定是要调整神经网络里的那些参数。参数有这么多,如果我们没有什么策略,只凭直觉去调整的话,理论上虽然也有可能把它调好,但是估计得调整到宇宙爆炸了。所以,要想把这么多的参数能快速调整好,必须要有策略。这个策略就是反向传播,梯度下降法就是反向传播中的一种方法。
正向传播我们其实都能知道,就是把数据输入到神经网络,这些数据会沿着神经网络向前传递,传递的过程中,一层一层地进行操作,最后得出一个结果。
反向传播也一样,一个神经网络还没有训练好的时候,它的输出结果是有偏差的。当我们已经知道了偏差值的时候,要把这个偏差缩小,肯定是优先调整那些对最后输出结果有重大影响的参数,这样性价比最高。反的那个传递的信息,传递的是偏差的信息,这些偏差最后传递到各个参数上,然后根据这些参数对偏差的贡献大小,来承担相应的修改责任。原理上是这样子的。
具体是怎么修改呢?我们先来脑补一个符合自己直觉的一种分配方式。
假设神经网络最后输出层的一个输出值是A3来表示,具体的这个输出值分别由W系数、偏置系数和上一层的输出值来决定的。知道了这些之后,我们就能计算出它的损失函数。
比如说我们就用交叉熵的方式(损失函数),整个神经网络计算完之后存在偏差,目的是这个偏差越小越好,最好是减到0,要通过神经网络里的这些各个感知机,以及感知机上的参数来调整。其实是可以把偏差分成三部分,分别对应着感知机里的W系数、偏置系数以及上一层的输出结果。如果贡献大的就多调整一点,如果贡献小就少调整一点,通过调整来减小最终的数值。
这种分配偏差的方法,虽然直观容易理解,但操作起来却没有那么简单。如果想要定量的去调整每一个参数,这些参数的数值具体大小应该是怎样子呢?它们相互之间的依赖关系又是怎样?这些都很麻烦。
我们还可以考虑另外一种方法。上述利用的是数值的加法。除了数值的加法,还有没有别的加法呢?比如说向量的加法!!
向量的合力等于两个分力的矢合,这就是向量的加法。向量它是有方向的,而偏差值只是一个数值没有方向,所以我们还需要找到一个确定的方向。到这里,其实就要引出我们这次要讲的梯度。
梯度的方向是变化率最快的方向,顺着这个方向就能找到变化率最大的值,在梯度下降法里面,我们要做的是沿着梯度的反方向走,取反就是减小最快的方向,就能找到最佳的调整方式了。