0%

选择合适的激活函数

选择合适的激活函数

sigmoid

图像

1574406136071

特点

他会将输入的数字挤压到0到1区间的范围内。是最先使用的激活函数,以为可以将它解释为一个神经元的激活率,其中0表示没激活,1表示完全激活

存在的问题

  • 会导致模型的梯度消失

    • 当神经元的激活状态接近于0或1时,这些区域的梯度会非常接近于0

      1574406306081

      在反向传播期间,该局部梯度会和此处输出的梯度相乘以实现整体的目标。

  • Sigmoid函数的输出并不是以0为基准,而是从0开始,到1结束。意味着函数的值会为正。因而权重的梯度会全部为正或全部为负,这会造成梯度往完全不同的方向更新,使得优化更困难

Tanh

图像

1574406487079

特点

他会将数字压缩到-1到1区间内。所以他的输出以0为基准,使优化更加容易

问题

梯度消失

ReLU

图像

1574406572298

特点

max(input, 0)

不会涉及大量运算,因此它能更快的学习,也避免了梯度消失的问题

但是他只用在隐藏层中,输出层应该用Softmax函数用于分类,因为它能生成不同类别的概率。在回归问题中使用线性函数,因为通过它的数据信号不会变

问题

部分神经元在训练中会很脆弱,甚至会死掉。这就意味着较大的梯度通过ReLU函数时会导致梯度更新,使得无法再次激活任何数据点

解决方法:Leaky ReLU

经验

  • 深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据(可以经过数据预处理实现)和zero-cintered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度
  • 如果使用ReLU,那么一定要小心设置learning rate,而且注意不要让网络出现很多“dead”神经元,如果这个问题不好解决,可以试试Leaky-ReLU、PReLU或者Maxout
  • 最好不要使用sigmoid,可以试试tanh,不过可以预期他的效果会比不上ReLU和Maxout

神经网络的输入为什么要0均值化

这样做的优点是为了在反向传播中加快网络中每一层权重参数的收敛。

为什么0均值化就会加快收敛呢?

img

在梯度下降的时候,假设途中蓝色箭头方向为理想最优向量,根据公式,可以想到:

当x全为正或者全为负时,每次返回的梯度都只会沿着一个方向发生变化,这样就回使得权重收敛效率很低

当正负数量“差不多”时,那么梯度的变化方向就会不确定,这样就能达到上图中的变化效果,加速了权重的收敛