第十一章:大语言模型(LLM)详解
学习目标
- 理解LLM的预训练任务和训练流程
- 掌握分词算法(BPE)的基本原理
- 理解推理采样策略(Greedy、Beam Search、Temperature、Top-k、Top-p)
- 了解模型压缩技术(量化、蒸馏、剪枝)
- 能够使用transformers库进行文本生成
前置要求
第十章:Transformer架构(理解Self-Attention、位置编码和Decoder结构)。
LLM的工作原理
大语言模型(Large Language Model,LLM)是基于Transformer Decoder架构的大规模预训练模型,通过预测下一个词来生成文本。
LLM工作的5个步骤
1. 接收输入:用户输入文本(如"人工智能的未来是")
2. 分词处理:将文本切分为Token序列
3. 嵌入编码:将Token转换为向量表示,加上位置编码
4. Transformer处理:通过多层Self-Attention和前馈网络处理
5. 预测输出:根据最后一个Token的表示,预测下一个Token的概率分布
预训练任务详解
LLM的预训练通常基于以下两种任务之一:
1. Next Token Prediction(下一个词预测)
这是GPT系列使用的预训练任务。模型看到前面的词,预测下一个词。
示例
输入:"人工智能正在"
目标:预测下一个Token
可能输出:"改变"(概率30%)、"发展"(概率25%)、"进步"(概率15%)...
模型通过在海量文本上反复做这个任务,学会了语言的规律、知识和推理能力。
2. 掩码语言模型(Masked Language Model)
这是BERT使用的预训练任务。随机遮盖输入中的一些词,让模型预测被遮盖的词。
示例
原文:"人工智能正在改变世界"
掩码后:"[MASK]正在[MASK]世界"
目标:预测[MASK]位置的词("人工智能"和"改变")
分词算法
分词(Tokenization)是将文本切分为模型可处理的Token序列的过程。
BPE(Byte Pair Encoding)原理
BPE是最常用的分词算法,核心思想是:从字符开始,反复合并最高频的字符对,逐步构建词表。
BPE简单示例
假设语料中出现很多次 "low"、"lower"、"newest":
初始(字符级别):
l o w l o w e r n e w e s t
第1步:e 和 w 最常相邻 → 合并为 ew
l o w l o w e r n ew e s t
第2步:n 和 ew 最常相邻 → 合并为 new
l o w l o w e r new e s t
第3步:lo 和 w 最常相邻 → 合并为 low
low low e r new e s t
最终词表包含:l, o, w, e, r, n, ew, new, lo, low, lowe, lower, ...
推理采样策略
LLM在生成文本时,需要从概率分布中选择下一个Token。不同的采样策略影响输出的多样性和质量。
| 策略 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Greedy(贪心) | 每步选概率最高的Token | 确定性强,速度快 | 容易重复,缺乏多样性 | 翻译、摘要等确定性任务 |
| Beam Search | 同时保留多个候选序列 | 全局最优,质量高 | 计算量大,输出保守 | 机器翻译 |
| Temperature | 调整概率分布的"尖锐度" | 控制输出的随机性 | 需要调参 | 通用(低=事实,高=创意) |
| Top-k | 只从概率最高的k个Token中采样 | 过滤低质量选项 | k值固定,不够灵活 | 对话、故事生成 |
| Top-p(核采样) | 从概率累积达到p的最小Token集合中采样 | 动态调整候选集大小 | 实现稍复杂 | 通用,最推荐 |
采样参数选择建议
• 编程/数学:temperature=0.1~0.2,top_p=0.9(确定性优先)
• 一般对话:temperature=0.5~0.7,top_p=0.9(平衡)
• 创意写作:temperature=0.8~1.0,top_p=0.95(多样性优先)
• 事实问答:temperature=0,使用Greedy(最准确)
使用transformers库生成文本
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型和分词器
model_name = "gpt2" # 可替换为 "meta-llama/Llama-2-7b-hf" 等
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 编码输入文本
prompt = "人工智能的未来发展方向包括"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
# 生成文本(使用不同的采样策略)
# 方式1:贪心搜索(确定性输出)
output_greedy = model.generate(input_ids, max_new_tokens=50, do_sample=False)
print("Greedy:", tokenizer.decode(output_greedy[0], skip_special_tokens=True))
# 方式2:带温度的采样(创造性输出)
output_temp = model.generate(
input_ids,
max_new_tokens=50,
do_sample=True,
temperature=0.8,
top_p=0.9
)
print("Temperature:", tokenizer.decode(output_temp[0], skip_special_tokens=True))
# 方式3:Top-k采样
output_topp = model.generate(
input_ids,
max_new_tokens=50,
do_sample=True,
top_k=50,
top_p=0.95
)
print("Top-k+p:", tokenizer.decode(output_topp[0], skip_special_tokens=True))
模型压缩技术
为了在资源有限的设备上运行大模型,需要使用模型压缩技术:
| 技术 | 原理 | 效果 | 代价 |
|---|---|---|---|
| 量化(Quantization) | 降低参数精度(FP16→INT8→INT4) | 显存减少50%-75% | 精度略有下降 |
| 知识蒸馏(Distillation) | 用大模型教小模型 | 小模型获得接近大模型的效果 | 需要训练过程 |
| 剪枝(Pruning) | 删除不重要的参数或层 | 减少模型大小和计算量 | 可能影响性能 |
| LoRA(低秩适配) | 只训练少量额外参数 | 微调成本大幅降低 | 推理时需要合并参数 |
实用建议
本地运行大模型:
• 7B模型 + INT4量化 ≈ 4GB显存(RTX 3060可运行)
• 13B模型 + INT4量化 ≈ 8GB显存(RTX 4070可运行)
• 推荐工具:llama.cpp、Ollama、vLLM
• 量化方法:GPTQ、AWQ、GGUF
本章小结
- LLM基于Transformer Decoder架构,通过Next Token Prediction预训练任务在海量文本上学习语言规律和知识。
- BPE分词算法从字符级别开始,通过反复合并高频字符对构建词表,平衡了词表大小和语义完整性。
- 推理采样策略决定了生成文本的多样性和质量:Greedy确定性最强,Temperature和Top-p提供灵活的随机性控制。
- 模型压缩技术(量化、蒸馏、剪枝、LoRA)使大模型能在资源有限的设备上运行,是AI落地应用的关键。
- Hugging Face的transformers库提供了便捷的API来加载预训练模型、进行文本生成和模型微调。
练习题
-
GPT系列模型使用的预训练任务是什么?
A. 掩码语言模型(MLM)
B. Next Token Prediction(下一个词预测)
C. 图像分类
D. 聚类分析答案:B。GPT系列使用Next Token Prediction作为预训练任务,即根据前面的词预测下一个词。
-
如果需要生成创意性强的文本,应该怎样设置采样参数?
A. temperature=0.1, do_sample=False
B. temperature=0.9, top_p=0.95, do_sample=True
C. temperature=0, top_k=1
D. 不使用任何采样策略答案:B。较高的temperature(0.8-1.0)和较高的top_p(0.95)会增加输出的多样性和创造性。
-
BPE分词算法的核心思想是什么?
A. 随机将文本切分为固定长度的片段
B. 从字符开始,反复合并最高频的字符对来构建词表
C. 使用词典匹配,遇到未知词就跳过
D. 将每个汉字作为一个Token答案:B。BPE(Byte Pair Encoding)从字符级别开始,通过迭代合并语料中最高频的相邻字符对来构建子词词表。