# 模型与训练

URL: https://caijiao.org/nlp/models
Source: docs/nlp/models.md
Description: 本章介绍 NLP 模型的训练流程，包括预训练、微调、常用架构及训练技巧。

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