问题与目标
Transformer 只是网络结构,模型最终学到什么还取决于训练目标。GPT、BERT 和 T5 都使用 Transformer,却因为输入可见范围和预测目标不同,形成了不同能力和使用方式。
本篇把一条文本转换为三类预训练样本:因果语言建模、掩码语言建模和文本到文本。通过直接观察输入与标签,理解训练阶段为什么能够并行,以及生成阶段为什么仍要逐 Token 执行。

同一段语料可以构造不同监督信号。目标函数决定模型允许读取哪些上下文、预测哪些位置,也影响模型更擅长理解还是生成。
核心概念
因果语言建模
因果语言模型根据左侧 Token 预测下一个 Token:
输入:<bos> 巡检 系统 发现
标签:巡检 系统 发现 异常
训练时整段序列可以一次送入模型,通过 Causal Mask 保证每个位置看不到未来标签。推理时下一个 Token 尚不存在,只能生成一个、拼回输入,再生成下一个。
掩码语言建模
掩码语言模型遮盖部分位置,再根据左右上下文恢复原 Token:
输入:巡检 [MASK] 发现 异常
标签: 系统
它能同时利用双向上下文,适合理解和表示任务,但训练方式与从左到右自由生成并不一致。
文本到文本
Encoder-Decoder 模型把任务统一成输入文本到输出文本:
输入:摘要:节点网络超时,切换线路后恢复正常
输出:网络故障已恢复
编码器双向读取输入,解码器使用因果掩码逐步生成目标。翻译、摘要、问答和分类都可以改写成这种形式。
Loss 只计算哪些位置
Padding 位置通常不参与 Loss;掩码语言模型只在选中的遮盖位置计算主要损失;因果语言模型则对有效的下一个 Token 位置计算交叉熵。代码中常用特殊忽略值标记不计入 Loss 的标签,具体值要以框架和模型实现为准。
可运行实现
下面用标准库构造三种训练样本。为便于观察,Token 已经手工切分。
import random
TOKENS = ["巡检", "系统", "发现", "网络", "异常"]
def causal_example(tokens: list[str]):
sequence = ["<bos>", *tokens, "<eos>"]
return {
"input": sequence[:-1],
"labels": sequence[1:],
}
def masked_example(tokens: list[str], seed: int = 7, ratio: float = 0.4):
rng = random.Random(seed)
count = max(1, round(len(tokens) * ratio))
positions = sorted(rng.sample(range(len(tokens)), count))
inputs = tokens.copy()
labels = [None] * len(tokens)
for position in positions:
labels[position] = tokens[position]
inputs[position] = "<mask>"
return {"input": inputs, "labels": labels}
def text_to_text_example(source: str, target: str):
return {
"encoder_input": f"摘要:{source}",
"decoder_input": f"<bos>{target}",
"labels": f"{target}<eos>",
}
print("causal:", causal_example(TOKENS))
print("masked:", masked_example(TOKENS))
print(
"text-to-text:",
text_to_text_example(
"节点网络超时,切换线路后恢复正常",
"网络故障已恢复",
),
)
这个例子没有训练神经网络,但把最容易混淆的数据位移和标签范围显式化了。进入模型实现后,首先检查的也应是编码后的 input_ids、labels 和 Mask 是否符合这一关系。
常见问题与排查
因果模型的标签没有右移
有些模型类会在内部完成 Shift,有些自定义训练代码需要手工处理。不能重复右移,也不能完全不移。用一条短序列打印输入和标签,确认每个位置的预测目标。
Padding 参与了 Loss
如果补齐位置被当成真实标签,模型会花大量能力预测 <pad>。检查标签中的忽略标记以及损失函数的 ignore_index。
Mask 比例越高越好
遮盖太少,监督信号不足;遮盖太多,上下文被破坏。比例和替换策略属于训练配置,需要与模型设计和语料规模一起验证。
训练能够并行,推理也应一次完成
训练时完整答案已知,可通过 Mask 同时计算所有位置的 Loss;开放式生成时未来 Token 未知,因此必须迭代解码。两者的数据条件不同。
小结
网络结构决定信息怎样流动,训练目标决定模型学什么。因果预测偏向生成,掩码预测偏向双向理解,文本到文本统一了输入输出任务。理解训练样本的构造,比只记 GPT、BERT、T5 的名称更可靠。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


