隐藏层的各种激活函数

概述

激活函数(Activation functions)能令神经网络产生非线性变化,增强网络表达能力,在设计网络时必不可少。

各种激活函数

激活函数 表达式 第一印象
Sigmoid \(\frac{1}{1+e^{-x}}\) 最早使用的激活函数之一
Tanh \(\frac{e^{2x}-1}{e^{2x}+1}\) 0 均值版本的 Sigmoid
ReLU \(\max (x,0)\) 当下最流行的激活函数

Sigmoid

Sigmoid 在激活函数历史上有着重要的作用,是最早使用的激活函数之一。

但它有很多缺点:

  • 计算成本高
  • 输出均值非 0,优化器难以学习权重
  • \(x\) 极大或极小时容易梯度消失(饱和现象)

Sigmoid 不应是首选的隐藏层激活函数,还是让它做二分类本职任务吧。

Tanh

Tanh 是 Sigmoid 的变形。解决了输出均值非 0 的问题,仍然会有饱和现象。

在 GAN 的生成器网络中,可以在输出层利用 tanh 函数将网络的内部表示映射到所需的输出范围,例如图像生成中的像素值在 -1 到 1 之间。

ReLU

ReLU(Rectified linear unit)是现代神经网络中最常用的激活函数。速度极快,简单有效。又因为 ReLU 会使部分神经元输出为 0,可减少参数的相互依存关系,缓解过拟合问题的发生。

ReLU 可能导致 dead ReLU 现象——神经元永远不响应输入,且参数不被更新。这个缺陷可用 Xavier 参数初始化、使用 AdaGrad 自动调节 learning rate 等方法缓解。

ReLu 的改造

为了避免 dead ReLU 现象,需要改造 ReLU 函数,使其在 \(x<0\) 时能够产生相应。

Leaky ReLU 的表达式如下,其中 \(0.01\) 可以定为其他较小的值。

\[\text{Leaky ReLU}(x)= \begin{cases} x& x\ge 0\\ 0.01x& x<0 \end{cases} \]

PReLU 的表达式如下,其中 \(\alpha\) 是可学习参数,而不是固定值。

\[\text{PReLU}(\alpha,x)= \begin{cases} x& x\ge 0\\ \alpha x& x<0 \end{cases} \]

RReLU 类似于 PReLU,但 \(\alpha\) 是高斯分布 \(U(l,u)\) 的采样值。这会让训练过程有随机因素,减少过拟合风险。推理时一般 \(\alpha\) 取高斯分布均值。

其他激活函数

ELU(exponential linear units)的表达式如下,其中 \(\alpha>0\) 是固定值。ELU 的输出平均值更接近于 0,缓解梯度消失从而加快学习速度,有负数饱和区域从而对噪声有鲁棒性。理论性能好于 Leaky ReLU、PReLU 和 RReLU,但计算成本高得多。

较大的 \(\alpha\) 有助于抑制负输入的影响,促进稀疏性、降低神经元饱和(输入接近边界而导致梯度消失)的可能性。若 \(\alpha\) 大于 1,ELU 对负输入更加敏感。

\[\text{ELU}(\alpha,x)= \begin{cases} x& x\ge 0\\ \alpha (e^x-1)& x<0 \end{cases} \]

SELU(scaled ELU)的表达式如下。拥有自归一化的能力,其激活输出接近于 0 均值 1 方差的高斯分布(内部归一化 internal normalization),有效解决梯度爆炸或梯度消失的问题。在一些全连接网络和部分 RNN 网络体现出优势。

SELU 的自归一化能力基于某些特定假设,例如网络所有层都使用 SELU 激活,并采用一种称为 SELU 初始化的权重初始化。

\(\lambda\) 通常会随其他超参一同调整,以达到最优性能。

\[\text{SELU}(\alpha,\lambda,x)= \lambda \begin{cases} x& x> 0\\ \alpha (e^x-1)& x\le 0 \end{cases}\\ \alpha \approx 1.6732632423543772848170429916717\\ \lambda \approx 1.0507009873554804934193349852946 \]

GELU(Gaussian Error Linear Unit)的表达式如下。被证明在各种网络中表现良好,特别是在 NLP 和 transformer 中。

\[\text{GELU}(x)=x\cdot P(X\le x)\approx 0.5x\left (1+\text{tanh}\left(\frac{2}{\pi}(x+0.044715x^3)\right)\right) \]

Softplus 的表达式如下。SoftPlus 可以视作 ReLU 的平滑近似,但没有 ReLU 的稀疏激活性(输出均大于零)。输入值远大于 0 时会出现饱和效应,就此而言 ELU 或 Swish 等更受欢迎。

\[\text{Softplus}(x)=\ln (1+e^x) \]

Swish 的表达式如下。Swish 函数形状与 ReLU 相似,但更平滑且非单调。实验结论是其性能普遍匹配或略优于 ReLU。若希望在使用 ReLU 的网络提高准度,将所有 ReLU 替换为 Swish 也许值得一试。

\[\text{Swish}(x)=x\cdot \text{sigmoid}(x)=\frac{x}{1+e^{-x}} \]

HardSwish 的表达式如下。近似于 \(Swish\),且运算量大大降低。

\[\text{HardSwish}(x)=x\cdot \frac{\text{ReLU}\left(6(x+3)\right)}{6} \]

Mish 的表达式如下。输入值较大时, Mish 函数趋于线性。特别是在计算机视觉和自然语言处理中表现良好。

\[\text{Mish}(x)=x\cdot \text{tanh}(\text{softplus}(x)) \]

如何选择激活函数?

ReLU 简单有效,是永远的经典。

追求低运算成本,可以考虑 ReLU 系列(Leaky ReLU、PReLU、PReLU)。

追求性能,ELU 或 Swish 值得一试。

参考来源

posted @ 2024-03-16 22:49  倒地  阅读(39)  评论(0编辑  收藏  举报