文章目录
处理过程
处理过程包括
激活函数
数据预处理
权重初始化
批量归一化
训练过程监控
超参的优化
激活函数
当输入数据,在全连接层或者卷积层,我们将输入乘上权重值,然后将结果输入一个激活函数,或非线性单元。
上图是一些例子
sigmoid函数
每个数被输入sigmoid中,都会被压缩到[0,1]的范围内,然而它从在很多问题。
问题1 首先是饱和神经元将使梯度消失
当x=-10,太过接近sigmoid负饱和区,这个区域本质上是平的所以梯度变为0,我们将返回上游梯度乘一个约为0的数,所以得到一个非常小的梯度,所以某种意义上经过链式法则后让梯度流消失因此0梯度就传递到下游的节点。
当x=0,可以有一个好的梯度可以好的反向传播
当x=10,或者很大正值,它们位于梯度平滑区域,无法得到梯度流的反馈。
问题2 sigmoid是非0中心函数
当输入神经元的数值始终为正,它会乘以某个权重W,然后我们将通过激活函数来运行
权重W梯度如何?
当我们把上游梯度传回来,就是对我们的损失L关于f进行求导,就是dl/df它的值就是正数或负数,我们对w求导则为df/dw这个等于x,如果x为正数,那么对w的梯度dL/df乘以df/dw,这就相当把上游梯度符号传了回来,意味着w的梯度全是正数或负数,它们总朝着一个方向移动,当你做参数更新,你可以选择增加他们,可以用同一个正数去增加所有w的值,这种方法对梯度更新十分低效。
问题3 exp()是一个计算成本高的函数
这不是主要问题,因为我们进行卷积核点乘计算代价会更大。
tanh激活函数
tanh非线性函数图像如上图右边所示。它将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎
ReLU激活函数
在近些年ReLU变得非常流行。它的函数公式是
这个激活函数就是一个关于0的阈值(如上图左侧)。使用ReLU有以下一些优缺点:
优点:相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用( Krizhevsky 等的论文指出有6倍之多)。据称这是由它的线性,非饱和的公式导致的。
优点:sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。
缺点:在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。
当学习率太高时候,你进行大量跟新,权值不断波动,你的reLu单元就会被数据多样性所淘汰。
ReLU改进 leaky relu
eaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。所以其函数公式为
其中a是一个小的常量。有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。Kaiming He等人在2015年发布的论文Delving Deep into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。然而该激活函数在在不同任务中均有益处的一致性并没有特别清晰。
实践
1最经常使用ReLU试验,但要小心学习率
2可以尝试leaky ReLU/maxout等但更多为实验性(实用性差一点)
数据预处理
归一化处理
零均值或
初始化网络权重
让我们从应该避免的错误开始。在训练完毕后,虽然不知道网络中每个权重的最终值应该是多少,但如果数据经过了恰当的归一化的话,就可以假设所有权重数值中大约一半为正数,一半为负数。这样,一个听起来蛮合理的想法就是把这些权重的初始值都设为0吧,因为在期望上来说0是最合理的猜测。这个做法错误的!因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。