训练

下一词元损失

交叉熵 · 每个权重学习所依据的信号

图中数值
真实 GPT-2 最后一步为玩具规模
示例
每句 5 个
平均损失
4.26

全部步骤

  1. 输入与目标

    训练读的是真实文本。每个位置预测它后面的那个词元,所以一句话就是同时打分的五个样本;因果掩码让每个位置看不到自己的答案。

    inputs = tokens[:-1] · targets = tokens[1:]

  2. 正确词元的概率

    对每个样本,GPT-2 small 给正确的下一个词元多少概率?只凭 “The” 它知道得很少,到了 “on the” 就多得多。

    p(target | context)

  3. 交叉熵损失

    一个样本的损失是 −log p:对确定无疑的正确答案为 0,对出乎意料的答案则很大。训练把数十亿词元上的平均值降到最低,这就是交叉熵。

    loss = −(1/N) Σ log p(target)

  4. logits 上的梯度

    损失对 logits 的梯度很简单:概率减去目标的独热向量。它的意思是:提高正确的词元,其余词元按各自占去的概率相应降低。

    ∂L/∂z = p − y

  5. 下坡一步

    逆着梯度走一步,会提高正确词元的概率、降低损失。这里作为玩具直接更新 logits;真实训练则通过权重间接改变它们,一次一个批次。

    z ← z − η (p − y)

代码

x, y = idx[:, :-1], idx[:, 1:]             # inputs and targets, shifted by one
logits = model(x)                           # (B, T, 50257): every position at once
probs = F.softmax(logits, dim=-1)
loss = F.cross_entropy(logits.view(-1, logits.size(-1)), y.view(-1))   # mean of −log p
loss.backward()                             # dloss/dlogits = (probs − onehot(y)) / N, then back through every layer
optimizer.step(); optimizer.zero_grad()     # nudge all 124M weights

延伸阅读