资源经验分享神经网络背后的数学(第四部分):手动计算梯度下降问题

神经网络背后的数学(第四部分):手动计算梯度下降问题

2020-03-26 | |  52 |   0

原标题: 神经网络背后的数学(第四部分):手动计算梯度下降问题

来源:AI研习社    链接:https://www.yanxishe.com/TextTranslation/1756


问题表述为:我们有一个只有一层的神经网络(为了简单起见)和一个损失函数。这一层是只有一个神经元的全连接层,许多权重w₁, w₂, w₃…,偏置b以及ReLU激活函数。损失函数为常用的均方误差(MSE)。知道了我们的网络以及损失函数后,我们如何调整权重和偏置来最小化损失函数呢?


在第1部分中,我们了解了必须获得损失(或成本)函数的斜率,以便最小化损失函数。对应的损失函数是:  

1585200164988400.png

图1:损失函数 


在第2部分中,我们学习了如何求偏导。这一点很重要,因为这个函数中有多个参数(变量)可以调整。我们需要求出损失函数对权重和偏置的导数,会用到偏导数。


在第3部分中,我们学习了如何求向量方程的导数。代价函数中的权值和偏置都是向量,因此学习如何计算包含向量的函数的导数是很重要的。 


现在,我们终于有了所有需要的工具来求解损失函数的导数(斜率)! 


神经元梯度

我们需要一步一步地解决这个问题。我们求出单个神经元的梯度与权重和偏置的关系。  

神经元的函数(激活完成)是:  

02.png

图2:神经元函数 


神经元把x作为输入,乘以权重w,然后加上偏置b。  


这个函数实际上是复合函数。令f(x)=w∙x+b, g(x)=max(0,x),则函数为neuron(x)=g(f(x))。我们可以用向量链式法则来求这个复合函数的导数!  


神经元的导数很简单:  

03.png


图3:用向量链式法则求神经元函数的导数,其中z = f (x) = w∙x + b


这个导数有两部分:z对w的偏导以及 neuron(z)对z的偏导。  


z对w的偏导是多少?

z有两部分:w∙x和+b。让我们先看看w∙x。 

w∙x,或者点积,实际上只是向量中每个元素乘积的和。换句话说:  

04.png

图4:w∙x的展开,或点积 

这又是一个组合函数,所以我们把上式可以写成 v=w⊗x 和 u=sum(v)。现在我们求u对w的导数。我们在第3部分已经学过这两个函数——向量元素相乘以及求和。其导数为: 

05.png

图5:u对v求导,v对w求导,其中u=sum(w⊗x) 

(如果你不记得它们是怎么推导出来的,请回去复习一下) 

因此,根据向量链式法则: 

06.png


图6:u对w求导 


就像上面这样!现在,让我们求z= u+b的导数,其中包括u=w∙x相对于权重w和偏置b的导数。由于一个函数对不在该函数中的变量的导数为零,因此: 


07.png

图7:z关于权重和偏置的导数,其中z =sum(w⊗x) + b 

就像上面这样!这两个分别是u对权重和偏置的导数。  


neruon(z)对z的偏导是多少?

Neuron(z)=max(0,z)=max(0, sum(w⊗x)+b).

max(0,z)这个函数将所有的负值简单地处理为0。因此它的图像会看起来像是这个样子:


08.png


图8: Max(0,z) // 来源


根据该图像,我们马上就能看出max(0,z)的导数是一个分段函数:当z为非正值时取0,当z为正值时取1,即:


09.png


图9: max(0,z)的导数


现在我们就得到了两个部分的导数,我们将它们相乘从而得到神经元的导数:


10.png

图10: 神经元max(0,sum(w⊗x)+b)对权重的导数


将 z=w∙x+b 代回得到:



11.png

图11:将z用w∙x+b代替


瞧!我们得到了神经元对权重的导数!我们也可以用类似的方法得到对偏置的导数:

12.png

 图12:神经元对偏置的导数


就这样!我们得到了神经网络中神经元的梯度!


损失函数梯度


我们在第一部分定义的损失函数是这样的:

13.png

图13:损失函数


我们可以立即将这个需要链式法则的部分标识为函数的一部分。我们将把我们的中间变量定义为:

14.png

图14:损失函数的中间变量


*注,这里的u和v与之前部分的u与v不同。


让我们先来计算权重w的梯度吧。


权重梯度

u就是神经元函数,我们之前已经解决过了。因此:

15.png

图15: u=max(0,sum(w⊗x)+b)相对与权重的导数

v(y,u) 就是 y-u。因此,我们可以看到它的导数(相对与w来说)利用分配律代替u的导数:

1585200699316177.png

图16:v=y-u相对于权重的的导数


最后,我们需要找到整个代价函数相对于权重的导数。使用链式法则,我们知道:

17.png

图17: 代价函数的导数


我们看到等式的左面,C(v)相对于v的导数:

1585200735958443.png

图18: 代价函数相对于v的导数


根据图16,我们了解了v相对于w的导数。为了计算C相对于v的导数,我们将两部分导数相乘:

19.png

图19: 代价函数相对于w的导数 


现在,用y-u代替v,用max(0,w·x+b)代替u:

20.png

图20: 代价函数相对于w的导数


因为max函数在分段函数的第二行,当w∙x+b大于0时,max函数总是简单的输出w∙x+b的值:

1585200780638766.png

图21: 代价函数相对于w的导数


最后,我们可以在分段函数中移动求和并且对其进行整理:

1585200800671376.png

图22: 代价函数相对于w的导数


就是这样的!我们已经有了相对于权重的导数!然而,这意味着什么呢?

w∙x+b-y 可以解释为一个误差项——神经网络的理想输出和实际输出之间的差异。如果我们把这个误差项叫做ei,我们最终的导数就是:

23.png

图23:带有误差项的 代价函数相对于权重的导数 


这里,误差越大,导数越大。换句话说,导数表示斜率,或者为了最小化我们的误差,我们要改变的权重。如果我们的神经网络刚刚开始训练,并且正确率很低,误差就会很大,从而导数也会很大。因此,为了减小误差,我们还需迈出一大步。


你可能注意到这个梯度指向高成本的方向,这意味着沃恩不能将梯度与现有的权重进行相加——这只会增加误差并且让我们远离局部最小值。因此,为了更接近最小化损失函数,我们必须用导数减去我们现在的权重:

24.png

图24:梯度下降函数


这里,η代表学习率,我们可以将其作为参数进行设置。学习率越高,进步越快。然而,学习率设置的太高可能导致进步太大并逐渐超出了局部最小值。如果想了解更多信息的话,请查看这篇梯度下降的文章和这篇设置学习率的文章。


梯度的偏差

再次说明一下我们已得到的中间变量:

25.png

  图25:损失函数的中间变量


根据之前的计算,我们也知道了u的偏导数:

26.png

图26:u关于偏差的导数 


类似地,并且对u的导数进行分配律和代换我们可以得到v相对于b的偏导数:

1585200935890067.png

图27:v关于偏差的导数


再一次,我们可以利用向量链规则来计算C的导数:

28.png

图28:代价函数关于偏差的导数


代价函数关于v的导数与我们计算的权重相同:

1585200973145029.png

图29:代价函数关于v的导数


将两部分相乘以计算C关于b的导数,并且用y-u替换v,max(0, w∙x +b) 替换u,那么我们会得到:

1585200996629730.png

图30:代价函数关于偏差的导数


再说一遍,既然第二行已经特别声明w∙x+b>0,那么max函数就总是简单地返回w∙x+b。

31.png

图31:损失函数对偏置bias的导数,就像上面一样,我们用误差符号e带入简化上式,e = w∙x+b-y :

32.png

 图32:以误差符号e呈现的损失函数对偏置bias的导数


与损失函数对权重的导数一样,这个梯度的幅值也与误差成正比:误差越大,我们要迈向局部最小值的更新值也就越大。这同样也指出了更高代价的方向,意味着我们需要从当前的值中减去这个梯度一更靠近局部最小值:

33.png

图33:偏置bias的梯度下降函数 

__________________________________________________

发起:唐里 校对:唐里 审核:鸢尾

参与翻译(4人):had_in、草色微茫、无辞、胖七

英文原文:Calculating Gradient Descent Manually

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:Python 语法复习之 Loops 和 Functions

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...