模型与训练

在 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)
    • 机器翻译

三、训练流程

  1. 数据准备
    • 文本清洗、分词、构建词表或使用预训练分词器
  2. 特征转换
    • 文本 → Token IDs → Attention Masks
  3. 模型初始化
    • 从预训练模型加载参数,或从零训练
  4. 优化器与损失函数
    • 常用优化器:AdamW
    • 损失函数:交叉熵(分类)、CTC(语音/序列任务)
  5. 训练与评估
    • 训练集迭代
    • 验证集评估
    • 早停 / 学习率调度

四、训练技巧

  • 梯度累积(Gradient Accumulation):处理大 batch
  • 混合精度训练(FP16):提升显存效率
  • 学习率预热与衰减(Warmup & Decay)
  • 数据增强:Back-translation、EDA(Easy Data Augmentation)
  • 冻结部分层:减少过拟合,特别是在微调小数据集时

五、实践示例(Hugging Face)

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 架构统一了理解与生成任务
  • 训练技巧和优化方法直接影响模型性能与泛化能力