隐藏层的各种激活函数
概述
激活函数(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\) 可以定为其他较小的值。
PReLU 的表达式如下,其中 \(\alpha\) 是可学习参数,而不是固定值。
RReLU 类似于 PReLU,但 \(\alpha\) 是高斯分布 \(U(l,u)\) 的采样值。这会让训练过程有随机因素,减少过拟合风险。推理时一般 \(\alpha\) 取高斯分布均值。
其他激活函数
ELU(exponential linear units)的表达式如下,其中 \(\alpha>0\) 是固定值。ELU 的输出平均值更接近于 0,缓解梯度消失从而加快学习速度,有负数饱和区域从而对噪声有鲁棒性。理论性能好于 Leaky ReLU、PReLU 和 RReLU,但计算成本高得多。
较大的 \(\alpha\) 有助于抑制负输入的影响,促进稀疏性、降低神经元饱和(输入接近边界而导致梯度消失)的可能性。若 \(\alpha\) 大于 1,ELU 对负输入更加敏感。
SELU(scaled ELU)的表达式如下。拥有自归一化的能力,其激活输出接近于 0 均值 1 方差的高斯分布(内部归一化 internal normalization),有效解决梯度爆炸或梯度消失的问题。在一些全连接网络和部分 RNN 网络体现出优势。
SELU 的自归一化能力基于某些特定假设,例如网络所有层都使用 SELU 激活,并采用一种称为 SELU 初始化的权重初始化。
\(\lambda\) 通常会随其他超参一同调整,以达到最优性能。
GELU(Gaussian Error Linear Unit)的表达式如下。被证明在各种网络中表现良好,特别是在 NLP 和 transformer 中。
Softplus 的表达式如下。SoftPlus 可以视作 ReLU 的平滑近似,但没有 ReLU 的稀疏激活性(输出均大于零)。输入值远大于 0 时会出现饱和效应,就此而言 ELU 或 Swish 等更受欢迎。
Swish 的表达式如下。Swish 函数形状与 ReLU 相似,但更平滑且非单调。实验结论是其性能普遍匹配或略优于 ReLU。若希望在使用 ReLU 的网络提高准度,将所有 ReLU 替换为 Swish 也许值得一试。
HardSwish 的表达式如下。近似于 \(Swish\),且运算量大大降低。
Mish 的表达式如下。输入值较大时, Mish 函数趋于线性。特别是在计算机视觉和自然语言处理中表现良好。
如何选择激活函数?
ReLU 简单有效,是永远的经典。
追求低运算成本,可以考虑 ReLU 系列(Leaky ReLU、PReLU、PReLU)。
追求性能,ELU 或 Swish 值得一试。
参考来源
- “Deep convolutional neural network–based image classification for COVID-19 diagnosis”,https://www.sciencedirect.com/topics/engineering/activation-function
- deephub,“激活函数其实并不简单:最新的激活函数如何选择?”,https://zhuanlan.zhihu.com/p/409247652
- Santosh Singh,“Activation functions and their advantages & disadvantages”,https://medium.com/@santosh76792/activation-functions-and-their-advantages-disadvantages-d5eaa1717805
- Okan Yenigün,“Choosing the Right Activation Function in Deep Learning: A Practical Overview and Comparison”,https://python.plainenglish.io/choosing-the-right-activation-function-in-deep-learning-a-practical-overview-and-comparison-c5372fe167f8
- Diganta Misra,“The Swish Activation Function”,https://blog.paperspace.com/swish-activation-function/