神经网络的激活函数(六)GELU和Mish
GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种在深度学习中广泛应用的激活函数。GELU通过高斯误差函数(即标准正态分布的累积分布函数)对输入进行平滑处理,从而提高模型的性能。GELU在许多任务中表现出色,特别是在自然语言处理(NLP)和计算机视觉任务中。
GELU函数的数学表达式为:
其中:
-
$x$ 是输入。 -
$\Phi(x)$ 是标准正态分布的累积分布函数,定义为:$\Phi(x) = \frac{1}{2} \left( 1 + \text{erf}\left( \frac{x}{\sqrt{2}} \right) \right)$
其中,$\text{erf}(x)$ 是误差函数。
为了简化计算,GELU函数通常采用以下近似表达式:
这种近似计算在实际应用中非常常见,因为它计算效率更高。
- 平滑性:GELU函数是连续且平滑的,这有助于提高模型的稳定性和收敛速度。
- 非线性:GELU结合了线性和非线性变换,使得模型能够学习复杂的模式。
- 概率解释:GELU通过高斯误差函数对输入进行平滑处理,从而具有概率解释,即输入值越大,通过的概率越高。
GELU激活函数是在2016年由Dan Hendrycks和Kevin Gimpel在论文《Gaussian Error Linear Units (GELUs)》中提出的。
- 平滑激活:GELU通过引入高斯误差函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
- 非线性增强:GELU结合了线性变换和非线性激活,从而增强了模型的非线性特性。
- 概率解释:GELU具有概率解释,使得输入值越大,通过的概率越高,从而更好地模拟神经元的激活过程。
以下是一个简单的Python示例,展示如何计算GELU函数:
from scipy.special import erf
# 定义GELU函数
def gelu(x):
return 0.5 * x * (1 + erf(x / np.sqrt(2)))
Mish激活函数是一种在深度学习中使用的非线性激活函数,由Diganta Misra在2019年提出。Mish激活函数通过平滑的非线性变换来增强模型的性能,并且在许多任务中表现出色,包括计算机视觉和自然语言处理。
Mish激活函数的数学表达式为:
其中:
-
$\text{softplus}(x) = \ln(1 + e^x)$ 是Softplus函数。 -
$\tanh(x)$ 是双曲正切函数。
- 平滑性:Mish函数是连续且平滑的,这有助于提高模型的稳定性和收敛速度。
- 非单调性:Mish函数是非单调的,这意味着它在某些区间内是递增的,而在其他区间内是递减的。这种特性使得Mish能够捕捉到更复杂的模式。
- 无界性:与ReLU不同,Mish函数在负值区域是无界的,这有助于梯度流动,避免梯度消失问题。
- 近似ReLU:当输入值较大时,Mish函数近似于ReLU函数。
Mish激活函数是在2019年由Diganta Misra在论文《Mish: A Self Regularized Non-Monotonic Neural Activation Function》中提出的。
- 平滑激活:Mish通过引入Softplus和双曲正切函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
- 非单调性:Mish的非单调性使得它能够捕捉到更复杂的模式,比ReLU等单调激活函数更具表现力。
- 梯度流动:Mish在负值区域是无界的,这有助于梯度流动,避免梯度消失问题。
以下是一个简单的Python示例,展示如何计算Mish函数:
import numpy as np
import matplotlib.pyplot as plt
# 定义Softplus函数
def softplus(x):
return np.log1p(np.exp(x))
# 定义Mish函数
def mish(x):
return x * np.tanh(softplus(x))
[1] Gaussian Error Linear Units (GELUs)
[2] Mish: A Self Regularized Non-Monotonic Neural Activation Function
仓库上有原始的Markdown文件,完全开源,欢迎大家Star和Fork!