Skip to content

大模型原理与实践

大语言模型是自回归语言模型:给定前文,预测下一个 token。

flowchart LR
A[预训练<br/>海量文本] --> B[SFT<br/>监督微调]
B --> C[RLHF/DPO<br/>人类对齐]
C --> D[部署使用]

在海量文本上学习语言规律。目标是最大化似然:

L=ilogP(wiw<i;θ)\mathcal{L} = \sum_{i} \log P(w_i | w_{<i}; \theta)
# 预训练的核心:Causal Language Modeling
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "The capital of France is"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs, labels=inputs["input_ids"])
# 损失:预测下一个 token 的交叉熵
print(f"Loss: {outputs.loss:.4f}")

用高质量的 prompt-answer 对来引导模型行为:

from transformers import TrainingArguments, Trainer
# 微调数据格式
training_data = [
{"prompt": "解释什么是 Transformer", "answer": "Transformer 是..."},
{"prompt": "写一个排序函数", "answer": "def sort(arr):\n ..."},
]
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-5,
)

让模型输出符合人类偏好。DPO(Direct Preference Optimization)是更简单的替代方案:

# DPO 的核心思想:直接优化偏好对
# 给定: prompt x, 偏好回答 y_w, 非偏好回答 y_l
# 优化目标: 增大 P(y_w|x) / P(y_l|x) 的比值
from trl import DPOTrainer
dpo_trainer = DPOTrainer(
model=model,
train_dataset=preference_dataset, # (prompt, chosen, rejected)
tokenizer=tokenizer,
args=training_args,
)
dpo_trainer.train()
from transformers import BitsAndBytesConfig
# 4-bit 量化加载
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-3B",
quantization_config=bnb_config,
)

Kaplan et al. (2020) 发现,模型性能与三个因素遵循幂律关系:

L(N,D,C)NαN+DαD+CαCL(N, D, C) \propto N^{-\alpha_N} + D^{-\alpha_D} + C^{-\alpha_C}

其中 NN 是参数量,DD 是数据量,CC 是计算量。三者都增加,性能才会持续提升。