《深度学习入门》第5章 误差反向传播法

一、计算图

计算图被定义为有向图,其中节点对应于数***算。 计算图是表达和评估数学表达式的一种方式。例如,这里有一个简单的数学公式 -p = x + y。计算图和反向传播都是深度学习训练神经网络的重要核心概念。

二、链式法则

在微积分中,链式法则是计算两个或多个函数的组合的导数的公式,也就是说,如果f和g是函数,则链式法则表示它们的组合的导数f∘g(将x映射到f(g(x))的函数。由于在定义过程中求导公式可以表示成一个连乘过程,就像锁链一样一环套一环,故而得名。链式法则在计算上简单,在直观上容易理解。
在机器学习领域,链式法则是需要理解的重要基础法则之一,其主要应用在于反向传播(backpropagation)等算法,反向传播算法是在模式识别和故障诊断等领域广泛使用的简单方法。其发明者Werbos于1990年再次讨论反向传播所基于的定理——有序导数(ordered derivatives)的链式法则,并设计了可以转换为计算机代码,并由神经网络用户直接应用的更简单的反向传播版本。

三、反向传播

在输入数据固定的情况下、反向传播算法利用神经网络的输出敏感度来快速计算出神经网络中的各种超参数。尤其重要的是,它计算输出f对所有的参数w的偏微分,即如下所示:∂f/∂wi,f代表神经元的输出,wi是函数f的第i个参数。参数wi代表网络的中边的权重或者神经元的阈值,神经元的激活函数具体细节并不重要,它可以是非线性函数Sigmoid或RELU。这样就可以得到f相对于网络参数的梯度∇f ,有了这个梯度,我们就可以使用梯度下降法对网络进行训练,即每次沿着梯度的负方向(−∇f)移动一小步,不断重复,直到网络输出误差最小。

在神经网络训练过程中,我们需要注意的是,反向传播算法不仅需要准确计算梯度。还需要使用一些小技巧对我们的网络进行训练。理解反向传播算法可以帮助我们理解那些在神经网络训练过程中使用的小技巧。

反向传播算法之所以重要,是因为它的效率高。假设对一个节点求偏导需要的时间为单位时间,运算时间呈线性关系,那么网络的时间复杂度如下式所示:O(Network Size)=O(V+E),V为节点数、E为连接边数。这里我们唯一需要用的计算方法就是链式法则,但应用链式法则会增加我们二次计算的时间,由于有成千上万的参数需要二次计算,所以效率就不会很高。为了提高反向传播算法的效率,我们通过高度并行的向量,利用GPU进行计算。

四、激活函数层的实现

激活函数是用来引入非线性因素的。网络中仅有线性模型的话,表达能力不够。比如一个多层的线性网络,其表达能力和单层的线性网络是相同的(可以化简一个3层的线性网络试试)。我们前边提到的卷积层、池化层和全连接层都是线性的,所以,我们要在网络中加入非线性的激活函数层。一般一个网络中只设置一个激活层。

激活函数一般具有以下性质:

非线性: 线性模型的不足我们前边已经提到。

处处可导:反向传播时需要计算激活函数的偏导数,所以要求激活函数除个别点外,处处可导。

单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。

输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方***更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
1、Sigmoid函数
Sigmoid函数表达式为:,它将输入值映射到[0,1]区间内,其函数图像如下图
图片说明
Sigmoid有一个十分致命的缺点就是它的导数值很小(sigmoid函数导数图像如下图),其导数最大值也只有1/4,而且特别是在输入很大或者很小的时候,其导数趋近于0。这直接导致的结果就是在反向传播中,梯度会衰减的十分迅速(后面公式的推导过程会证明这一点),导致传递到前边层的梯度很小甚至消失,训练会变得十分困难。
2、Tanh函数
图片说明
3、Relu函数
Relu函数为现在使用比较广泛的激活函数,其表达式为。当输入x<0时,输出为0;当x>0时,输出等于输入值。
图片说明
Relu函数相对于前边2种激活函数,有以下优点:

1、relu函数的计算十分简单,前向计算时只需输入值和一个阈值(这里为0)比较,即可得到输出值。在反向传播时,relu函数的导数为。计算也比前边2个函数的导数简单很多。
2、由于relu函数的导数为,即反向传播时梯度要么为0,要么不变,所以梯度的衰减很小,即使网路层数很深,前边层的收敛速度也不会很慢。

Relu函数也有很明显的缺点,就是在训练的时候,网络很脆弱,很容易出现很多神经元值为0,从而再也训练不动。一般我们将学习率设置为较小值来避免这种情况的发生。

为了解决上面的问题,后来又提出很多修正过的模型,比如Leaky-ReLU、Parametric ReLU和Randomized ReLU等,其思想一般都是将x<0的区间不置0值,而是设置为1个参数与输入值相乘的形式,如αx,并在训练过程对α进行修正。

五、Softmax层的实现

在神经网络中引入softmax主要是为了定义一个新的输出层。
第j个输出的神经元是:
图片说明
分母是对所有神经元进行求和

因为输出的和总是1,所以有:
图片说明
换句话,从softmax层的输出可以看做是一个概率分布

六、误差反向传播的实现

 BP算法的基本思想是,学习过程由信号的正向传播与误差反向传播两个过程组成。正向传播时,输入样本从输入层传入,经过各隐层逐层处理后,传向输出层。若输出层的实际输出与期望输出不符,则转入误差的反向传播阶段。误差反向传播是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层的误差信号,此误差信号即作为修正单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程周而复始的进行,权值不断调整的过程,也就是网络学习训练的过程,此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。
具体推导参见CSDN博客:[https://blog.csdn.net/weixin_42398658/article/details/83859131]

七、小结

通过使用计算图,可以直观地把握计算过程。计算图的节点是由局部计算构成的,局部计算构成全局计算。计算图的正向传播进行一般的运算,通过计算图的反向传播,可以计算各个节点的导数。通过将神经网络的组成元素实现为层,可以高效地计算梯度,即反向传播法。通过比较数值为分和误差反向传播法的结果,可以确认误差反向传播法的实现是否正确。

#深度学习#
全部评论
有心了,提一个建议,公式编辑可以试一下牛客的插入公式,用LaTex语言编辑,看着可能会舒服一些哈哈哈
点赞 回复
分享
发布于 2019-02-02 22:28

相关推荐

投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
转发
点赞 5 评论
分享
牛客网
牛客企业服务