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。
    • 核心限制inputtarget形状(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)
  1. 核心参数:学习率 (Learning Rate, lr)

这是你在定义优化器时最重要的参数

  • 含义:你下山时一步迈多远。
  • 如果太大 (lr=0.1):步子太大,容易扯着蛋。可能会直接跨过山谷,跑到对面的山上去了(Loss 震荡不下降)。
  • 如果太小 (lr=0.00001):像蚂蚁挪动。下山要走一万年(训练太慢)。
  • 经验值
    • SGD 通常从 0.01 开始试。
    • Adam 通常从 0.0010.0001 开始试。

**4. 这里的“标准三件套” **

在 PyTorch 的训练循环中,优化器的操作永远是这固定三步,顺序不能乱:

Python

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 梯度清零 (Reset)
# 为什么要清零?因为 PyTorch 默认会把梯度累加。
# 如果不清零,你这一步不仅走了现在的坡度,还叠加了上一步的坡度,结果就乱套了。
optimizer.zero_grad()

# 2. 反向传播 (Calculate)
# 计算 Loss 对每个参数的导数(梯度)。
loss.backward()

# 3. 更新参数 (Update)
# 根据刚才算的梯度,迈出一步。
optimizer.step()