深度学习核心函数对比

损失函数(Loss Functions)

均方误差(Mean Squared Error, MSE)

MSE=1ni=1n(yiy^i)2MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

其中:

  • yiy_i 是真实值
  • y^i\hat{y}_i 是预测值
  • nn 是样本数量

优点

  • 连续可导,便于梯度计算
  • 对大误差惩罚较大,有助于快速减小大误差

缺点

  • 对异常值敏感,异常值求了平方后主导损失,迫使模型努力拟合这些异常点,影响整体性能
  • 在分类问题中效果不如交叉熵,因为梯度容易饱和

平均绝对误差(Mean Absolute Error, MAE)

MAE=1ni=1nyiy^iMAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

优点

  • 对异常值更鲁棒
  • 梯度恒定,训练稳定

缺点

  • 在零点不可导,可能影响优化
  • 对所有误差给予同等重视,收敛速度可能较慢

交叉熵损失(Cross-Entropy Loss)

衡量模型预测的概率分布与真实标签分布之间的差异。

二分类交叉熵

L=1ni=1n[yilog(y^i)+(1yi)log(1y^i)]L = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] 其中:

  • yi{0,1}y_i \in \{0, 1\} 是真实标签
  • y^i(0,1)\hat{y}_i \in (0, 1) 是预测概率
  • yi=1y_i = 1 时,交叉熵等于 -log(y^i)\log(\hat{y}_i),鼓励y^i\hat{y}_i 趋近于 1;当 yi=0y_i = 0 时,交叉熵等于 -log(1y^i)\log(1-\hat{y}_i),鼓励y^i\hat{y}_i 趋近于 0。

多分类交叉熵

L=1ni=1nj=1Cyi,jlog(y^i,j)L = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{C} y_{i,j} \log(\hat{y}_{i,j})

其中:

  • CC 是类别数量
  • yi,jy_{i,j} 是第 ii 个样本在第 jj 类的真实标签(0或1)
  • y^i,j\hat{y}_{i,j} 是第 ii 个样本在第 jj 类的预测概率
  • 由于一个样本只会在一个分类中概率为 1,其他为0 ,所以交叉熵等于 -log(y^i,j)\log(\hat{y}_{i,j}),鼓励分类正确的情况下y^i,j\hat{y}_{i,j} 趋近于 1。

优点

  • 常用于分类任务
  • 梯度与概率误差成正比,收敛快
  • 有效处理概率输出,与 softmax 激活函数搭配良好

缺点

  • 对噪声标签敏感,可能过拟合
  • 当预测概率接近 0 或 1 时,梯度容易消失

Hinge损失(Hinge Loss)

L=1ni=1nmax(0,1yiy^i)L = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)

其中 yi{1,+1}y_i \in \{-1, +1\} 是真实标签。

优点

  • 最大化分类间隔,适合最大间隔分类
  • 对异常值鲁棒性较强

缺点

  • 在转折点不可导,需使用次梯度
  • 不提供概率解释

KL 散度(Kullback-Leibler Divergence)

DKL(PQ)=iP(i)logP(i)Q(i)D_{KL}(P || Q) = \sum_{i} P(i) \log \frac{P(i)}{Q(i)}

其中:

  • P(i)P(i) 是真实分布
  • Q(i)Q(i) 是预测分布

优点

  • 衡量两个概率分布之间的差异
  • 常用于生成模型

缺点

  • 不对称,DKL(PQ)DKL(QP)D_{KL}(P || Q) \neq D_{KL}(Q || P)
  • Q(i)=0Q(i) = 0P(i)>0P(i) > 0 时无定义

激活函数(Activation Functions)

Sigmoid

σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}}

导数: σ(x)=σ(x)(1σ(x))\sigma'(x) = \sigma(x)(1 - \sigma(x))

范围(0,1)(0, 1)

优点

  • 平滑可导
  • 适合二分类输出层

缺点

  • 饱和区(接近 0 或 1,导数趋近于 0)导致梯度消失,反向传播梯度极小,使网络参数更新缓慢
  • 输出非零中心,影响梯度更新效率
  • 指数运算计算量大

Tanh(双曲正切)

tanh(x)=exexex+ex\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

导数: tanh(x)=1tanh2(x)\tanh'(x) = 1 - \tanh^2(x)

范围(1,1)(-1, 1)

优点

  • 输出零中心,利于优化
  • 比 Sigmoid 梯度更强

缺点

  • 仍存在梯度饱和的问题
  • 计算开销大

ReLU(Rectified Linear Unit)

ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)

导数:

1 & x > 0 \\ 0 & x \leq 0 \end{cases}$$ **优点**: - 计算简单,收敛快 - 正区间梯度恒定为 1,缓解梯度消失 - 稀疏激活,提高效率 **缺点**: - 负区间梯度为 0,导致神经元死亡(Dead ReLU 问题) - 输出非零中心 --- ### Leaky ReLU $$\text{LeakyReLU}(x) = \begin{cases} x & x > 0 \\ \alpha x & x \leq 0 \end{cases}$$ 其中 $\alpha$ 是小的正常数(通常为 0.01)。 **优点**: - 负区间有微小梯度,避免神经元死亡 **缺点**: - $\alpha$ 需要手动调节,效果不一定最优 --- ### ELU(Exponential Linear Unit) $$\text{ELU}(x) = \begin{cases} x & x > 0 \\ \alpha(e^x - 1) & x \leq 0 \end{cases}$$ 其中 $\alpha$ 是超参数(通常为 1)。 **优点**: - 负区间平滑,均值接近 0,加速收敛 - 对噪声鲁棒 **缺点**: - 计算复杂,指数运算耗时 --- ### Softmax $$\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{C} e^{x_j}}$$ 其中 $C$ 是类别数量。 **优点**: - 输出转换为概率分布,常用于多分类输出层 **缺点**: - 指数运算可能导致数值溢出 - 与交叉熵配合时,梯度形式简单但计算量较大 --- ### Swish $$\text{Swish}(x) = x \cdot \sigma(\beta x)$$ 其中 $\sigma$ 是 sigmoid 函数,$\beta$ 是可学习的参数($\beta=1$ 时称为 SiLU)。 **优点**: - 自门控机制 - 平滑非单调 - 在深层网络中表现优异 **缺点**: - 计算复杂度略高于 ReLU --- ## 权重优化函数(Optimizers) ### 随机梯度下降(Stochastic Gradient Descent, SGD) 参数更新规则: $$\theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t)$$ 其中: - $\theta$ 是模型参数 - $\eta$ 是学习率 - $\nabla L(\theta)$ 是损失函数对参数的梯度 **优点**: - 简单,易于实现 - 适用于大规模数据 **缺点**: - 收敛慢 - 可能陷入局部极小或鞍点 - 需要手动调整学习率 --- ### Momentum(动量法) $$v_{t+1} = \gamma v_t + \eta \cdot \nabla L(\theta_t)$$ $$\theta_{t+1} = \theta_t - v_{t+1}$$ 其中 $\gamma$ 是动量系数(通常取 0.9)。 **优点**: - 加速收敛,抑制震荡,在原有动量基础上增加了动量,更新的时候再一定程度上保留之前的更新方向,使得梯度方向更加准确 - 帮助跳出局部极小 **缺点**: - 引入超参数 $\gamma$,需调参 --- ### Nesterov 加速梯度(Nesterov Accelerated Gradient, NAG) $$v_{t+1} = \gamma v_t + \eta \cdot \nabla L(\theta_t - \gamma v_t)$$ $$\theta_{t+1} = \theta_t - v_{t+1}$$ **优点**: - 比 Momentum 更快的收敛速度和更好的稳定性 **缺点**: - 计算复杂 --- ### Adagrad $$\theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}} \cdot \nabla L(\theta_t)_i$$ 其中 $G_t = \sum_{\tau=1}^{t} (\nabla L(\theta_\tau))^2$ 是梯度的平方和。 **优点**: - 适合处理稀疏数据 - 无需手动调整学习率 - 自适应梯度算法,在训练中自动对 Learning rate 进行调整,对于频率较低参数采用较大更新,对于频率较高的参数采用较小更新 **缺点**: - 学习率单调递减,后期可能停止学习 --- ### RMSprop $$v_{t+1} = \beta v_t + (1 - \beta) (\nabla L(\theta_t))^2$$ $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_{t+1} + \epsilon}} \cdot \nabla L(\theta_t)$$ 其中 $\beta$ 是衰减率(通常取 0.9)。 **优点**: - 解决 Adagrad 学习率消失问题 - 适合非平稳目标 - 均方根传播,Adagrad 会累加之前所有的梯度平方,而 RMSporp 只是计算对应平均值,可以缓解 Adagrad 学习率下降较快的问题 **缺点**: - 仍依赖全局学习率 --- ### Adam(Adaptive Moment Estimation) $$m_{t+1} = \beta_1 m_t + (1 - \beta_1) \nabla L(\theta_t)$$ $$v_{t+1} = \beta_2 v_t + (1 - \beta_2) (\nabla L(\theta_t))^2$$ $$\hat{m}_{t+1} = \frac{m_{t+1}}{1 - \beta_1^{t+1}}$$ $$\hat{v}_{t+1} = \frac{v_{t+1}}{1 - \beta_2^{t+1}}$$ $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_{t+1}} + \epsilon} \cdot \hat{m}_{t+1}$$ 其中: - $m_t$ 是一阶动量(梯度均值) - $v_t$ 是二阶动量(梯度方差) - $\beta_1$ 通常取 0.9,$\beta_2$ 通常取 0.999 **优点**: - 结合 Momentum 和 RMSprop - 自适应学习率,计算高效 - 通常表现良好,鲁棒性强 **缺点**: - 可能在某些情况下不收敛 - 需要较多内存存储动量 --- ### AdamW 与 Adam 相同的动量更新,但参数更新时解耦权重衰减: $$\theta_{t+1} = \theta_t - \eta (\frac{\hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}} + \epsilon} + \lambda \theta_t)$$ 其中 $\lambda$ 是权重衰减系数。 **优点**: - Adam + 解耦权重衰减(L2正则化修正) - 正确实现权重衰减,提升泛化能力 - 在 Transformer 等模型中表现优越 **缺点**: - 引入了额外超参数 --- ## 总结 > 选择合适的损失函数、激活函数和优化器需结合具体任务(回归/分类)、数据特性(噪声/稀疏性)以及网络结构(深度/宽度)。实践中,通常推荐: - **损失函数**: - 回归用 MSE 或 MAE - 分类用交叉熵 - **激活函数**: - 隐藏层多用 ReLU 及其变体(如 Leaky ReLU, ELU) - 输出层用 Sigmoid(二分类)或 Softmax(多分类) - **优化器**: - Adam 是通用首选 - SGD + Momentum 在小数据集或需精细调参时也可用 --- ## 选择建议 ### 按任务类型选择 **回归任务**: - 首选 **MSE**,对大误差敏感,适合大多数回归场景 - 若数据中存在较多异常值,则用 **MAE** 或 **Huber Loss** - Huber Loss 结合了 MSE 和 MAE 的优点,对小误差使用平方,对大误差使用绝对值 **分类任务**: - 输出层用 **Softmax + 交叉熵**(多分类) - 输出层用 **Sigmoid + 二分类交叉熵**(二分类) - 隐藏层用 **ReLU** 及其变体(Leaky ReLU、ELU、GELU 等) **生成模型/分布匹配**: - 使用 **KL 散度** 或 **交叉熵** - 在 VAE、GAN 等生成模型中常用 ### 按数据特性选择 **数据有噪声或异常值**: - 损失函数:MAE、Huber Loss - 优化器:Momentum、NAG(对异常梯度更鲁棒) **稀疏数据**: - 损失函数:交叉熵(处理稀疏标签效果好) - 优化器:Adagrad(适合稀疏梯度) **大规模数据**: - 激活函数:ReLU、Swish(计算高效) - 优化器:Adam、AdamW、SGD ### 按优化器特性选择 | 优化器 | 适用场景 | 特点 | |--------|----------|------| | **Adam** | 通用起点 | 自适应学习率,鲁棒性强,大多数情况下的首选 | | **SGD + Momentum** | 小数据集、需精细调参 | 收敛稳定,泛化能力好,适合需要最终精度的场景 | | **AdamW** | NLP 任务、Transformer | 解耦权重衰减,在大型语言模型中表现优越 | | **RMSprop** | 非平稳目标、RNN | 适合递归神经网络等序列建模任务 | | **NAG** | 需要快速收敛 | 比 Momentum 收敛更快,但计算稍复杂 | ### 快速选择指南 **快速开始**: - 不知道怎么选?用 **Adam + ReLU + 交叉熵** **追求最佳性能**: 1. 先用 Adam 快速收敛 2. 最后切换到 SGD + Momentum 微调 3. 根据验证集表现调整学习率 **常见组合**: - 图像分类:SGD + Momentum + ReLU + 交叉熵 - 自然语言处理:AdamW + GeLU/ReLU + 交叉熵 - 目标检测:Adam + ReLU + 多任务损失 - 生成对抗网络:Adam + tanh/ReLU + 对抗损失 ### 超参数建议 **学习率($\eta$)**: - Adam/AdamW:$10^{-3}$ 到 $10^{-4}$ - SGD:$10^{-1}$ 到 $10^{-3}$ - 通常从 $10^{-3}$ 开始,根据训练效果调整 **动量系数($\gamma$)**: - 通常设置为 0.9 - 数据噪声大时可设为 0.99 **权重衰减($\lambda$)**: - 通常设置为 $10^{-4}$ 或 $10^{-5}$ - 防止过拟合,提升泛化能力 --- ## 参考资源 - [Deep Learning (Ian Goodfellow et al.)](http://www.deeplearningbook.org/) - [CS231n: Convolutional Neural Networks for Visual Recognition](http://cs231n.stanford.edu/) - [PyTorch 优化器文档](https://pytorch.org/docs/stable/optim.html)

深度学习核心函数对比

https://github.com/px6707/myblog
作者

panxiao

发布日期

2026 - 03 - 01

许可证

Unlicensed

评论