一、核心概念与任务定义
-
标签与语料一致:在自回归语言模型中,标签数据直接来自训练语料本身,无需人工标注,因为语言模型的任务是预测下一个词,而“正确答案”就是语料中的下一个词。
-
自动偏移1个token:
-
输入(input_ids):原始语料去掉最后一个token(因为最后一个词没有“下一个词”可供预测)。
-
标签(labels):原始语料去掉第一个token(因为第一个词没有“前文”可供模型学习)。
-
-
框架自动处理:现代深度学习库(如HuggingFace的
transformers
)在底层自动完成偏移,开发者只需传入原始数据,无需手动调整。
二、为什么标签和训练语料一致?
-
自回归任务本质:语言模型的目标是计算序列概率 P(w1,w2,...,wT)P(w_1, w_2, ..., w_T)P(w1,w2,...,wT),并分解为逐词预测:
P(w1,w2,...,wT)=∏t=1TP(wt∣w1,...,wt−1)P(w_1,w_2,...,w_T)=∏_{t=1}^TP(w_t|w_1,...,w_{t−1})P(w1,w2,...,wT)=∏t=1TP(wt∣w1,...,wt−1)-
输入:前t−1t-1t−1个词(w1,...,wt−1w_1, ..., w_{t-1}w1,...,wt−1)
-
预测目标:第ttt个词(wtw_twt)
-
标签:就是原始语料中的wtw_twt
-
✅ 生活例子:
就像教孩子接龙讲故事:
你给出开头:“从前有一只猫,它喜欢__”
孩子预测:“吃”
正确答案就是故事原本的下一个词:“吃”
三、训练数据的处理逻辑
1. 输入和标签自动偏移
假设原始语料是 ["我", "爱", "编", "程"]
,框架内部处理为:
-
输入(input_ids):
["我", "爱", "编"]
(去掉最后一个词“程”,因为没有下一个词可预测) -
标签(labels):
["爱", "编", "程"]
(去掉第一个词“我”,因为没有前文可参考)
必要性
-
最后一个token无后续预测目标
-
第一个token无历史上下文
✅ 生活例子:
类似填空训练:
题目:“天空是__”(输入)
答案:“蓝色”(标签)
但模型不会用“蓝色”去预测“蓝色”,而是用“天空是”预测“蓝色”。
2. 并行计算实现方式
Transformer通过以下技术实现物理并行与逻辑自回归的统一:
- 因果注意力掩码:
[[0, -inf, -inf], # w₁只能看自己
[0, 0, -inf], # w₂能看到w₁,w₂
[0, 0, 0]] # w₃能看到全部(但训练时会丢弃此位置)
-
矩阵运算优化:
-
单次前向传播计算所有位置的预测
-
通过张量切片(
logits[:, :-1]
)丢弃无效位置
-
四、训练与推理的关键区别
特性 | 训练阶段 (Teacher Forcing) | 推理阶段 (Autoregressive) |
---|---|---|
上下文来源 | 100%来自训练数据 | 使用模型自身生成的token |
错误传播 | 完全阻断(梯度基于真实标签) | 逐步累积 |
计算方式 | 并行计算所有有效位置 | 串行逐token生成 |
硬件利用率 | 高(批量矩阵运算) | 低(无法完全并行) |
典型API | model(input_ids, labels=labels) | model.generate(input_ids) |
五、底层实现细节验证
1. 训练时的数据流(以GPT-2为例)
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model = GPT2LMHeadModel.from_pretrained("gpt2")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
text = "我爱编程"
inputs = tokenizer(text, return_tensors="pt")
# 输入:["我", "爱", "编"](自动去掉最后一个词)
# 标签:["爱", "编", "程"](自动去掉第一个词)
outputs = model(**inputs, labels=inputs["input_ids"]) # 内部自动偏移
loss = outputs.loss # 计算交叉熵损失
2. 为什么不能使用预测结果作为训练上下文?
-
数学上:会导致损失函数优化目标含噪声(Noisy Target)
-
工程上:破坏批量计算的确定性
-
实验结论:Teacher Forcing训练速度更快,模型质量更高
4. 为什么不能偏移多个token?
-
自回归模型的核心:只能根据历史预测下一个词,不能“跳步”预测。
-
错误做法:用“我”直接预测“编”(跳过“爱”),会导致模型无法学习词序依赖。
✅ 生活例子:
就像学钢琴:
正确:先练音阶,再练和弦,最后弹曲子(逐步学习)。
错误:直接跳过基础练复杂曲目(模型会学乱)。
六、与其他架构的对比
特性 | Transformer (GPT) | RNN/LSTM | 掩码语言模型 (BERT) |
---|---|---|---|
偏移方式 | 自动1-token偏移(并行) | 显式逐步偏移(串行) | 随机掩码token |
标签来源 | 下一个token | 下一个token | 被掩码的原始token |
注意力机制 | 因果掩码 | 无(依赖循环) | 全双向注意力 |
七、生活化类比
1. 训练阶段:跟老师学造句
-
老师:给出句子开头"天空是__"
-
学生:必须基于老师提供的上下文预测"蓝色"
-
惩罚机制:如果预测错误,老师直接纠正(不让学生用错误答案继续)
2. 推理阶段:独立考试
-
考试题:开头"天空是__"
-
学生:先猜"蓝",再用"天空是蓝"猜下一个词"色"
-
风险:如果第一步猜错(如"天空是绿"),后续必然错误
八、常见问题解答
Q1:如果语料长度=1怎么办?
-
直接丢弃(无有效预测任务)
-
或填充至最小长度(如GPT-2的最小长度=2)
Q2:批处理时如何保持偏移一致性?
- 对batch内每个样本独立处理:
# batch_size=2示例
input_batch = [[w₁,w₂,w₃], [v₁,v₂,v₃]] # 原始batch
input_ids = [[w₁,w₂], [v₁,v₂]] # 各样本去尾
labels = [[w₂,w₃], [v₂,v₃]] # 各样本去头
Q3:为什么GPT不模仿RNN的逐步训练?
-
硬件优势:Transformer的并行计算效率比RNN高10-100倍
-
性能优势:长距离依赖建模能力更强
九、总结
图示总结
训练数据: [w₁, w₂, w₃, w₄]
│ │ │ │
▼ ▼ ▼ ▼
输入: [w₁, w₂, w₃] ← 去尾
│ │ │
▼ ▼ ▼
预测: P(w₂|w₁), P(w₃|w₁,w₂), P(w₄|w₁,w₂,w₃)
│ │ │
▼ ▼ ▼
标签: [w₂, w₃, w₄] ← 去头
图表总结
关键点 | 说明 |
---|---|
标签=语料 | 因为语言模型的任务是预测下一个词,答案就在数据中 |
自动偏移1个token | 输入去尾,标签去头,框架自动完成 |
物理意义 | 模拟人类逐词阅读/写作的过程 |
错误用法警示 | 手动偏移会导致模型学乱词序依赖 |
这种设计确保了自回归模型的高效训练,同时符合语言生成的本质规律。