深度学习核心函数对比
深度学习核心函数对比
损失函数(Loss Functions)
均方误差(Mean Squared Error, MSE)
其中:
- 是真实值
- 是预测值
- 是样本数量
优点:
- 连续可导,便于梯度计算
- 对大误差惩罚较大,有助于快速减小大误差
缺点:
- 对异常值敏感,异常值求了平方后主导损失,迫使模型努力拟合这些异常点,影响整体性能
- 在分类问题中效果不如交叉熵,因为梯度容易饱和
平均绝对误差(Mean Absolute Error, MAE)
优点:
- 对异常值更鲁棒
- 梯度恒定,训练稳定
缺点:
- 在零点不可导,可能影响优化
- 对所有误差给予同等重视,收敛速度可能较慢
交叉熵损失(Cross-Entropy Loss)
衡量模型预测的概率分布与真实标签分布之间的差异。
二分类交叉熵
其中:
- 是真实标签
- 是预测概率
- 当 时,交叉熵等于 -,鼓励 趋近于 1;当 时,交叉熵等于 -,鼓励 趋近于 0。
多分类交叉熵
其中:
- 是类别数量
- 是第 个样本在第 类的真实标签(0或1)
- 是第 个样本在第 类的预测概率
- 由于一个样本只会在一个分类中概率为 1,其他为0 ,所以交叉熵等于 -,鼓励分类正确的情况下 趋近于 1。
优点:
- 常用于分类任务
- 梯度与概率误差成正比,收敛快
- 有效处理概率输出,与 softmax 激活函数搭配良好
缺点:
- 对噪声标签敏感,可能过拟合
- 当预测概率接近 0 或 1 时,梯度容易消失
Hinge损失(Hinge Loss)
其中 是真实标签。
优点:
- 最大化分类间隔,适合最大间隔分类
- 对异常值鲁棒性较强
缺点:
- 在转折点不可导,需使用次梯度
- 不提供概率解释
KL 散度(Kullback-Leibler Divergence)
其中:
- 是真实分布
- 是预测分布
优点:
- 衡量两个概率分布之间的差异
- 常用于生成模型
缺点:
- 不对称,
- 当 且 时无定义
激活函数(Activation Functions)
Sigmoid
导数:
范围:
优点:
- 平滑可导
- 适合二分类输出层
缺点:
- 饱和区(接近 0 或 1,导数趋近于 0)导致梯度消失,反向传播梯度极小,使网络参数更新缓慢
- 输出非零中心,影响梯度更新效率
- 指数运算计算量大
Tanh(双曲正切)
导数:
范围:
优点:
- 输出零中心,利于优化
- 比 Sigmoid 梯度更强
缺点:
- 仍存在梯度饱和的问题
- 计算开销大
ReLU(Rectified Linear Unit)
导数:
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
评论