训练
- 图中数值
- 真实 GPT-2 最后一步为玩具规模
- 示例
- 每句 5 个
- 平均损失
- 4.26
全部步骤
输入与目标
训练读的是真实文本。每个位置预测它后面的那个词元,所以一句话就是同时打分的五个样本;因果掩码让每个位置看不到自己的答案。
inputs = tokens[:-1] · targets = tokens[1:]正确词元的概率
对每个样本,GPT-2 small 给正确的下一个词元多少概率?只凭 “The” 它知道得很少,到了 “on the” 就多得多。
p(target | context)交叉熵损失
一个样本的损失是 −log p:对确定无疑的正确答案为 0,对出乎意料的答案则很大。训练把数十亿词元上的平均值降到最低,这就是交叉熵。
loss = −(1/N) Σ log p(target)logits 上的梯度
损失对 logits 的梯度很简单:概率减去目标的独热向量。它的意思是:提高正确的词元,其余词元按各自占去的概率相应降低。
∂L/∂z = p − y下坡一步
逆着梯度走一步,会提高正确词元的概率、降低损失。这里作为玩具直接更新 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