1.损失函数
深度学习中常用的损失函数
- 在训练深度学习网络的时候,我们首先要将目标分类的“错误”参数化,这就是损失函数(误差函数),它
- 反映了感知器目标输出和实际输出之间的误差。
- 回归任务最常用的损失函数为二次代价函数,对于一个单独的训练样本x,其二次代价函数可以写作:
- 其中,d为输出层的某一个神经元,D为输出层所有的神经元,ta为目标输出,oa为实际输出。
- 分类任务最常用的损失函数是交叉熵代价函数:
- 交叉熵误差刻画了两个概率分布之间的距离,是分类问题中使用较多的一种损失函数。
- 一般二次代价函数更多用于回归问题,而交叉熵误差更多用于分类问题。
- 这个损失函数的特点包括:
- 以权值向量作为自变量。
- 以各个训练样例的目标输出t_d和实际输出o_d的差平方和作为主体。
- 有个系数1/2。
- 我们看到,一旦训练样例给定,其输入和目标输出值是常量,实际输出跟随者W的变化而变化,所以误差函数的自变量是W。
- 这里较难理解的是1/2这个系数,它存在的目的是当E对自变量求导的时候,刚好和指数2抵消为1,后面将会具体看到。
- x是样本,n是样本的数量,d是输出层神经元。
损失函数的极值
- 目的:让损失函数沿着负梯度的方向进行搜索,不断迭代更新参数W,最终使得损失函数最小化。
- 限制:
- 解决思路:负梯度方向是函数下降最快的方向,那我们可以从某个点开始,沿着
方向一路前行,期望最终可以找到C(W)的极小值点,这就是梯度下降法的核心思想。
梯度下降与损失函数
- 这个损失函数的特点包括:
- 以权值向量作为自变量。
- 以各个训练样例的目标输出t_d和实际输出o_d的差平方和作为主体。
- 有个系数1/2。
- 我们看到,一旦训练样例给定,其输入和目标输出值是常量,实际输出跟随者W的变化而变化,所以误差函数的自变量是W。
- 这里较难理解的是1/2这个系数,它存在的目的是当E对自变量求导的时候,刚好和指数2抵消为1,后面将会具体看到。
- 梯度法思想的三要素:出发点、下降方向、下降步长。
全局梯度下降算法(BGD)
- 全量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。
随机梯度下降算法(SGD)
- 这个版本的梯度下降算法走向了另一个极端,即每个样例都更新权值。因为训练样例中一般是含有噪声的,因此到了精确逼近极值的阶段,梯度往往会在极值附近横冲直撞,难以收敛到极值。
小批量梯度下降(MBGD)
- 这个版本的梯度下降兼顾了效率和梯度的稳定性,容易冲过局部极小值,是实际工作中最常用的梯度下降算法,BS的取值因具体问题而异,一般取32。
网络训练的流程
反向传播算法
- 误差反向传播算法(ErrorBackPropagation)是神经网络的重要算法。它使用链式求导法则将输出层的误差反向传回给网络,使神经网络的权重有了较简单的梯度计算实现方法。
- 其步骤为:
- 将损失函数值反向传播给每个计算单元;
- 每个计算单元根据获得的误差更新权重。
梯度消失和梯度爆炸问题
- 梯度消失:当网络层数越多时,进行反向传播求导值越小,导致梯度消失。
- 梯度爆炸:当网络层数越多时,进行反向传播求导值越大,导致梯度爆炸。
- 导致原因:
- 反向传播可以推导:
- 也就是比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为σ'(z)的大小也与w有关,除非该层的输入值在一直一个比较小的范围内。
- 其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
- 梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
- 另外一种解决梯度爆炸的手段是采用权重正则化(weithtsregularization)比较常见的是I1正则,和I2正则,在各个深度框架中都有相应的API可以使用正则化,比如在tensorflow中,若搭建网络的时候已经设置了正则化参数,则调用以下代码可以直接计算出正则损失。
- Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。
- LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。目前也有基于CNN的LSTM,感兴趣的可以尝试一下。
2.激活函数
激活函数的概念
- 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输入在加权求和后与下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
- 激活函数,是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。在神经元中,输入通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。若没有激活函数的每层都相当于矩阵相乘。没有激活函
- 数的神经网络叠加了若干层之后,还是一个线性变换,与单层感知机无异。激活函数可以分为饱和激活函数与不饱和激活函数,激活函数的右饱和指当x xx趋向于正无穷时,函数的导数趋近于0。同样的,当xxx趋向于负无穷时,函数的导数趋近于0,此时称为左饱和。当一个函数既满足右饱和,又满足左饱和,则称为饱和函数,否则称为非饱和函数。
- 连续可导。
激活函数的作用
Sigmoid函数
- Sigmoid函数单调连续,求导容易,输出有界,网络比较容易收敛。但是我们看到,在远离中心点的位置,Sigmoid函数导数趋于0,在网络非常深的时候,越来越多反向传播的梯度会落入饱和区,从而让梯度的模越来越小。一般来说,Sigmoid网络在5层之内,就会产生梯度退化为0的现象,难以训练。这种现象称为梯度消失现象。另外,Sigmoid的输出并不是以o为中心的。
- 适合用:Sigmoid函数的输出范围是0到1。由于输出值限定在0到1,因此它对每个神经元的输出进行了归一化;用于将预测概率作为输出的模型。由于概率的取值范围是0到1,因此Sigmoid函数非常合适;梯度平滑,避免「跳跃」的输出值;函数是可微的。这意味着可以找到任意两个点的sigmoid曲线的斜率;明确的预测,即非常接近1或0。
- 缺点:
-
- 容易出现梯度消失,
-
- 函数输出并不是0均值化,
-
- 幂运算相对来讲比较耗时。
tanh函数
- 双曲正切函数:tanh也具有和Sigmoid函数类似的缺点,即远离中心的位置导数趋于0,但是因为其关于0点对称,输出的均值比Sigmoid更加接近于0,因此SGD会更接近自然梯度,然而,gradient vanishing的问题和幂运算的问题仍然存在。
Softsign函数
- Softsign函数是Tanh函数的另一个替代选择。就像Tanh函数一样,Softsign函数是反对称、去中心、可微分,并返回-1和1之间的值。其更平坦的曲线与更慢的下降导数表明它可以更高效地学习,比tTanh函数更好的解决梯度消失的问题。另一方面,Softsign函数的导数的计算比Tanh函数更麻烦。Softsign'(x)=1/(1+|x|)2这个函数相比tanh函数,饱和得慢一些。
- Sigmoid,tanh,softsign函数在训练深度神经网络的过程中,都无法回避梯度消失的问题,既在远离函数中心点的位置,函数导数趋于0,在网络非常深的时候,越来越多反向传播的梯度会落入饱和区,从而让梯度的模越来越小,最终趋近于0,导致权重无法更新。
- 一般来说,如果神经网络超出5层,就会产生梯度退化为0的现象,导致模型难以训练。
Rectified Linear Unit(ReLU)函数
- 线性整流函数,又称修正线性单元ReLU,是一种人工神经网络中常用的激活函数,通常指代以斜坡函数及其变种为代表的非线性函数。当输入为正时,不存在梯度饱和问题。
LeakyRelu函数
- 它是一种专门设计用于解决DeadReLU问题的激活函数:针对Relu函数中存在的Dead ReluProblem,LeakyRelu函数在输入为负值时,给予输入值一个很小的斜率,在解决了负输入情况下的o梯度问题的基础上,也很好的缓解了DeadRelu问题;2、该函数的输出为负无穷到正无穷,即leaky扩大了Relu函数的范围,其中a的值一般设置为一个较小值,如0.01;
- 缺点
- 论上来说,该函数具有比Relu函数更好的效果,但是大量的实践证明,其效果不稳定,故实际中该函数的应用并不多。
- 由于在不同区间应用的不同的函数所带来的不一致结果,将导致无法为正负输入值提供一致的关系预测。
Softplus函数
- 在ReLU的基础上,增加了一点计算复杂度,但是其有连续的导数,且定义的曲面也相对平滑。Softplus函数可以看作是ReLU函数的平滑。根据神经科学家的相关研究,Softplus函数和ReLU函数与脑神经元激活频率函数有神似的地方。也就是说,相比于早期的激活函数,Softplus函数和ReLU函数更加接近脑神经元的激活模型,而神经网络正是基于脑神经科学发展而来,这两个激活函数的应用促成了神经网络研究的新浪潮。修正线性单元(Rectified Linear Unit,ReLU):ReLU函数被认为有生物上的解释性,比如单侧抑制、宽兴奋边界(即兴奋程度也可以非常高)。在生物神经网络中,同时处于兴奋状态的神经元非常稀疏。人脑中在同一时刻大概只有1~4%的神经元处于活跃状态。Sigmoid型激活函数会导致一个非稀疏的神经网络,而ReLU却具有很好的稀疏性,大约50%的神经元会处于激活状态。
Softmax函数
- Softmax 函数体:
- Softmax函数的功能就是将一个K维的任意实数向量映射成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。新的向量所有维度模长之和为1。
- Softmax函数经常用作多分类任务的输出层。