主题
模型与训练
在 NLP 中,模型训练是实现文本理解与生成的核心环节。本章将介绍常用的模型架构、训练流程与技巧。
一、模型架构概览
类型 | 示例 | 说明 |
---|---|---|
编码器(Encoder-only) | BERT、RoBERTa | 主要用于文本理解任务,如分类、NER |
解码器(Decoder-only) | GPT、GPT-Neo | 主要用于文本生成任务,如对话、写作 |
编码器-解码器(Encoder-Decoder) | T5、BART | 同时支持理解与生成,如翻译、摘要 |
二、预训练与微调
1. 预训练(Pretraining)
- 使用大规模无标签语料训练语言模型
- 常用任务:
- Masked Language Model (MLM):BERT
- Causal Language Model (CLM):GPT
- Seq2Seq Pretraining:T5、BART
2. 微调(Fine-tuning)
- 在特定任务数据上进一步训练预训练模型
- 示例任务:
- 文本分类
- 命名实体识别(NER)
- 机器翻译
三、训练流程
- 数据准备
- 文本清洗、分词、构建词表或使用预训练分词器
- 特征转换
- 文本 → Token IDs → Attention Masks
- 模型初始化
- 从预训练模型加载参数,或从零训练
- 优化器与损失函数
- 常用优化器:AdamW
- 损失函数:交叉熵(分类)、CTC(语音/序列任务)
- 训练与评估
- 训练集迭代
- 验证集评估
- 早停 / 学习率调度
四、训练技巧
- 梯度累积(Gradient Accumulation):处理大 batch
- 混合精度训练(FP16):提升显存效率
- 学习率预热与衰减(Warmup & Decay)
- 数据增强:Back-translation、EDA(Easy Data Augmentation)
- 冻结部分层:减少过拟合,特别是在微调小数据集时
五、实践示例(Hugging Face)
python
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
# 加载数据集
dataset = load_dataset("imdb")
# 加载分词器与模型
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")
def tokenize(batch):
return tokenizer(batch['text'], padding=True, truncation=True)
dataset = dataset.map(tokenize, batched=True)
# 定义训练参数
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
evaluation_strategy="epoch",
save_strategy="epoch",
logging_dir="./logs"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
eval_dataset=dataset['test']
)
# 开始训练
trainer.train()
六、小结
- 现代 NLP 依赖预训练 + 微调策略
- Transformer 架构统一了理解与生成任务
- 训练技巧和优化方法直接影响模型性能与泛化能力