首页 > 代码库 > 梯度下降

梯度下降

Ok,目前我们已经有了一个比较复杂的网络,其中参数theta是我们想要求出来的值。

 

寻找最好的函数,就是为神经网络选取一组最好的系数theta使得损失函数最小。但,显然我们不能通过遍历的方式进行寻找系数。例如含有1000个neuron的两层神经网络结构中,第一层的输出为1000个值,对应第二层的每个neuron就有1000个weights,所以需要的参数就是1000*1000+1000(偏置)。

技术分享

梯度下降算法是最优化求解中常用的经典算法,把损失函数作为所求参数的函数。然后通过利用函数的梯度和学习步长,不断迭代寻找最优参数,优点是适用面广,速度快,缺点是只能获得局部最优

 例如,损失函数为L,参数集合为theta,是关于omega的函数。

技术分享

技术分享

每次沿着负梯度方向移动:

技术分享

通过不断迭代,最终得到一个局部最优解。下面为一个例子:

技术分享

技术分享

技术分享

总结:

梯度下降十分经典,相关资料很多,这里不进行复述。这里主要讲讲梯度下降训练神经网络和神经网络中前向,后向传播算法的关系。


首先,整个函数的损失函数为L,对损失函数进行求导,得到theta的初始导数,然后根据学习步长与导数不断更新。

技术分享

为了更新,我们需要求得损失函数的导数,需要用到链式法则,具体如下:

技术分享

损失函数是所有损失的累加。但是损失函数对系数omega的导数不能直接求出,需要传递:

技术分享

例如,求上图中红色三角区域内参数(w1和w2),通过链式法则我们可以得到该梯度由两部分组成,具体如下:

技术分享

所有参数的导数(z对w的导数),这部分由前向传播决定;激活函数输入的梯度(c对z的导数),这部分由后向传播决定,所以需要配合使用。其中还有其他层的梯度信息,暂时用问号代替。

 

惊喜的发现,所有参数的梯度竟然就是与权值相连的输入值问号是指网络中所有与权值相连的如输入值,Amazing!

技术分享

技术分享

 所以,我们得到了全部参数的导数之后,就开始计算激活函数输入的导数:

技术分享

计算包含两部分,一个是激活函数本身的导数,对于一个固定结构的神经网络,sigma(z)的导数是固定的。

技术分享

而损失函数L对a的导数则可以通过链式法则得到。其中W是已知的,只需要计算C与Z‘和Z‘‘的导数。

技术分享

进一步归纳如下:

技术分享

首先sigma(z)的导数是常数,只需要计算C与Z‘和Z‘‘的导数.

记住C对z的导数结构,递归执行这个结构得到所有的结果,例如C对z的导数仍然是这个结构。

 

技术分享

 

记住C对z的导数结构,递归执行这个结构得到所有的结果,例如C对z‘的导数仍然是这个结构。

 

如何计算C与Z‘和Z‘‘的梯度?第一种情况,该计算发生在输出层,十分好计算。

技术分享

如何计算C与Z‘和Z‘‘的梯度?第二种情况,该计算发生在输出层。

 技术分享

进行递归形式的计算即可,直至递归至输出层.

例如下图中z‘的导数,就是由后面两条红色线的路径结果得到。其格式与下列公式相同:
技术分享

技术分享

计算损失函数C与所有激活函数输入Z的导数。递归地从输出层开始计算

技术分享

技术分享

 

最后将两部分结合到一起,得到损失函数与W的梯度。

技术分享

 

总结:

 

其实,网络中就有两个函数:

 

技术分享

 

和激活函数:

 

技术分享

 

所以,在求导的时候,要先对z求导,然后对w求导。这中间用到了链式法则。

 

为了求得神经网络的最优系数,我们需要使用梯度下降算法。而梯度下降算法中的梯度需要通过前向传播算法后向传播算法共同计算。神奇的是梯度需要计算的值非常少(大多数已知),所以速度非常快。

梯度下降