激活函数(activation function)层又称 非线性映射 (non-linearity mapping) 层,作用是 增加整个网络的非线性(即 表达能力 或 抽象能力)。
深度学习之所以拥有 强大的表示能力 ,法门便在于 激活函数 的 非线性 。
然而物极必反。由于 非线性设计 所带来的一系列 副作用(如 期望均值不为0、死区),迫使炼丹师们设计出种类繁多的激活函数来 约束 非线性 的 合理范围 。
由于激活函数接在bn之后,所以激活函数的输入被限制在了 (-1, 1) 之间。因此,即使是relu这种简易的激活函数,也能很好地发挥作用。
激活函数中,常用的有Sigmoid、tanh(x)、Relu、Relu6、Leaky Relu、参数化Relu、随机化Relu、ELU。
其中,最经典的莫过于 Sigmoid函数 和 Relu函数 。
Sigmoid函数,即著名的 Logistic 函数。
被用作神经网络的阈值函数,将变量映射到 (0,1) 之间:
S(x)=11+e−x.S(x)=11+e−x.
{\displaystyle S(x)={\frac {1}{1+e^{-x}}}.}
[黄线]
,不符合 均值为 0 的理想状态。[蓝框区域]
:tanh是双曲函数中的一种,又名 双曲正切 :
tanh(x)=2S(2x)−1=ex−e−xex+e−xtanh(x)=2S(2x)−1=ex−e−xex+e−x
{\displaystyle \tanh(x)={2S(2x)-1}={\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}}\,}
[黄线]
这一理想状态。[蓝框区域]
(此时“死区”甚至还扩张了区间范围):
Relu函数,Rectified Linear Unit,又称 修正线性单元 :
f(x)=max(0,x)f(x)=max(0,x)
{\displaystyle f(x)=\max(0,x)}
Relu设计已成为了当下的标配。
当下和relu相关的两大标配:
[蓝框区域]
直接蚕食到了 0点 。
由于 Relu 函数 的 正半轴 不施加任何非线性约束,因此当输入为 正大数 时,易引起 正半轴上 的 梯度爆炸 。因此,Relu6 应运而生:
f(x)=min(max(0,x),6)f(x)=min(max(0,x),6)
{\displaystyle f(x)=\min(\max(0,x),6)}
但是15年bn出来之后,输入被归一化到了 (-1, 1) 之间。因此,relu6的设计就显得没有必要了。
对 Relu 函数 新增一 超参数 λλ\lambda ,以解决负半轴的死区问题:
f(x)={xλx当x≥0时;当x<0时.f(x)={x当x≥0时;λx当x<0时.
f(x)=\left\{\begin{array}{ll}x &\mbox{当x≥0时;}\\\lambda x &\mbox{当x<0时.}\end{array}\right.
其中,超参数 λλ\lambda 常被设定为 0.01 或 0.001 数量级的 较小正数 。
将 Leaky Relu 函数 中的 超参数 λλ\lambda 设置为 和模型一起 被训练到 的 变量,以解决λλ\lambda 值 较难设定 的问题。
将 Leaky Relu 函数 中的 超参数 λλ\lambda 随机设置 。
ELU函数,Exponential Linear Unit,又称 指数化线性单元 ,于2016年提出。
f(x)={xλ(exp(x)−1)当x≥0时;当x<0时.f(x)={x当x≥0时;λ(exp(x)−1)当x<0时.
f(x)=\left\{\begin{array}{ll}x &\mbox{当x≥0时;}\\\lambda (\exp(x)-1) &\mbox{当x<0时.}\end{array}\right.
其中,超参数 λλ\lambda 常被设定为 1 。
下图摘自:【机器学习】神经网络-激活函数-面面观(Activation Function)
Tensorflow中激活函数的 API使用 参见我的另一篇文章:tensorflow: 激活函数(Activation_Functions) 探究