PyTorch 基础2
Loss
nn.L1Loss
它的计算非常简单直观:
$$Loss = \text{mean}(|Y_{预测} - Y_{真实}|)$$
就是把每一次预测的误差取绝对值(去掉负号),然后求平均。
使用方法:
实例化(初始化对象) 在使用前,必须先创建一个 Loss 对象。
语法:
criterion = nn.L1Loss(reduction='mean')关键参数:
reduction'mean'(默认):算出所有误差后取平均值(最常用)。'sum':算出所有误差后求和。'none':不压缩,返回和输入形状一样的误差矩阵。
2. 前向计算(传入数据) 像调用函数一样调用它,传入你的预测值和真实值。
- 语法:
loss = criterion(input, target) - 参数要求:
input:模型输出的 Tensor。target:真实标签的 Tensor。- 核心限制:
input和target的形状(Shape)必须完全一致。
3. 后续操作 得到 loss 后,通常直接接:
loss.backward():计算梯度。
优化器
虽然 PyTorch 提供了十几种优化器,但你实际工作中 99% 的情况只需要关注这两个:
1. SGD (随机梯度下降)
全称:Stochastic Gradient Descent。
特点:最基础、最经典。
比喻:就像老老实实走路。不管地形怎么变,它总是按照固定的步长一步步往下走。
优点:稳,收敛后效果通常很好。
缺点:慢,容易卡在平坦的地方(鞍点)不动。
代码:
Python
1
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
2. Adam (自适应矩估计)
全称:Adaptive Moment Estimation。
特点:目前最流行、最省心的选择。
比喻:就像滚下来的铁球。它带有惯性(Momentum),如果是陡坡它会越滚越快,如果是平地它还能靠惯性冲过去。而且它会根据路况自动调整步子的大小。
优点:快,对学习率不那么敏感,很难陷入死循环。
缺点:有时候最终精度稍微比 SGD 差一点点(但通常可以忽略)。
代码:
Python
1
2# 这是新手的首选!
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
- 核心参数:学习率 (Learning Rate, lr)
这是你在定义优化器时最重要的参数。
- 含义:你下山时一步迈多远。
- 如果太大 (
lr=0.1):步子太大,容易扯着蛋。可能会直接跨过山谷,跑到对面的山上去了(Loss 震荡不下降)。 - 如果太小 (
lr=0.00001):像蚂蚁挪动。下山要走一万年(训练太慢)。 - 经验值:
- SGD 通常从
0.01开始试。 - Adam 通常从
0.001或0.0001开始试。
- SGD 通常从
**4. 这里的“标准三件套” **
在 PyTorch 的训练循环中,优化器的操作永远是这固定三步,顺序不能乱:
Python
1 | # 1. 梯度清零 (Reset) |