Skip to content

预训练模型

预训练是指在大规模文本数据上训练模型,使其学习语言的统计规律和语义理解能力。

概述

预训练模型是大语言模型的基础,通过在海量文本数据上进行无监督学习,学习语言的通用表示。

训练过程

数据准备

收集大规模文本数据,包括:

  • 维基百科
  • 书籍
  • 网页
  • 新闻文章

模型初始化

构建 Transformer 架构模型,设置超参数:

  • 层数
  • 隐藏层大小
  • 注意力头数
  • 词汇表大小

预训练目标

自回归语言建模

python
from transformers import GPT2LMHeadModel, GPT2Tokenizer

model = GPT2LMHeadModel.from_pretrained("gpt2")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

# 输入文本
text = "Hello, my name is"
inputs = tokenizer(text, return_tensors="pt")

# 生成文本
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

掩码语言建模

python
from transformers import BertForMaskedLM, BertTokenizer

model = BertForMaskedLM.from_pretrained("bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# 输入文本(带掩码)
text = "The capital of France is [MASK]."
inputs = tokenizer(text, return_tensors="pt")

# 预测掩码位置
outputs = model(**inputs)
predictions = outputs.logits.argmax(dim=-1)
print(tokenizer.decode(predictions[0]))

常用预训练模型

GPT (Generative Pre-trained Transformer)

  • 由 OpenAI 开发
  • 采用自回归语言建模
  • 支持生成式任务

BERT (Bidirectional Encoder Representations from Transformers)

  • 由 Google 开发
  • 采用掩码语言建模
  • 支持理解类任务

LLaMA

  • 由 Meta 开源
  • 高效的预训练模型
  • 支持多种语言

Qwen

  • 由阿里云开发
  • 支持多语言
  • 开源可商用

预训练技巧

混合精度训练

python
from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()

for inputs, labels in dataloader:
    optimizer.zero_grad()
    
    with autocast():
        outputs = model(inputs)
        loss = loss_fn(outputs, labels)
    
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

梯度累积

python
accumulation_steps = 4

for i, (inputs, labels) in enumerate(dataloader):
    outputs = model(inputs)
    loss = loss_fn(outputs, labels) / accumulation_steps
    loss.backward()
    
    if (i + 1) % accumulation_steps == 0:
        optimizer.step()
        optimizer.zero_grad()

学习率调度

python
from torch.optim.lr_scheduler import CosineAnnealingLR

optimizer = AdamW(model.parameters(), lr=5e-5)
scheduler = CosineAnnealingLR(optimizer, T_max=1000)

for epoch in range(epochs):
    for inputs, labels in dataloader:
        # 训练步骤
        scheduler.step()