题目标题

神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属
性?还有哪些属是好的属性但不必要的

难度:初级

机器学习
参考解析
  1. 非线性:即导数不是常数。这个条件前面很多答主都提到了,是多层神
    经网络的基础,保证多层网络不退化成单层线性网络。这也是激活函数的意义
    所在。
    1. 几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函
      数如 sigmoid 等满足处处可微。对于分段线性函数比如 ReLU,只满足几乎处
      处可微(即仅在有限个点处不可微)。对于 SGD 算法来说,由于几乎不可能收
      敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响[1]。
    2. 计算简单:正如题主所说,非线性函数有很多。极端的说,一个多层神
      经网络也可以作为一个非线性函数,类似于 Network In Network[2]中把它当
      做卷积操作的做法。但激活函数在神经网络前向的计算次数与神经元的个数成
      正比,因此简单的非线性函数自然更适合用作激活函数。这也是 ReLU 之流比
      其它使用 Exp 等操作的激活函数更受欢迎的其中一个原因。
    3. 非饱和性(saturation):饱和指的是在某些区间梯度接近于零(即梯
      度消失),使得参数无法继续更新的问题。最经典的例子是 Sigmoid,它的导
      数在 x 为比较大的正值和比较小的负值时都会接近于 0。更极端的例子是阶跃
      函数,由于它在几乎所有位置的梯度都为 0,因此处处饱和,无法作为激活函
      数。ReLU 在 x>0 时导数恒为 1,因此对于再大的正值也不会饱和。但同时对
      于 x<0,其梯度恒为 0,这时候它也会出现饱和的现象(在这种情况下通常称
      为 dying ReLU)。Leaky ReLU[3]和 PReLU[4]的提出正是为了解决这一问
      题。
    4. 单调性(monotonic):即导数符号不变。这个性质大部分激活函数都
      有,除了诸如 sin、cos 等。个人理解,单调性使得在激活函数处的梯度方向不
      会经常改变,从而让训练更容易收敛。
    5. 输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会比
      较稳定,这也是为什么早期的激活函数都以此类函数为主,如 Sigmoid、
      TanH。但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到
      固定范围会限制其表达能力。因此现在这类函数仅用于某些需要特定输出范围
      的场合,比如概率输出(此时 loss 函数中的 log 操作能够抵消其梯度消失的影
      响[1])、LSTM 里的 gate 函数。
    6. 接近恒等变换(identity):即约等于 x。这样的好处是使得输出的幅
      值不会随着深度的增加而发生显著的增加,从而使网络更为稳定,同时梯度也
      能够更容易地回传。这个与非线性是有点矛盾的,因此激活函数基本只是部分
      满足这个条件,比如 TanH 只在原点附近有线性区(在原点为 0 且在原点的导
      数为 1),而 ReLU 只在 x>0 时为线性。这个性质也让初始化参数范围的推导
      更为简单[5][4]。额外提一句,这种恒等变换的性质也被其他一些网络结构设计
      所借鉴,比如 CNN 中的 ResNet[6]和 RNN 中的 LSTM。
    7. 参数少:大部分激活函数都是没有参数的。像 PReLU 带单个参数会略
      微增加网络的大小。还有一个例外是 Maxout[7],尽管本身没有参数,但在同
      样输出通道数下 k 路 Maxout 需要的输入通道数是其它函数的 k 倍,这意味着
      神经元数目也需要变为 k 倍;但如果不考虑维持输出通道数的情况下,该激活
      函数又能将参数个数减少为原来的 k 倍。
    8. 归一化(normalization):这个是最近才出来的概念,对应的激活函
      数是 SELU[8],主要思想是使样本分布自动归一化到零均值、单位方差的分
      布,从而稳定训练。在这之前,这种归一化的思想也被用于网络结构的设计,
      比如 Batch Normalization[9