神经网络核心组件全解析:激活函数、损失函数、优化器与鞍点问题
一文搞懂神经网络训练中的所有核心组件,从原理到选型,从公式到实战。
📑 目录
一、激活函数是什么?
为什么需要激活函数?
如果没有激活函数,神经网络会退化成线性模型:
y = W 2 ⋅ ( W 1 ⋅ x + b 1 ) + b 2 = ( W 2 W 1 ) ⋅ x + ( W 2 b 1 + b 2 ) y = W_2 \cdot (W_1 \cdot x + b_1) + b_2 = (W_2 W_1) \cdot x + (W_2 b_1 + b_2) y=W2⋅(W1⋅x+b1)+b2=(W2W1)⋅x+(W2b1+b2)
不管多少层,最终还是一个线性变换。网络再深也等于一层。
加上激活函数后:
h = σ ( W 1 ⋅ x + b 1 ) h = \sigma(W_1 \cdot x + b_1) h=σ(W1⋅x+b1)
y = W 2 ⋅ h + b 2 y = W_2 \cdot h + b_2 y=W2⋅h+b2
网络就能拟合任意复杂的非线性函数。
激活函数分两类
text
隐藏层激活:为了引入非线性,让网络能拟合复杂函数
输出层激活:为了匹配任务,让输出变成想要的形式
两者目的完全不同,不能混为一谈。
二、隐藏层激活函数
2.1 Sigmoid
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
导数:
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))
text
输出范围:(0, 1)
导数范围:(0, 0.25]
| 优点 | 缺点 |
|---|---|
| 可表示概率 | 梯度消失严重 |
| 平滑可导 | 输出非零中心 |
| - | 计算含 exp,慢 |
适用: 二分类输出层(隐藏层已不推荐)
2.2 Tanh
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x
导数:
tanh ′ ( x ) = 1 − tanh 2 ( x ) \tanh'(x) = 1 - \tanh^2(x) tanh′(x)=1−tanh2(x)
text
输出范围:(-1, 1)
导数范围:(0, 1]
| 优点 | 缺点 |
|---|---|
| 零中心 | 仍有梯度消失 |
| 比 Sigmoid 收敛快 | 计算含 exp |
适用: RNN、LSTM 隐藏层
2.3 ReLU(最常用)
ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
导数:
ReLU ′ ( x ) = { 1 , x > 0 0 , x ≤ 0 \text{ReLU}'(x) = \begin{cases} 1, & x > 0 \\ 0, & x \leq 0 \end{cases} ReLU′(x)={1,0,x>0x≤0
text
输出范围:[0, +∞)
导数:0 或 1
| 优点 | 缺点 |
|---|---|
| 计算快 | 死神经元 |
| 不饱和 | 输出非零中心 |
| 稀疏激活 | - |
| 收敛快 | - |
适用: CNN、深层网络、大部分前馈网络、MCU 部署
什么是死神经元?
text
x ≤ 0 时导数恒为 0
如果某个神经元一直输出 0
它的权重永远不更新
这个神经元就"死了"
2.4 LeakyReLU
LeakyReLU ( x ) = { x , x > 0 α x , x ≤ 0 \text{LeakyReLU}(x) = \begin{cases} x, & x > 0 \\ \alpha x, & x \leq 0 \end{cases} LeakyReLU(x)={x,αx,x>0x≤0
通常 α = 0.01 \alpha = 0.01 α=0.01。
| 优点 | 缺点 |
|---|---|
| 解决死神经元 | 多一个超参数 |
| 保留 ReLU 大部分优点 | 输出非零中心 |
适用: 深层网络、GAN
2.5 PReLU
PReLU ( x ) = { x , x > 0 α x , x ≤ 0 \text{PReLU}(x) = \begin{cases} x, & x > 0 \\ \alpha x, & x \leq 0 \end{cases} PReLU(x)={x,αx,x>0x≤0
其中 α \alpha α 是可学习参数。
| 优点 | 缺点 |
|---|---|
| 自适应负半轴斜率 | 参数增多 |
| 比 LeakyReLU 更灵活 | 小数据容易过拟合 |
2.6 ELU
ELU ( x ) = { x , x > 0 α ( e x − 1 ) , x ≤ 0 \text{ELU}(x) = \begin{cases} x, & x > 0 \\ \alpha(e^x - 1), & x \leq 0 \end{cases} ELU(x)={x,α(ex−1),x>0x≤0
| 优点 | 缺点 |
|---|---|
| 零中心 | 计算含 exp |
| 负半轴平滑 | 比 ReLU 慢 |
| 抗噪声 | - |
2.7 SELU
SELU ( x ) = λ { x , x > 0 α ( e x − 1 ) , x ≤ 0 \text{SELU}(x) = \lambda \begin{cases} x, & x > 0 \\ \alpha(e^x - 1), & x \leq 0 \end{cases} SELU(x)=λ{x,α(ex−1),x>0x≤0
其中 λ ≈ 1.0507 \lambda \approx 1.0507 λ≈1.0507, α ≈ 1.6733 \alpha \approx 1.6733 α≈1.6733。
| 优点 | 缺点 |
|---|---|
| 自归一化 | 需要特定初始化 |
| 不需要 BatchNorm | 只适合全连接网络 |
2.8 GELU(Transformer 标配)
GELU ( x ) = x ⋅ Φ ( x ) \text{GELU}(x) = x \cdot \Phi(x) GELU(x)=x⋅Φ(x)
其中 Φ ( x ) \Phi(x) Φ(x) 是标准正态分布的累积分布函数。
近似形式:
GELU ( x ) ≈ 0.5 x ( 1 + tanh ( 2 π ( x + 0.044715 x 3 ) ) ) \text{GELU}(x) \approx 0.5x\left(1 + \tanh\left(\sqrt{\frac{2}{\pi}}(x + 0.044715x^3)\right)\right) GELU(x)≈0.5x(1+tanh(π2 (x+0.044715x3)))
| 优点 | 缺点 |
|---|---|
| 平滑 | 计算稍慢 |
| 效果好 | - |
适用: Transformer(BERT、GPT)
2.9 Swish / SiLU
Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=x⋅σ(x)
| 优点 |
|---|
| 平滑 |
| 无上界有下界 |
| 效果好 |
2.10 Mish
Mish ( x ) = x ⋅ tanh ( ln ( 1 + e x ) ) \text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x)) Mish(x)=x⋅tanh(ln(1+ex))
| 优点 |
|---|
| 平滑 |
| 比 Swish 稍好 |
2.11 隐藏层激活函数对比表
| 函数 | 输出范围 | 梯度消失 | 死神经元 | 计算速度 | 适用 |
|---|---|---|---|---|---|
| Sigmoid | (0, 1) | 严重 | 无 | 慢 | 输出层 |
| Tanh | (-1, 1) | 有 | 无 | 慢 | RNN |
| ReLU | [0, +∞) | 无 | 有 | 快 | 首选 |
| LeakyReLU | (-∞, +∞) | 无 | 无 | 快 | 深层 |
| PReLU | (-∞, +∞) | 无 | 无 | 快 | 深层 |
| ELU | (-α, +∞) | 无 | 无 | 中 | 抗噪 |
| SELU | (-λα, +∞) | 无 | 无 | 中 | 自归一化 |
| GELU | (-∞, +∞) | 无 | 无 | 中 | Transformer |
| Swish | (-∞, +∞) | 无 | 无 | 中 | 通用 |
| Mish | (-∞, +∞) | 无 | 无 | 中 | 通用 |
2.12 隐藏层选型口诀
text
默认首选:ReLU
死神经元多:LeakyReLU / PReLU
RNN/LSTM:Tanh
Transformer:GELU
自归一化网络:SELU
MCU 部署:ReLU
三、输出层激活函数
3.1 Softmax(多分类互斥)
Softmax ( x i ) = e x i ∑ j = 1 K e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}} Softmax(xi)=∑j=1Kexjexi
text
输出范围:(0, 1)
所有输出之和 = 1
可看作概率分布
数值稳定版:
Softmax ( x i ) = e x i − max ( x ) ∑ j e x j − max ( x ) \text{Softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_j e^{x_j - \max(x)}} Softmax(xi)=∑jexj−max(x)exi−max(x)
适用: 多分类互斥,搭配 CrossEntropyLoss
3.2 Sigmoid(二分类 / 多标签)
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
text
输出范围:(0, 1)
每个输出独立
输出之和 ≠ 1
适用: 二分类、多标签分类,搭配 BCELoss
3.3 Linear(回归)
Linear ( x ) = x \text{Linear}(x) = x Linear(x)=x
text
输出范围:(-∞, +∞)
不做任何变换
适用: 回归任务,搭配 MSELoss
3.4 Tanh(有界回归)
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x
text
输出范围:(-1, 1)
零中心
适用: 回归(有界输出)、角度预测(sin/cos)
3.5 输出层激活函数选择表
| 任务 | 输出层激活 | 损失函数 | 输出之和 |
|---|---|---|---|
| 多分类互斥 | Softmax | CrossEntropy | = 1 |
| 二分类 | Sigmoid | BCE | ≠ 1 |
| 多标签 | Sigmoid | BCE | ≠ 1 |
| 回归 | Linear | MSE | 无意义 |
| 有界回归 | Tanh | MSE | 无意义 |
3.6 常见疑问:Sigmoid 能多分类吗?
能,但那是多标签分类,不是多分类互斥。
text
多标签:每个标签独立,Sigmoid,BCE
例子:一张图可以同时有猫、狗、人
输出:[0.9, 0.7, 0.3],加起来 ≠ 1
多分类互斥:只能选一个,Softmax,CrossEntropy
例子:一张图只能是猫、狗、人中的一种
输出:[0.7, 0.2, 0.1],加起来 = 1
关键区别:输出之和要不要等于 1。
四、损失函数
4.1 MSE(均方误差)
MSE = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 MSE=N1i=1∑N(yi−y^i)2
导数:
∂ MSE ∂ y ^ i = 2 N ( y ^ i − y i ) \frac{\partial \text{MSE}}{\partial \hat{y}_i} = \frac{2}{N}(\hat{y}_i - y_i) ∂y^i∂MSE=N2(y^i−yi)
| 优点 | 缺点 |
|---|---|
| 数学形式简单 | 对异常值敏感 |
| 对大误差敏感 | 分类任务梯度消失 |
适用: 回归
4.2 MAE(平均绝对误差)
MAE = 1 N ∑ i = 1 N ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| MAE=N1i=1∑N∣yi−y^i∣
| 优点 | 缺点 |
|---|---|
| 对异常值鲁棒 | 零点不可导 |
| 梯度稳定 | 收敛慢 |
4.3 Huber Loss
Huber = { 1 2 ( y − y ^ ) 2 , ∣ y − y ^ ∣ ≤ δ δ ∣ y − y ^ ∣ − 1 2 δ 2 , 否则 \text{Huber} = \begin{cases} \frac{1}{2}(y - \hat{y})^2, & |y - \hat{y}| \leq \delta \\ \delta |y - \hat{y}| - \frac{1}{2}\delta^2, & \text{否则} \end{cases} Huber={21(y−y^)2,δ∣y−y^∣−21δ2,∣y−y^∣≤δ否则
| 优点 |
|---|
| 小误差用 MSE,大误差用 MAE |
| 兼顾精度和鲁棒性 |
4.4 CrossEntropy(多分类标配)
CE = − ∑ i = 1 K y i log ( y ^ i ) \text{CE} = -\sum_{i=1}^{K} y_i \log(\hat{y}_i) CE=−i=1∑Kyilog(y^i)
因为 one-hot,简化为:
CE = − log ( y ^ 正确类别 ) \text{CE} = -\log(\hat{y}_{\text{正确类别}}) CE=−log(y^正确类别)
导数(对 logits):
∂ CE ∂ z i = y ^ i − y i \frac{\partial \text{CE}}{\partial z_i} = \hat{y}_i - y_i ∂zi∂CE=y^i−yi
| 优点 | 缺点 |
|---|---|
| 梯度干净 | 对噪声敏感 |
| 收敛快 | - |
| 适合分类 | - |
适用: 多分类互斥,搭配 Softmax
4.5 BCE(二元交叉熵)
BCE = − 1 N ∑ i = 1 N y i log ( y \^ i ) + ( 1 − y i ) log ( 1 − y \^ i ) \text{BCE} = -\frac{1}{N} \sum_{i=1}^{N} y_i \\log(\\hat{y}_i) + (1 - y_i) \\log(1 - \\hat{y}_i) BCE=−N1i=1∑Nyilog(y\^i)+(1−yi)log(1−y\^i)
导数:
∂ BCE ∂ z i = y ^ i − y i \frac{\partial \text{BCE}}{\partial z_i} = \hat{y}_i - y_i ∂zi∂BCE=y^i−yi
适用: 二分类、多标签,搭配 Sigmoid
4.6 Focal Loss(类别不平衡)
FL = − α ( 1 − y ^ ) γ log ( y ^ ) \text{FL} = -\alpha (1 - \hat{y})^\gamma \log(\hat{y}) FL=−α(1−y^)γlog(y^)
其中 γ \gamma γ 是聚焦参数,通常取 2。
| 优点 |
|---|
| 解决类别不平衡 |
| 聚焦难样本 |
适用: 目标检测、类别不平衡分类
4.7 KL 散度
KL ( P ∥ Q ) = ∑ i P ( i ) log P ( i ) Q ( i ) \text{KL}(P \| Q) = \sum_i P(i) \log \frac{P(i)}{Q(i)} KL(P∥Q)=i∑P(i)logQ(i)P(i)
适用: 知识蒸馏、分布对齐、变分自编码器
4.8 Triplet Loss
L = max ( 0 , d ( a , p ) − d ( a , n ) + margin ) L = \max(0, d(a, p) - d(a, n) + \text{margin}) L=max(0,d(a,p)−d(a,n)+margin)
其中:
text
a = anchor(锚点)
p = positive(同类)
n = negative(异类)
适用: 人脸识别、度量学习
4.9 损失函数对比表
| 损失 | 任务 | 输出层 | 对大误差 | 对异常值 |
|---|---|---|---|---|
| MSE | 回归 | Linear | 非常敏感 | 敏感 |
| MAE | 回归 | Linear | 线性 | 鲁棒 |
| Huber | 回归 | Linear | 折中 | 较鲁棒 |
| CE | 多分类 | Softmax | 敏感 | 敏感 |
| BCE | 二分类/多标签 | Sigmoid | 敏感 | 敏感 |
| Focal | 不平衡分类 | Softmax | 聚焦难样本 | 敏感 |
| KL | 分布对齐 | Softmax | - | - |
| Triplet | 度量学习 | Linear | - | - |
4.10 损失函数选型口诀
text
回归 → MSE / Huber / MAE
多分类互斥 → CrossEntropy
二分类 → BCE
多标签 → BCE
类别不平衡 → Focal Loss
知识蒸馏 → KL
度量学习 → Triplet
五、梯度优化器
5.1 SGD(随机梯度下降)
w = w − η ⋅ g w = w - \eta \cdot g w=w−η⋅g
| 优点 | 缺点 |
|---|---|
| 简单 | 容易震荡 |
| 内存小 | 收敛慢 |
| 泛化好 | 对学习率敏感 |
5.2 Momentum(加惯性)
v = β ⋅ v + g v = \beta \cdot v + g v=β⋅v+g
w = w − η ⋅ v w = w - \eta \cdot v w=w−η⋅v
| 优点 |
|---|
| 方向稳 |
| 冲过小坑 |
| 加速收敛 |
5.3 Nesterov Momentum
v = β ⋅ v + ∇ L ( w − η ⋅ β ⋅ v ) v = \beta \cdot v + \nabla L(w - \eta \cdot \beta \cdot v) v=β⋅v+∇L(w−η⋅β⋅v)
w = w − η ⋅ v w = w - \eta \cdot v w=w−η⋅v
| 优点 |
|---|
| 比 Momentum 更准 |
| 收敛更快 |
5.4 Adagrad
s = s + g 2 s = s + g^2 s=s+g2
w = w − η s + ϵ ⋅ g w = w - \frac{\eta}{\sqrt{s} + \epsilon} \cdot g w=w−s +ϵη⋅g
| 优点 | 缺点 |
|---|---|
| 自适应学习率 | 学习率单调递减 |
| 适合稀疏数据 | 后期几乎不更新 |
5.5 RMSprop
s = β ⋅ s + ( 1 − β ) ⋅ g 2 s = \beta \cdot s + (1 - \beta) \cdot g^2 s=β⋅s+(1−β)⋅g2
w = w − η s + ϵ ⋅ g w = w - \frac{\eta}{\sqrt{s} + \epsilon} \cdot g w=w−s +ϵη⋅g
| 优点 |
|---|
| 自适应学习率 |
| 适合 RNN |
| 对学习率不敏感 |
5.6 Adam(最常用)
一阶矩:
m = β 1 ⋅ m + ( 1 − β 1 ) ⋅ g m = \beta_1 \cdot m + (1 - \beta_1) \cdot g m=β1⋅m+(1−β1)⋅g
二阶矩:
v = β 2 ⋅ v + ( 1 − β 2 ) ⋅ g 2 v = \beta_2 \cdot v + (1 - \beta_2) \cdot g^2 v=β2⋅v+(1−β2)⋅g2
偏差修正:
m ^ = m 1 − β 1 t , v ^ = v 1 − β 2 t \hat{m} = \frac{m}{1 - \beta_1^t}, \quad \hat{v} = \frac{v}{1 - \beta_2^t} m^=1−β1tm,v^=1−β2tv
更新:
w = w − η ⋅ m ^ v ^ + ϵ w = w - \eta \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} w=w−η⋅v^ +ϵm^
| 优点 | 缺点 |
|---|---|
| 收敛快 | 内存大 |
| 对学习率不敏感 | 泛化有时不如 SGD |
| 通用 | - |
5.7 AdamW(Transformer 标配)
w = w − η ⋅ m ^ v ^ + ϵ − η ⋅ λ ⋅ w w = w - \eta \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} - \eta \cdot \lambda \cdot w w=w−η⋅v^ +ϵm^−η⋅λ⋅w
| 优点 |
|---|
| 权重衰减正确 |
| 泛化更好 |
| Transformer 标配 |
5.8 优化器对比表
| 优化器 | 动量 | 自适应 | 权重衰减 | 收敛速度 | 内存 |
|---|---|---|---|---|---|
| SGD | 无 | 无 | 手动 | 慢 | 小 |
| Momentum | 有 | 无 | 手动 | 中 | 小 |
| Adagrad | 无 | 有 | 手动 | 中 | 中 |
| RMSprop | 无 | 有 | 手动 | 中 | 中 |
| Adam | 有 | 有 | 不完善 | 快 | 大 |
| AdamW | 有 | 有 | 完善 | 快 | 大 |
5.9 优化器选型口诀
text
新手/通用 → Adam,lr=0.001
图像分类 → SGD+Momentum,lr=0.01
RNN/LSTM → RMSprop 或 Adam
Transformer → AdamW,lr=0.0001
追求泛化 → SGD+Momentum
追求速度 → Adam / AdamW
六、鞍点问题
6.1 什么是鞍点?
鞍点是梯度为 0,但不是局部最小值的点。
text
某些方向是上升
某些方向是下降
数学上:
∇ L = 0 \nabla L = 0 ∇L=0
但 Hessian 矩阵既有正特征值,也有负特征值。
6.2 为什么高维空间鞍点更多?
text
n 维空间中:
局部最小值:所有方向都上升 → 概率 ≈ 1/2^n
鞍点:部分上升部分下降 → 概率远大于局部最小值
所以高维空间里,鞍点比局部最小值常见得多。
6.3 解决鞍点的方法
| 方法 | 原理 |
|---|---|
| Momentum | 动量让参数在鞍点处继续前进 |
| Adam | 自适应学习率,梯度小的方向自动放大步长 |
| 噪声注入 | 在梯度上加随机噪声,帮助跳出鞍点 |
| 随机初始化 | 避免一开始就落在鞍点 |
| 二阶优化 | 用 Hessian 信息判断方向(牛顿法、LBFGS) |
| Skip Connection | 残差连接,让梯度可以直接跳过 |
| 学习率调度 | Warmup + 余弦退火,帮助跳出鞍点 |
6.4 鞍点 vs 局部最小值
| 项目 | 鞍点 | 局部最小值 |
|---|---|---|
| 梯度 | 0 | 0 |
| 方向 | 部分上升部分下降 | 全上升 |
| 高维空间 | 常见 | 稀少 |
| 解决 | 动量、噪声 | 随机重启 |
七、综合应用场景
| 场景 | 隐藏层激活 | 输出层激活 | 损失函数 | 优化器 | 学习率 |
|---|---|---|---|---|---|
| 图像分类 | ReLU | Softmax | CrossEntropy | SGD+M | 0.01 |
| 目标检测 | ReLU | Linear+Softmax | 多任务 | SGD+M | 0.01 |
| 语义分割 | ReLU | Softmax | CE+Dice | Adam | 0.001 |
| 自然语言 | GELU | Linear | CrossEntropy | AdamW | 0.0001 |
| 语音识别 | ReLU/GELU | Softmax | CTC | Adam | 0.001 |
| 时序预测 | ReLU/Tanh | Linear | MSE/Huber | Adam | 0.001 |
| 电机观测器 | ReLU | Tanh | MSE | Adam | 0.001 |
| 推荐系统 | ReLU | Sigmoid/Softmax | BCE/CE | Adam | 0.001 |
| 强化学习 | ReLU/Tanh | Linear/Softmax | TD/策略梯度 | Adam | 0.0003 |
| GAN | LeakyReLU | Tanh/Sigmoid | 对抗损失 | Adam | 0.0002 |
八、总结与选型口诀
8.1 核心公式
w = w − η ⋅ ∂ L ∂ w w = w - \eta \cdot \frac{\partial L}{\partial w} w=w−η⋅∂w∂L
8.2 选型总口诀
text
隐藏层激活:
默认 ReLU
死神经元 → LeakyReLU
RNN → Tanh
Transformer → GELU
MCU → ReLU
输出层激活:
多分类互斥 → Softmax
二分类/多标签 → Sigmoid
回归 → Linear
有界回归 → Tanh
损失函数:
回归 → MSE
多分类 → CrossEntropy
二分类/多标签 → BCE
不平衡 → Focal
优化器:
通用 → Adam,lr=0.001
图像 → SGD+Momentum,lr=0.01
Transformer → AdamW,lr=0.0001
RNN → RMSprop
鞍点:
动量 + 自适应学习率 + 噪声注入
8.3 一句话总结
激活函数引入非线性,损失函数衡量误差,优化器更新权重。
隐藏层选 ReLU,输出层按任务选 Softmax/Sigmoid/Linear。
回归用 MSE,分类用 CE/BCE,不平衡用 Focal。
新手用 Adam,图像用 SGD+M,Transformer 用 AdamW。
鞍点用动量、自适应学习率、噪声注入来解决。