当神经网络停止学习时:理解梯度消失
Source: Dev.to
请提供您希望翻译的完整文本内容,我将为您翻译成简体中文。
什么是梯度消失问题?
在神经网络中,梯度告诉网络需要改变每个权重多少以降低误差。
如果梯度太小,网络学习极其缓慢,甚至有时完全停止学习。这就是梯度消失问题。
为什么会发生?
消失梯度通常出现在 深层网络 中,尤其是使用 sigmoid 这类激活函数时。
Sigmoid 会把输入压缩到一个很小的范围:0 到 1。当你在许多层之间计算梯度时,早期层的梯度计算方式为:
Gradient of layer 1 = Gradient at output × product of gradients of all subsequent layers
由于每个梯度 小于 1,将许多小数相乘会导致梯度非常微小,几乎为零,尤其是对早期层而言。
可视化梯度消失
import numpy as np
import matplotlib.pyplot as plt
# Sigmoid activation
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Sigmoid gradient
def sigmoid_grad(x):
s = sigmoid(x)
return s * (1 - s)
x = np.linspace(-10, 10, 1000)
grad = sigmoid_grad(x)
plt.figure(figsize=(8, 4))
plt.plot(x, grad, label="Sigmoid Gradient")
plt.title("Sigmoid Gradient (Vanishing at Extremes)")
plt.xlabel("Input")
plt.ylabel("Gradient")
plt.grid(True)
plt.legend()
plt.show()

观察: 对于大幅正或负输入,梯度非常小。这就是导致深层网络中梯度消失的原因。
简单深度网络模拟
# Simulate deep network gradient
layers = 10
x = 5 # extreme input
grad = 1.0
for i in range(layers):
grad *= sigmoid_grad(x) # multiply by each layer's gradient
print(f"Layer {i+1}, Gradient: {grad:.8f}")
输出
Layer 1, Gradient: 0.00665
Layer 2, Gradient: 0.00004
Layer 3, Gradient: 0.00000
Layer 4, Gradient: 0.00000
Layer 5, Gradient: 0.00000
Layer 6, Gradient: 0.00000
Layer 7, Gradient: 0.00000
Layer 8, Gradient: 0.00000
Layer 9, Gradient: 0.00000
Layer 10, Gradient: 0.00000
观察: 梯度迅速变得极其小。早期层 无法有效学习。
Source: …
使用 ReLU 的缓解
ReLU 不会压缩正值,因此梯度 不容易消失。
我们在类似的深层网络中比较 sigmoid 和 ReLU:
# ReLU activation and gradient
def relu(x):
return np.maximum(0, x)
def relu_grad(x):
return np.where(x > 0, 1, 0)
layers = 10
x = 5 # extreme input
# Sigmoid deep gradient
grad_sigmoid = 1.0
grad_relu = 1.0
for i in range(layers):
grad_sigmoid *= sigmoid_grad(x)
grad_relu *= relu_grad(x)
print(f"Layer {i+1}, Sigmoid Grad: {grad_sigmoid:.8f}, ReLU Grad: {grad_relu}")
输出
Layer 1, Sigmoid Grad: 0.00664806, ReLU Grad: 1.0
Layer 2, Sigmoid Grad: 0.00004420, ReLU Grad: 1.0
Layer 3, Sigmoid Grad: 0.00000029, ReLU Grad: 1.0
Layer 4, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 5, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 6, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 7, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 8, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 9, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
Layer 10, Sigmoid Grad: 0.00000000, ReLU Grad: 1.0
观察
- Sigmoid 的梯度迅速消失。
- 只要输入为正,ReLU 的梯度保持 1,从而实现 更快且更稳定的学习。
总结
希望你现在对梯度消失问题有了清晰的认识。结合激活函数和梯度,这一概念构成了理解神经网络的核心构件之一。在后续的文章中,我们将以此为基础,探讨接下来会涉及的内容。
你可以通过Colab notebook尝试这些示例。