预训练(Pre-training)
基本定义
预训练(Pre-training)是指在大规模无标注数据上,通过自监督学习(Self-supervised Learning)训练模型学习通用特征表示的过程。其核心目标是让模型捕获语言、图像或其他模态数据的潜在规律(如语法、语义、上下文关系),从而为下游任务(如分类、生成)提供高质量的特征基础。预训练模型(如BERT、GPT)通过迁移学习(Transfer Learning)适配具体任务,显著减少对标注数据的依赖。
与微调的区别:
- 预训练:面向通用表示,使用无监督任务(如掩码语言建模)。
- 微调:在预训练模型基础上,针对特定任务(如情感分析)用有标签数据进行参数调整。
技术细节
模型架构:
- Transformer:主流架构,依赖自注意力(Self-Attention)捕捉长程依赖,支持并行计算。
- 变体:
- 编码器(如BERT):双向上下文建模,适用于理解任务。
- 解码器(如GPT):单向自回归生成,适用于文本生成。
- 编码器-解码器(如T5):支持序列到序列任务(翻译、摘要)。
预训练任务:
- 掩码语言建模(MLM):随机掩盖输入词,模型预测被掩盖词(BERT)。
- 因果语言建模(CLM):预测下一个词,仅依赖上文信息(GPT)。
- 替换词检测(RTD):区分原始词与替换词(ELECTRA)。
- 跨度预测:预测被掩盖的连续词片段(SpanBERT)。
训练流程:
-
数据预处理:
- 文本分词(Tokenization):使用WordPiece、BPE或SentencePiece。
- 动态掩码(Dynamic Masking):每次训练时随机生成掩码(RoBERTa优化)。
-
优化策略:
- 学习率:初始值较高(如1e-4),配合学习率预热(Warmup)。
- 批量大小:通常极大(如百万级token/批次),依赖分布式训练。
-
硬件加速:
- 混合精度训练(FP16/FP8)加速计算。
- 模型并行(Model Parallelism)与流水线并行(Pipeline Parallelism)降低显存压力。
技术来源
-
早期起源:
- Word2Vec(2013):通过CBOW/Skip-gram学习词向量,首次展示无监督表示的迁移能力。
- ELMo(2018):基于双向LSTM的上下文词表示,引入分层特征提取。
-
Transformer时代:
- Transformer(2017):Vaswani等人提出,取代RNN/CNN,成为预训练基础架构。
- BERT(2018, Google):基于MLM的双向预训练,推动NLP任务性能飞跃。
- GPT系列(2018-2023, OpenAI):自回归模型,通过模型规模扩展(Scaling Laws)突破生成能力。
代码示例(使用Hugging Face训练BERT的MLM任务)
from transformers import BertTokenizer, BertForMaskedLM, TrainingArguments, Trainer
from datasets import load_dataset
import torch
# 加载模型和分词器
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForMaskedLM.from_pretrained(model_name)
# 加载数据集(示例:Wikipedia文本)
dataset = load_dataset("wikipedia", "20220301.en", split="train[:1%]")
# 数据预处理(动态掩码由模型内部处理)
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
max_length=128,
padding="max_length",
return_special_tokens_mask=True # 避免掩码特殊标记
)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
# 训练配置
training_args = TrainingArguments(
output_dir="./bert_pretrain",
overwrite_output_dir=True,
num_train_epochs=3,
per_device_train_batch_size=32,
save_steps=10_000,
save_total_limit=2,
learning_rate=5e-5,
warmup_steps=10_000,
logging_dir="./logs",
fp16=True, # 启用混合精度
gradient_accumulation_steps=2, # 小显存时增大有效批次
)
# 创建Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
# 开始预训练
trainer.train()
重点文献
-
BERT(2018)
- 标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- 作者:Devlin等人(Google)
- 贡献:提出MLM和NSP任务,确立双向预训练范式。
-
GPT-3(2020)
- 标题:Language Models are Few-Shot Learners
- 作者:Brown等人(OpenAI)
- 贡献:验证模型规模(Scaling Laws)对少样本学习的提升。
-
Transformer(2017)
- 标题:Attention Is All You Need
- 作者:Vaswani等人(Google)
- 贡献:提出Transformer架构,取代RNN/CNN。
-
RoBERTa(2019)
- 标题:RoBERTa: A Robustly Optimized BERT Pretraining Approach
- 作者:Liu等人(Facebook)
- 贡献:优化BERT训练策略(动态掩码、更大批次)。
-
T5(2020)
- 标题:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
- 作者:Raffel等人(Google)
- 贡献:统一任务格式(Text-to-Text),系统对比预训练方案。
重点技术
- 自注意力机制(Self-Attention):动态计算词间权重,捕捉长距离依赖,支持并行计算。
- 动态掩码(Dynamic Masking):每次训练迭代生成随机掩码,提升模型鲁棒性(RoBERTa)。
- 模型缩放(Scaling Laws):模型性能随参数规模、数据量和计算量呈幂律增长(GPT-3)。
- 稀疏专家混合(MoE):如Switch Transformer,动态激活部分参数,提升模型容量且控制计算成本。
- 分布式训练优化:
- ZeRO(Zero Redundancy Optimizer):DeepSpeed库实现显存优化,支持千亿参数训练。
- 3D并行:数据并行+模型并行+流水线并行(如Megatron-LM)。
总结
预训练通过自监督任务从海量数据中学习通用表示,成为现代AI的核心技术。其成功依赖于Transformer架构、高效训练策略(如动态掩码、混合精度)和硬件加速。未来方向包括多模态预训练(如CLIP)、绿色AI(降低能耗)和更安全的对齐技术(如RLHF)。