第四课反向传播算法与神经网络

Stanford深度学习课程第四课反向传播算法与神经网络(全)

预备知识

我们不直接介绍课程内容,首先介绍一些预备知识,这样可以更好的理解课程内容。下面我们介绍导数的基本概念及一些常用函数的导数。有些人大概在高中就学过导数,但是有些人没有学过,但是不管怎么样,大家在中学阶段的时候一定学过直线方程!那么不知道大家还记得不记得斜率,下面我们看一个例子,有一个函数方程为y=2x+4,其函数图像如下:

这里的斜率k=2,这里的斜率就是上面直线在直线上每一点的导数。导数其实也可以理解为在某一点上函数值的变化情况(包括变化快慢及变化方向)。

对于任意一个函数f(x),其在x0处的导数可以定义为:

下面不加证明的列出一些常用函数的导数形式及相关公式:

然后还有比较重要的链式法则,若有一个函数:

那么可以得到:

在简单介绍这部分知识后,我们来到反向传播算法。

反向传播算法

对于任意一个运算,我们可以通过构建计算图,然后利用链式法则前向求导,从而求出每一个变量的梯度。举个例子,假如有函数:

根据运算法则,我们首先要计算x+y,再计算乘法,所以可以令:

根据上述运算顺序画出如下计算图

首先前向计算得到:

下面我们看看反向梯度是如何计算的,我们需要计算的是:

根据函数式及求导公式,我们首先可以得出以下结论:

所以最终求得梯度为:

有了梯度之后就可以使用梯度下降法对参数进行更新了。

稍微复杂的一个例子

上面介绍了及其简单的一个例子,下面是稍微复杂的例子,也是在实际中会经常用到的例子:逻辑回归的梯度求解。需要求解梯度的函数如下:

然后我们将上述函数画成计算图(原课程中的图截图过来后不是很清晰,故重画了),通过换元将上面复杂的式子写成简单的式子(特别方便求导的式子):

根据上面过程画出来图形如下:

给定一组已知的输入,比如:

下面根据链式法则来求

的梯度,实际应用中只会对系数求梯度,输入变量是固定的。

通过上面的式子我们可以得到:

则我们可以得到如下列的反向计算结果:

上图中的结果就是给前面的公式中带入具体的值计算出来的。一旦计算得到各个变量的梯度值之后,就可以执行梯度下降,从而对损失函数进行优化。

阶段小结

由上面的推导,对于上面示例中的函数,其反向传播梯度可以通过如下公式进行求解。

标题特意用得较为简单,在上面的计算图计算前向和反向传播时,计算图很小,分成了很多部分。在实际中,我们不可能每次都将问题分成这么多部分,在不同的前向反向函数中,很多函数是一样的。这一些类似的计算图可以组成门。比如说如果一个多层的神经网络每一层都使用sigmoid激活函数,那么在计算反向梯度时,就会多次按照如下图中红框中部分进行计算。所以可以综合的称呼这些为“sigmoid门” (sigmoid gate)。

上面图片中的公式也就是sigmoid gate反向传播的的梯度公式,下面介绍一些常用门。

下面是课程ppt中的一个例子,如下图所示,分别描述了add gate(加门,红色虚线框),max gate(最大门,绿色虚线框)和multiple gate(乘门,蓝色虚线框)。

图中有一些数字,绿色数字代表前向传播数值,红色数字代表反向传播梯度。

Add gate的作用是将梯度分发给两个其他分支,在上图中,梯度2.00分发给了两个分支,所以两个分支的梯度都是2.00。简单说明一下add gate的分发原理,假如有函数:

并且我们已知某个目标函数对y的梯度,那么y的梯度可以直接分发给x1和x2,

Max gate的作用是取两个分支中较大的数值,在上图中,下面绿色虚线框代表一个max gate的过程。在梯度反向传播过程中,对于两个分支中较大的值,该分支梯度等于当前梯度,而对于两个分支中较小的值,该分支的梯度等于0。

Multiple gate的作用是将两个数值相乘,如上图中蓝色虚线框所示。其分支的梯度为当前梯度乘上另外一个分支的数值,比如说:

上面为常用的一些“门”,add gate可以理解为一个分发门,max gate可以理解为一个路由门,multiple gate可以理解为一个转换门。

反向传播向量化表示

前面说的都是单个数据点的反向梯度求解,下面说对于向量或者矩阵来说梯度求解情况:首先假设需要计算的函数为:

为简便起见,我们设定W为大小为2x2的矩阵,而x为大小为2x1的向量:

然后根据函数计算过程设定中间变量,并且画出计算图。

然后我们通过实例来理解其前向运算及反向梯度传播,例如设定W和x的值分别为:

所以根据矩阵乘法计算可得到q的值为:

然后计算f的函数值为:

下面是反向梯度传播:

所以对于梯度求导来说,有

下面继续说刚才的实例:下图为刚才说的例子中的前向传播与反向梯度传播的过程,我们一起来计算一下反向梯度传播的过程(红色数字部分)

首先是函数f对自身的梯度为1,这个比较简单。然后是函数f对q的梯度:

然后是f对W的梯度:

这样就可以较为顺畅的进行反向传播算法了。

神经网络

我们在上面的例子中使用的是

这是一个线性函数,可以看成一层的神经网络,若是这里设定以ReLU做激活函数。我们可以通过叠加多个单单层网络构建两层甚至多层网络,比如:

神经网络中的激活函数

神经网络中在神经元上会加上激活函数,激活函数可以引入非线性特征。常用的激活函数有Sigmoid,ReLU激活函数等。

上图中是很多的常用激活函数,包括函数的方程及其图像。比较早期的就是Sigmoid和tanh激活函数,从上面图像上我们可以看到,在输入值较大或者较小时,梯度很小,在多层网络中容易导致梯度消失,从而无法对多层网络进行很好的训练。所以就有了ReLU激活函数,ReLU激活函数在大于0的区域导数都为1,保证了梯度不会消失,且梯度计算速度极快。但是ReLU激活函数舍弃了小于的部分,会有信息丢失,然后就有了Leaky ReLU对于小于0的部分取梯度都为0.1,即保证了不丢弃小于0部分的信息,又保证了大于0部分的优势信息。但是Leaky ReLU在0点处导数不存在,所以在此基础上又提出了ELU激活函数。

Github

使用电脑的同学可以通过Github链接直接查看高清版本!

NGSHotpot Github:

https://github.com/NGSHotpot

本文链接:

https://github.com/NGSHotpot/deep-learning/blob/master/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%8F%8A%E5%8F%8D%E5%90%91%E4%BC%A0%E6%92%AD%E7%AE%97%E6%B3%95.md

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180112G04XGG00?refer=cp_1026

相关快讯

扫码关注云+社区