深入探索大模型预训练:BERT与GPT的核心机制
预训练(Pre-training)是大语言模型(如BERT、GPT)训练的第一阶段,其核心目标是通过自监督学习从海量无标注文本中学习通用的语言表示(Language Representation)。本文将从预训练目标、BERT的MLM与NSP任务、GPT的CLM任务,到新手学习路径,助你系统掌握预训练技术的核心要点。
一、预训练的核心目标与自监督学习
预训练阶段的目标是让模型掌握语言的语法、语义、常识等基础能力,为后续的微调(Fine-tuning)打下基础。这一过程依赖自监督学习——即利用无标注数据自动生成监督信号,例如遮盖部分词让模型预测,或预测下一个词。
- 为什么需要自监督学习? 人工标注数据成本高昂,而互联网上有海量无标注文本,自监督学习能充分利用这些数据训练出强大的语言表征。
- 核心产出: 训练好的模型参数(如权重)包含丰富的语言知识,可被迁移到下游任务。
小提示:自监督学习和大规模语料库是预训练成功的基石。常见的预训练语料包括BookCorpus、Wikipedia等。
二、BERT预训练:MLM与NSP
基于Transformer编码器的双向架构,BERT通过两个任务学习上下文语义:掩码语言模型(MLM)和下一句预测(NSP)。
1. 掩码语言模型(MLM)
在BERT的预训练中,模型通过Masked Language Modeling(MLM)任务学习双向上下文,即随机遮盖输入文本中15%的词,并基于被遮盖词左右两侧的上下文预测该词。
- 任务:随机遮盖输入文本中的15%的词,要求模型预测被遮盖的词。
- 示例:输入句子为“The cat sits on the [MASK]”,模型需要预测 “[MASK]” 为 “mat”。
小提示:MLM类似于“完形填空”,让模型从双向语境中推断缺失词,突破传统单向模型的局限。
2. 下一句预测(NSP)
BERT通过Next Sentence Prediction(NSP)任务,以50%概率输入连续句子和50%概率输入随机句子,训练模型学习句子间的逻辑关系,以提升问答、文本分类等任务的性能。
- 任务:判断两个句子是否是连续的(50%是连续的,50%是随机的)。
- 正例:“I like cats” + “They are cute.”
- 负例:“I like cats” + “The sky is blue.”
小提示:NSP帮助模型理解句子间的连贯性,但对一些任务(如情感分类)可能收益有限,后来RoBERTa等模型移除了NSP。
三、GPT预训练:因果语言建模(CLM)
GPT系列采用因果语言建模(Causal Language Modeling, CLM),通过单向自回归方式生成文本,擅长创作任务;而BERT的MLM类似双向“完形填空”,更擅长理解任务。
1. 因果语言建模(CLM)
在GPT的预训练中,模型使用因果语言建模(CLM)通过单向上下文(仅前文)预测下一个词,数学表达为 P(wt|w1,...,wt−1),像“逐字听写”或“打字机”一样,每次只能看到之前输入的内容,逐步生成后续文本。GPT系列模型(GPT-1/2/3/4)均基于CLM,通过Transformer的单向注意力掩码实现。
- 任务:基于前文预测下一个词,类似于人类逐字阅读文本的过程。
- 示例:输入“The cat sits on the”,模型需要预测下一个词是“mat”。
小提示:CLM是自回归(AR)模型,只能利用历史信息,不能回头修改或参考后文,因此文本生成流畅但理解能力受限。
四、新手学习建议
下图展示了BERT和GPT的学习路径(无图时仅保留文字)。建议按照“理论→代码”分阶段学习,每个模型投入7-10天。
BERT学习路径
阶段1:理论入门(2-3天)
- 目的:理解MLM和NSP的设计动机与核心逻辑。
- 论文阅读:重点阅读《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》的 Section 3(预训练任务设计)。
- 类比理解:MLM就像你在玩“填空游戏”,需要根据前后文猜出被遮盖的词(如“I like [MASK]” → “cats”);NSP就是判断两句话是否来自同一篇文章(如“I like cats” + “They are cute.”是连续的,而“I like cats” + “The sky is blue.”是随机的)。
阶段2:代码复现(5-7天)
- 目标:通过代码理解MLM和NSP的实现细节。
- 代码:无需从零实现,直接基于transformers库调用预训练模型微调。
from transformers import BertTokenizer, BertForMaskedLM, BertForNextSentencePrediction, Trainer, TrainingArguments
import torch
# 加载预训练模型和tokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model_mlm = BertForMaskedLM.from_pretrained("bert-base-uncased") # MLM专用
model_nsp = BertForNextSentencePrediction.from_pretrained("bert-base-uncased") # NSP专用(旧版BERT支持)
# 示例输入(MLM)
text = "The cat sits on the [MASK]."
inputs = tokenizer(text, return_tensors="pt")
outputs = model_mlm(**inputs)
predicted_token_id = torch.argmax(outputs.logits[0, -1]).item()
print(tokenizer.decode(predicted_token_id)) # 输出预测的词(如"mat")
# 示例输入(NSP)
sentence1 = "I like cats."
sentence2 = "They are cute."
sentence3 = "The sky is blue."
inputs_nsp = tokenizer(sentence1 + " [SEP] " + sentence2, return_tensors="pt") # 正例
inputs_nsp_neg = tokenizer(sentence1 + " [SEP] " + sentence3, return_tensors="pt") # 负例
model_nsp = BertForNextSentencePrediction.from_pretrained("bert-base-uncased") # 注意:新版本BERT已合并MLM+NSP
GPT学习路径
阶段1:理论入门(2-3天)
- 目的:理解CLM的核心概念、数学原理及其与GPT的关系。
- 论文阅读:重点阅读《Improving Language Understanding by Generative Pre-Training》(GPT-1原始论文)的 Section 2(模型架构与预训练任务)和《Language Models are Unsupervised Multitask Learners》(GPT-2论文),理解CLM在生成任务中的扩展应用。
- 类比理解:CLM就像你在写作文时,只能根据之前写的内容决定下一个词(如“The cat sits on the [?]”),无法回头修改或参考后文。
阶段2:代码复现(5-7天)
- 目标:通过代码理解CLM的实现细节,包括Transformer的单向注意力掩码。
- 代码:同样无需从零实现,直接基于transformers库调用预训练模型微调。
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# 加载预训练模型和tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
# 输入文本(CLM任务)
input_text = "The cat sits on the"
inputs = tokenizer(input_text, return_tensors="pt")
# 生成下一个词
outputs = model.generate(**inputs, max_length=20, num_return_sequences=1)
print(tokenizer.decode(outputs[0])) # 输出完整句子(如"The cat sits on the mat and sleeps.")
五、常见问题(FAQ)
-
Q: BERT和GPT的预训练任务有何本质区别?
A: BERT使用双向上下文(MLM+双向注意力),适合理解任务;GPT使用单向上下文(CLM+因果掩码),适合生成任务。前者类似完形填空,后者类似逐字写作文。
-
Q: 代码中“BertForNextSentencePrediction”在新版本中是否被移除?
A: 在Hugging Face的transformers库较新版本中,BERT模型已经将MLM和NSP合并为一个统一的模型(BertForPreTraining),但仍保留BertForNextSentencePrediction用于兼容旧版。建议使用BertForPreTraining或直接使用Albert、RoBERTa等改进模型。
-
Q: 学习预训练需要很强的数学基础吗?
A: 基础数学(概率、线性代数、微积分)是必要的,但入门阶段可以先理解概念,再逐步深入数学推导。建议先通过类比(如完形填空)建立直觉,再阅读论文中的公式。
-
Q: 除了BERT和GPT,还有哪些重要的预训练模型?
A: 常见的有RoBERTa(优化BERT)、ALBERT(参数共享)、DistilBERT(蒸馏)、XLNet(排列语言模型)、T5(文本到文本)、BART(去噪自编码)等。建议掌握BERT和GPT后再学习。
总结
预训练是大模型的基石,MLM和CLM分别代表了双向理解和自回归生成两种主流范式。通过理论学习和代码实践,你可以深入理解这些机制背后的设计哲学。记住:先理解动机,再动手编码,反复对比两者的异同——这是掌握预训练技术最有效的路径。
