进阶科普:优化器与 Dropout的工作方式以及为什么有用
这就是人工智能最核心的东西,掌握了这个,我们就知道了AI究竟是怎样学习的那么好的,同时,为了防止模型学习不到东西或只学习到遇到的数据,学习不到数据集外的数据(过拟合),我们还需要一个有效的训练技巧——这座山脉就是我们的损失函数(Loss Function),你在山上的位置就是模型当前的参数(Weights & Biases),而山谷的最低点就是我们追求的最小损失值。它指的是模型在训练数据上表现得太
在前一章,我们学会了如何准备和打包我们的数据(Dataset & DataLoader)。现在,数据已经送到了模型的面前,但模型如何消化这些数据并从中学习呢?这就需要我们的优化器 (Optimizer)。这就是人工智能最核心的东西,掌握了这个,我们就知道了AI究竟是怎样学习的那么好的,同时,为了防止模型学习不到东西或只学习到遇到的数据,学习不到数据集外的数据(过拟合),我们还需要一个有效的训练技巧——Dropout。
第一章:模型学习的引擎 - 优化器 (Optimizer)
1.1 为什么需要优化器?
一个几乎所有深度学习教学都会用的比喻:
想象一下,你站在一座连绵不绝的山脉上,眼睛被蒙住,你的目标是走到山谷的最低点。这座山脉就是我们的损失函数(Loss Function),你在山上的位置就是模型当前的参数(Weights & Biases),而山谷的最低点就是我们追求的最小损失值。
因为你被蒙着眼,你无法看到全局的最低点在哪。你唯一能做的就是伸出脚,感受一下你脚下这片土地的坡度(梯度,Gradient)。梯度会告诉你哪个方向是上山最陡峭的方向。那么,要下山,你自然应该朝着相反的方向迈出一步。
这时,你会面临两个关键问题:
1.方向:我应该朝哪个方向走?(梯度指明了方向)
2.步长:我这一步应该迈多大?(这就是学习率,Learning Rate)
优化器的作用,就是根据计算出的梯度,来决定如何更新模型的参数,从而最高效地下山。
没有优化器,模型就只知道自己当前的表现差不差,好不好(计算出损失),但完全不知道该如何调整自己以求进步。
1.2 主流优化器:从 SGD 到 Adam
不同的下山策略,对应着不同的优化器。让我们看看最常见的几种:
1. SGD (Stochastic Gradient Descent)
策略:非常简单直接。每次只看脚下的坡度,然后朝着最陡峭的下坡方向迈出固定的一步。
数学公式:new_weight = old_weight - learning_rate * gradient
优点:简单,计算开销小。
缺点:容易陷入局部最优,如果走到了一个小的洼地(局部最小值),它可能就以为是谷底,停滞不前了。
更新不稳定:在“峡谷”地形(一个方向坡度很陡,另一个方向很平缓)中,它会在陡峭的“峡谷壁”之间来回震荡,导致下降缓慢。
2. SGD with Momentum - 带惯性的下山者
策略:为了解决 SGD 的震荡问题,这位下山者获得了一个“惯性”。他不仅考虑当前脚下的坡度,还会参考自己上一步前进的方向和速度。如果连续朝一个方向下山,他会越走越快。
比喻:就像一个从山上滚下来的球,它会积累动量,冲过小的颠簸和洼地。
优点:有效缓解了 SGD 的震荡问题,加速了收敛,并有一定几率冲出局部最优。
缺点:仍然需要手动设置学习率。
3. Adam (Adaptive Moment Estimation)
策略:这是目前最常用的优化器。他不仅加入了动量,还有一个“环境感知”能力。
环境感知 (自适应学习率):Adam 会为模型的每一个参数动态地调整学习率。如果在某个方向上,坡度一直很陡峭(梯度很大),他会觉得这个方向比较“危险”,于是会把这个方向的步子迈得小一点,走得更稳。如果在某个方向上,坡度一直很平缓(梯度很小),他会觉得这个方向很“安全”,于是会把步子迈得大一点,走得更快。
优点:结合了 Momentum 和自适应学习率的优点。收敛速度快,在大多数情况下表现都非常出色。对学习率的初始值不那么敏感,调参相对容易。
缺点:可能会在训练后期错过最优解。
在 PyTorch 中使用优化器非常简单:
import torch.optim as optim
# 假设 model 是你的网络实例
# 将模型的所有参数 model.parameters() 传递给优化器
# 设置学习率 lr,例如 0.001
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 在训练循环中:
# ...
loss.backward() # 计算梯度
optimizer.step() # 优化器根据梯度更新参数
optimizer.zero_grad() # 清空梯度,为下一次迭代做准备
第二章:防止模型过度学习 - Dropout
2.1 为什么 Dropout 有用? 过拟合与团队协作
过拟合 (Overfitting) 是机器学习中的一个核心问题。它指的是模型在训练数据上表现得太好,以至于它把训练数据中的噪声和偶然特征都“背”了下来,但在新的、未见过的数据(测试数据)上表现很差。
一个我们看网课时对与Dropout常用的比喻:
假如一个学生备考。
正常学习:学生理解了知识点,所以在练习题和最终考试中都能做得很好。
过拟合:这个学生没有去理解知识,而是把练习册上所有题目的答案都背了下来。结果,他在做练习册时能得满分,但一到考场,题目变了,他就完全不会了。
Dropout 就是防止这种“死记硬背”的有效方法。
另一个比喻:一个高效的团队
假设你是一个项目经理,管理一个由许多神经元(员工)组成的团队。
没有 Dropout:团队合作久了,可能会出现“职责固化”。比如,员工 A 特别擅长做 PPT,慢慢地所有做 PPT 的活都丢给了他。其他员工就不再学习这项技能。如果有一天员工 A 请假了,整个团队的 PPT 工作就瘫痪了。这就是“协同适应(Co-adaptation)”,网络中的神经元之间产生了过度的依赖。
使用 Dropout:为了打破这种依赖,你作为经理想出了一个办法:在每次开项目会(训练迭代)时,你都随机地让一部分员工(比如 20%)去“喝茶摸鱼”(暂时失活,即 Dropout)。
这样一来,剩下的员工为了完成任务,就必须“身兼数职”,每个人都必须学习更全面的技能,不能过度依赖任何一个同事。最终,整个团队的鲁棒性(Robustness)和泛化能力都大大提高了。
2.2 Dropout 是如何工作的?
1.在训练期间 (model.train() 模式下):
在每次前向传播时,Dropout 层会以指定的概率 p(例如 p=0.5)将该层的一部分神经元的输出随机地置为 0。这意味着这些神经元在本次计算中“不工作”了。由于每次被置为 0 的神经元都是随机的,这就迫使网络学习到更加冗余和鲁棒的特征。
2.在评估/测试期间 (model.eval() 模式下):
Dropout 不会起任何作用。所有的神经元都会被激活。为了补偿训练时一部分神经元被关闭的情况,PyTorch 会自动将所有神经元的输出乘以 (1-p)。这保证了训练和测试时网络输出的期望值是一致的。(你无需手动操作,调用 model.eval() 即可)。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)