Stanford深度学习课程第四课反向传播算法与神经网络(二)
门
标题特意用得较为简单,在上面的计算图计算前向和反向传播时,计算图很小,分成了很多部分。在实际中,我们不可能每次都将问题分成这么多部分,在不同的前向反向函数中,很多函数是一样的。这一些类似的计算图可以组成门。比如说如果一个多层的神经网络每一层都使用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
领取专属 10元无门槛券
私享最新 技术干货