什么是梯度爆炸?

梯度爆炸(Gradient Exploding)问题是指在深层神经网络的训练过程中,梯度的值变得非常大,超过一个阈值(如1e5),导致网络权重更新失控,模型性能急剧下降。

梯度爆炸的主要原因是:

  1. 激活函数如sigmoid的梯度在两个极端输入附近梯度变得非常大,容易导致梯度爆炸。
  2. 深层网络权重初始化不当,比如设置过大的值,使得输入信号在前向和反向传播过程中放大,导致梯度变得非常大。
  3. 学习率设置过大,一旦梯度较大,更新后的权重变化就可能非常剧烈,进而导致梯度进一步放大。

代码示例:

python
import numpy as np

# 定义sigmoid激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x)) 

# 输入
x = np.random.randn(10, 10)  

# 5层网络,每层10个神经元  
for layer in range(5):
    w = np.random.randn(10, 10) * 0.1  # 权重初始化为较大的值
    b = np.random.randn(10)          
    x = sigmoid(np.dot(x, w) + b)  

# 计算输出对输入的梯度  
delta = x * (1 - x)
for layer in range(4, -1, -1):
    w = np.random.randn(10, 10) * 0.1  
    delta = np.dot(delta, w.T) * (x * (1 - x))  

print(delta)  # 梯度非常大,发生了爆炸

在示例中,我们构建了一个5层网络,使用sigmoid作为激活函数,并将权重初始化为较大的值0.1。结果可以看到,在反向传播计算delta时,delta的值变得非常大,这就是梯度爆炸。

为了解决梯度爆炸,主要采取以下措施:

  1. 权重初始化设置较小的值,避免输入信号放大。
  2. 选择合适的激活函数,如ReLU等,避免在两个极端输入处梯度过大。
  3. 选择较小的学习率,使得权重更新不至于太剧烈。
  4. 使用梯度裁剪(Gradient Clipping)技术,裁剪超过阈值的梯度,限制其最大幅度。
  5. 使用批量归一化等技术,使得输入层面的数据分布比较统一,避免部分样本梯度过大。

梯度爆炸也是深度神经网络训练过程中必须考虑和解决的问题。理解梯度爆炸产生的原因,并合理应用相关技术,可以使我们训练出性能更优和更稳定的深层神经网络模型。