神经元死亡问题:
在使用 ReLU 激活函数及其变种激活函数时,输入小于零的神经元会输出零。这可能会带来神经元死亡问题。
神经元死亡问题的原因和影响
某一个神经元输出0后,代表这个神经元死亡,这些神经元在前向传播中不再对输入产生任何影响。
- 如果在训练过程中某些神经元的权重被调整到使它们的输入始终小于零,这些神经元就会“死亡”,完全不参与后续的学习。
- 如果模型中存在大量的死神经元,可能导致其表达能力下降,因为这些神经元不再捕捉任何特征,从而限制了网络学习的复杂性和能力。
解决方法:
- Leaky ReLU 允许负输入有一个小的非零输出(例如,输出为输入的 0.01 倍),从而减少神经元死亡的概率。
- Parametric ReLU(PReLU)则将Leaky ReLU中小的斜率变为可学习的参数。
- Swish激活函数可以解决细胞死亡问题,它是一个非单调激活函数,
x
<
0
x<0
x<0 时输出会小于输入值,可以有效地保持非负信息。
Swish ( x ) = x ⋅ σ ( x ) = x ⋅ 1 1 + e − x \text{Swish}(x) = x \cdot \sigma(x) = x \cdot \frac{1}{1 + e^{-x}} Swish(x)=x⋅σ(x)=x⋅1+e−x1 - GELU也是ReLU的替代方案,它是一种随机性激活函数,将输入值与对应的概率相乘,在正值区域,GELU的输出接近输入,在负值区域,它会有更小的输出值
GELU ( x ) = x ⋅ Φ ( x ) = x ⋅ 1 2 ( 1 + erf ( x 2 ) ) \text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2} \left( 1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right) \right) GELU(x)=x⋅Φ(x)=x⋅21(1+erf(2 x))
erf ( x ) = 2 π ∫ 0 x e − t 2 d t \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} \, dt erf(x)=π 2∫0xe−t2dt - 学习率过高可能会导致权重更新过大,从而使得神经元更容易进入死区。调整学习率可能有助于减少这种情况。
- 使用批归一化(Batch Normalization)可以帮助保持激活分布,使得神经元不容易进入死亡状态。