第 1 讲:Transformer 与大模型基础原理
核心结论(15 条必记)
- Transformer 的核心是 Self-Attention -- 让所有词能"同时互相看"
- 自注意力在计算"谁和谁相关" -- 通过 Q、K、V 三个向量
- 位置编码让模型知道词的顺序 -- 否则"狗咬人"和"人咬狗"没区别
- 现在主流都是 Decoder-only 架构 -- GPT、LLaMA、通义千问、Claude
- 大模型是"自回归生成" -- 一个词一个词预测下一个词
- Token 是模型的基本单位 -- 不等于词,也不等于字符
- 1 个汉字 ≈ 1-2 个 Token -- 关系到成本和窗口管理
- Temperature 控制输出的随机性 -- 低=稳定,高=创造性
- Top-P 动态选择候选词 -- 比 Top-K 更灵活
- 幻觉是大模型的本质特性 -- 模型在"生成概率高的词",不是"检索事实"
- 上下文窗口是硬限制 -- 超过就报错或截断
- Embedding 把文本变成向量 -- 是 RAG、搜索、推荐的基础
- 语义相似的文本,向量也相似 -- 这是 Embedding 的核心价值
- 预训练学语言,微调学对话,对齐学价值观 -- 大模型训练的三个阶段
- 理解原理是优化应用的前提 -- 知道为什么,才知道怎么做
一、为什么要从 Transformer 开始?
很多人学大模型应用开发,直接就开始调 API、写 Prompt,看起来也能做出东西。
但你会很快遇到这些困惑:
- 为什么模型有时候答得很好,有时候答得很差?
- 为什么 Prompt 换个说法,效果就完全不一样?
- 为什么模型会"编造"不存在的事实?
- 为什么上下文窗口有限制?为什么超过就不行?
- 为什么有的模型擅长对话,有的擅长文本生成?
这些问题的答案,都藏在 Transformer 架构和大模型的底层原理 里。
这一讲的目标:
- 建立对 Transformer 的直觉理解
- 理解大模型"生成"的本质
- 知道为什么会有幻觉、为什么有长度限制、为什么需要 Prompt
- 为后面的 RAG、Agent、微调打下坚实基础
二、从 RNN 到 Transformer:一场革命
1. RNN 时代的问题
在 Transformer 出现之前,处理文本序列的主流是 RNN(循环神经网络) 和它的变体 LSTM、GRU。
RNN 的核心思想:
- 一个词一个词地处理
- 每处理一个词,都把之前的"记忆"带上
- 像这样:
今天 -> 天气 -> 很 -> 好,逐个处理
RNN 的三个致命问题:
| 问题 | 说明 |
|---|---|
| 梯度消失/爆炸 | 反向传播时梯度连乘,越乘越小(消失)或越大(爆炸),导致远处信息无法学习 |
| 无法并行计算 | 必须按顺序处理,无法利用 GPU 并行能力 |
| 信息瓶颈 | 所有历史信息压缩到固定大小的隐状态向量,损失严重 |
梯度消失:为什么 RNN 学不到远处的信息?
训练神经网络的过程是:前向传播算预测 → 算误差 → 反向传播算梯度 → 更新参数。
反向传播的核心是链式法则 -- 梯度是一层层乘过去的:
第1层的梯度 = 损失函数对第N层的梯度 × 第N层对第N-1层的梯度 × ... × 第2层对第1层的梯度如果每一层的梯度都小于 1(比如 0.9),连乘 100 次:
0.9^100 ≈ 0.000026第 1 层收到的梯度几乎为 0,参数几乎不更新,等于白学。
直觉理解: 梯度就像"学习信号",每过一层就衰减一次,传到前面已经听不到了。
RNN 处理长序列时,时间步之间的梯度连乘导致远处的信息几乎无法影响当前参数,这就是"长距离依赖难学习"的根本原因。
Transformer 怎么解决? Self-Attention 让任意两个位置直接交互,不需要一层层传递,所以不存在梯度连乘消失的问题。但 Transformer 本身也有多层堆叠,层数很深时仍然会面临梯度问题,这需要残差连接来解决(后面讲)。
2. Transformer 的革命性突破
2017 年,Google 发表了论文 《Attention Is All You Need》,提出了 Transformer 架构。
核心思想:不再逐个处理,而是让所有词"同时互相看"。
打个比方:
- RNN 像接力赛: 信息一棒一棒传,传到后面就模糊了
- Transformer 像群聊: 所有人同时在线,任何两个人都能直接对话
三个巨大优势:
- 长距离依赖不再是问题 -- 第一个词和第 1000 个词可以直接"对话"
- 可以并行计算 -- 所有词同时处理,训练和推理速度大幅提升
- 表达能力更强 -- 每个词都能看到全局信息
现在几乎所有大模型(GPT、BERT、LLaMA、通义千问、文心一言)都基于 Transformer。
三、Transformer 的核心:自注意力机制(Self-Attention)
1. 自注意力在做什么?(直觉理解)
自注意力的核心任务:让每个词知道它应该关注句子中的哪些其他词。
例子:
句子:The animal didn't cross the street because it was too tired.当模型处理 it 这个词时,自注意力机制会计算 it 和句子中每个词的"相关性分数":
it和animal:相关性高it和street:相关性低it和tired:有一定相关性
最终 it 的表示会融合其他词的信息,尤其是 animal 的信息。
2. 自注意力的计算过程(简化版)
步骤 1:每个词生成三个向量
- Q(Query,查询):我要找什么信息?
- K(Key,键):我能提供什么信息?
- V(Value,值):我具体是什么信息?
步骤 2:计算相关性分数
用当前词的 Q 和所有词的 K 做点积,算出相关性分数。
步骤 3:用分数加权融合 V
把所有词的 V 按分数加权求和,得到融合了上下文信息的新表示。
3. 多头注意力(Multi-Head Attention)
Transformer 不是只做一次注意力,而是并行做多次(比如 8 次、12 次)。
不同的"头"关注不同的关系:
- 第 1 个头关注语法关系(主谓宾)
- 第 2 个头关注语义关系(同义词、上下位)
- 第 3 个头关注指代关系(it 指向谁)
最后把所有头的结果拼接起来,让模型能同时捕捉多种信息。
4. 位置编码(Positional Encoding)
自注意力里所有词"同时"处理,模型怎么知道词的顺序?
比如 狗咬人 和 人咬狗 意思完全不同。
解决办法:位置编码 -- 在每个词的向量里加入位置信息(第 1 个词、第 2 个词……)。
四、Transformer 的完整结构
1. Encoder(编码器)-- 理解输入
多层 Self-Attention + 前馈神经网络,每层有残差连接和归一化。
典型应用:BERT -- 擅长文本分类、命名实体识别、问答
2. Decoder(解码器)-- 生成输出
Masked Self-Attention(只能看前面的词)+ Cross-Attention + 前馈神经网络。
典型应用:GPT -- 擅长文本生成、对话、续写
3. Encoder-Decoder -- 完整 Transformer
同时有 Encoder 和 Decoder。典型应用:机器翻译(T5、BART)
4. 深入:残差连接、Layer Normalization 与 Dropout
Transformer 的每一层不是简单堆叠,而是用了一个关键结构:Add & Norm。
输入 x → [Self-Attention] → 残差加和 → [LayerNorm] → [前馈网络] → 残差加和 → [LayerNorm] → 输出
↑ ↑
x + attention(x) norm(x + ffn(x))残差连接(Residual Connection)
做法: 把层的输入直接"跳"到输出,和层的输出相加:
output = x + Sublayer(x)为什么需要? 还记得前面讲的梯度消失吗?深层网络反向传播时,梯度要一层层乘过去。有了残差连接,梯度可以直接跳过中间层传播:
没有残差:梯度 = 第N层梯度 × 第N-1层梯度 × ... × 第1层梯度(连乘衰减)
有残差: 梯度 = 第N层梯度 × (1 + 第N-1层梯度) × ... × (1 + 第1层层梯度)括号里有 1 +,即使子层梯度很小,至少也有 1 保底,梯度不会消失。
直觉理解: 残差连接给梯度修了一条"高速公路",让学习信号可以直达每一层。
Layer Normalization(层归一化)
做法: 对同一个 token 的所有特征做归一化(均值为 0,方差为 1)。
为什么不用 Batch Normalization?
| 维度 | Batch Norm | Layer Norm |
|---|---|---|
| 归一化方向 | 同一特征跨样本 | 同一样本跨特征 |
| 对序列长度敏感 | 敏感,batch 小时不稳定 | 不敏感 |
| 推理时 | 需要保存运行均值 | 不需要 |
| 适合 Transformer | 否 | 是 |
Layer Norm 的作用:稳定每一层的输出分布,防止数值越来越大或越来越小,加速训练收敛。
Dropout(随机丢弃)
做法: 训练时随机把一部分神经元的输出置为 0(比如 50% 概率丢弃)。
为什么需要? 防止过拟合。如果模型太依赖某些特定神经元,就会死记硬背训练数据。Dropout 强迫模型学会"冗余表示",即使部分神经元被丢弃也能正常工作。
Transformer 中 Dropout 用在哪里:
| 位置 | 说明 |
|---|---|
| Self-Attention 的权重上 | 随机丢弃部分注意力连接 |
| 每个子层的输出上 | 在 Add & Norm 之前丢弃 |
| Embedding + 位置编码 | 输入层也会用 |
注意: 训练时才启用 Dropout,推理(使用模型)时关闭。
三者配合:Add & Norm 的完整流程
输入 x
│
├──→ [Self-Attention] → [Dropout] ──→ (+) 残差加和 ──→ [Layer Norm]
│ ↑
└──────────────────────────────────────┘
│
┌─────────────────┘
↓
──→ [前馈网络 FFN] → [Dropout] ──→ (+) 残差加和 ──→ [Layer Norm] ──→ 输出
↑
┌──────────────────┘
└── 上一步的输出直接跳过来一句话总结: 残差连接解决梯度消失,Layer Norm 稳定训练,Dropout 防过拟合。三者配合让 Transformer 能堆叠到几十甚至上百层。
5. 为什么现在 Decoder-only 成为主流?
GPT 系列、LLaMA、通义千问、Claude 全是 Decoder-only。
- 生成任务更通用 -- 对话、写作、代码生成都是生成任务
- Decoder 也能做理解任务 -- 通过 Prompt 引导即可
- 训练效率更高 -- Decoder 的自回归训练更简单
五、大模型是怎么"生成"文本的?
1. 自回归生成(Autoregressive Generation)
一个词一个词地预测下一个词。
输入:今天天气
步骤 1: 预测下一个词 → "很"
步骤 2: 现在输入变成"今天天气很"
步骤 3: 预测下一个词 → "好"
步骤 4: 现在输入变成"今天天气很好"
... 重复直到生成结束符或达到最大长度2. Token 是什么?
Token 不等于"词",也不等于"字符"。Token 是模型处理的最小单位。
| 语言 | 示例 | Token 情况 |
|---|---|---|
| 中文 | "今天" | 可能是 1 个 Token |
| 中文 | "很好" | 可能是 2 个 Token:"很" + "好" |
| 英文 | "hello" | 1 个 Token |
| 英文 | "ChatGPT" | 可能是 2 个 Token:"Chat" + "GPT" |
常见 Tokenization 方法:
| 方法 | 使用者 |
|---|---|
| BPE(Byte Pair Encoding) | GPT 系列 |
| WordPiece | BERT |
| SentencePiece | 很多开源模型 |
重要规律:
- 1 个汉字 ≈ 1-2 个 Token
- 1 个英文单词 ≈ 1-2 个 Token
为什么要关心 Token?
- API 按 Token 计费 -- 输入 + 输出的 Token 总数
- 上下文窗口按 Token 算 -- GPT-4 是 8K/32K/128K Token
- 生成速度按 Token 算 -- 每秒生成多少 Token
3. 概率分布与采样
模型不是"选最好的词",而是从概率分布中采样。
输入:今天天气很
概率分布:
- 好:60%
- 棒:20%
- 不错:10%
- 糟糕:5%
- 其他:5%怎么选取决于生成参数。
六、生成参数:Temperature、Top-K、Top-P
1. Temperature(温度)
控制概率分布的"平滑程度"。
| Temperature | 行为 |
|---|---|
| 0 | 完全确定性,永远选概率最高的词 |
| 0.1-0.3 | 非常稳定、保守 |
| 0.7-0.9 | 有一定创造性 |
| 1.0 | 原始概率分布 |
| > 1.5 | 非常随机、可能不连贯 |
| 任务类型 | 推荐 Temperature | 原因 |
|---|---|---|
| 客服问答 | 0.1-0.3 | 准确、稳定 |
| 代码生成 | 0.2-0.5 | 正确、可执行 |
| 翻译 | 0.3 | 精确 |
| 创意写作 | 0.7-1.0 | 多样性 |
| 头脑风暴 | 0.8-1.2 | 发散思维 |
2. Top-K 采样
只从概率最高的 K 个词中选择。
比如 Top-K = 50:只考虑概率最高的 50 个词,其他直接忽略。
问题: K 是固定的,不够灵活。
3. Top-P(Nucleus Sampling)
从累计概率达到 P 的最小词集中选择。
比如 Top-P = 0.9:按概率从高到低排序,累加直到总和 ≥ 0.9,只从这些词中选择。
比 Top-K 更灵活,动态调整候选词数量。
实战推荐:Top-P = 0.9-0.95,和 Temperature 配合使用。
4. 其他参数
| 参数 | 说明 | 范围 |
|---|---|---|
| Frequency Penalty | 惩罚已出现的词,减少重复 | 0-2 |
| Presence Penalty | 惩罚已出现的主题,鼓励新话题 | 0-2 |
| Max Tokens | 限制生成 Token 数量 | - |
| Stop Sequences | 遇到特定字符串停止生成 | - |
七、为什么会有"幻觉"(Hallucination)?
幻觉:模型生成看似合理但实际错误的信息。
1. 幻觉的本质原因
大模型不是在"检索"知识,而是在"生成"概率最高的下一个词。
例子:
问:鲁迅和周树人打架,谁会赢?模型看到"鲁迅"和"周树人"经常一起出现,生成概率最高的回答 -- 但模型并不"知道"鲁迅就是周树人。
更深层原因:
- 训练数据的统计规律 ≠ 事实 -- 模型学到"文本模式",不是"世界知识"
- 生成机制的本质 -- 每次生成都是"概率采样",不是"查询数据库"
- 没有真正的"理解" -- 模型不知道什么是真假,只知道什么"听起来合理"
2. 如何缓解幻觉?
| 方法 | 说明 |
|---|---|
| 降低 Temperature | 输出更保守、确定 |
| 使用 RAG | 先检索真实文档,再基于文档回答(最有效) |
| Prompt 约束 | "不知道就直接说不知道,不要编造" |
| 多轮验证 | 生成后再让模型验证 |
| 引入外部工具 | 搜索引擎、数据库(Agent 思路) |
| 微调 | 训练模型拒绝回答不知道的问题 |
根本认知:幻觉无法完全消除,只能缓解和控制。这是大模型的本质特性,不是 bug。
八、上下文窗口(Context Window)
1. 什么是上下文窗口?
模型一次能"看到"的最大 Token 数量。
包括:System Prompt + 对话历史 + 用户输入 + 模型输出
| 模型 | 窗口大小 |
|---|---|
| GPT-3.5-turbo | 4K / 16K |
| GPT-4 | 8K / 32K / 128K |
| Claude 3 | 200K |
| 通义千问 | 8K / 32K |
| Kimi | 200K |
2. 为什么有长度限制?
| 原因 | 说明 |
|---|---|
| 计算复杂度 | Self-Attention O(n^2),序列翻倍计算量变 4 倍 |
| 显存限制 | 长序列需要大量显存 |
| 位置编码 | 训练时最大长度固定 |
3. 怎么管理上下文窗口?
| 方法 | 说明 |
|---|---|
| 滑动窗口 | 只保留最近 N 轮对话 |
| 对话摘要 | 定期总结,用摘要替换原始历史 |
| 重要信息提取 | 提取关键信息,丢弃细节 |
| 分段处理 | 长文档分块处理,汇总 |
| RAG | 检索相关片段按需注入 |
九、Embedding:连接传统系统和大模型的桥梁
1. Embedding 是什么?
把文本转换成向量(一串数字)。
"今天天气很好" → [0.2, -0.5, 0.8, 0.1, ...](1536 个数字)2. 核心特性:语义相似性
语义相近的文本,向量也相近。
用余弦相似度衡量:接近 1 = 相似,接近 -1 = 相反,接近 0 = 不相关
3. 应用
| 应用 | 说明 |
|---|---|
| 语义搜索 | RAG 的核心 |
| 文本分类 | Embedding + ML 模型 |
| 去重 | 计算文本相似度 |
| 聚类 | 发现主题 |
| 推荐系统 | 用户兴趣和内容的相似度 |
4. 常用 Embedding 模型
| 模型 | 维度 | 特点 |
|---|---|---|
| text-embedding-3-small (OpenAI) | 1536 | 通用,API 调用 |
| BGE 系列 (智源) | 768/1024 | 中文好,开源 |
| M3E (Moka) | 768 | 中文优化,开源 |
选型:英文 → OpenAI,中文 → BGE/M3E,私有部署 → 开源
5. 注意事项
- 不同模型的 Embedding 不兼容,切换需重新生成
- 有最大长度限制(512-8192 Token)
- 需要向量数据库存储(Milvus、Chroma、FAISS)
十、预训练、微调、对齐:大模型怎么训练出来的?
总览:三个阶段
| 阶段 | 目标 | 数据量 | 算力消耗 | 结果 |
|---|---|---|---|---|
| 预训练 | 学会语言本身 | TB 级原始文本 | 极高(数千 GPU 月) | 基础模型:会续写,不会对话 |
| SFT(监督微调) | 学会对话和遵循指令 | 几千~几万条指令对 | 中等 | 指令模型:能听懂指令 |
| RLHF/DPO(对齐) | 价值观和人类对齐 | 几万~十几万条偏好数据 | 中等 | 对齐模型:有用、诚实、无害 |
流程: 基础模型(预训练) → 指令模型(SFT) → 对齐模型(RLHF/DPO)
1. 预训练:让模型学会"语言"
目标
从海量文本中学会语法、常识、推理能力,但不追求特定任务表现。
数据从哪来?
| 数据来源 | 占比(典型) | 说明 |
|---|---|---|
| 网页爬取(Common Crawl) | ~60% | 量大但质量参差不齐,需要大量清洗 |
| 书籍 | ~15% | 长文本、高质量知识 |
| 论文(arXiv) | ~5% | 学术推理能力 |
| 代码(GitHub) | ~10% | 逻辑推理、代码生成能力 |
| 百科(Wikipedia) | ~5% | 准确的结构化知识 |
| 对话/论坛 | ~5% | 对话能力 |
数据清洗流程: 原始数据 → 去重 → 去低质量内容 → 过滤敏感信息 → 分词
训练任务:预测下一个词(Causal Language Modeling)
给模型一段文本的前 N 个词,让它预测第 N+1 个词:
输入: "今天天气很"
目标: "好"
输入: "Transformer 的核心机制是"
目标: "自"损失函数:交叉熵(Cross-Entropy Loss)
模型输出的是所有候选词的概率分布,损失函数衡量预测分布和真实答案的差距:
预测分布:好(0.6) 棒(0.2) 不错(0.1) 糟糕(0.05) ...
真实答案:好(one-hot:好=1,其他=0)
交叉熵损失 = -log(预测"好"的概率) = -log(0.6) ≈ 0.51预测越准确,损失越小。 训练的目标就是让总损失尽可能小。
反向传播与参数更新
前向传播:输入文本 → 模型计算 → 输出预测分布
计算损失:预测分布 vs 真实答案 → 交叉熵损失
反向传播:损失 → 计算每个参数的梯度(偏导数)
参数更新:参数 = 参数 - 学习率 × 梯度一句话: 梯度告诉模型"往哪个方向调整参数能让预测更准",学习率控制"每次走多远"。
规模
| 模型 | 参数量 | 训练数据量 | 训练算力 | 预估成本 |
|---|---|---|---|---|
| GPT-3 | 1750 亿 | ~500B Token | ~355 GPU 年 | ~460 万美元 |
| LLaMA-2 70B | 700 亿 | ~2T Token | ~1720 GPU 年 | ~数百万美元 |
| GPT-4 | 未公开(推测万亿级) | 未公开 | 极高 | ~1 亿美元级 |
关键训练技术
| 技术 | 作用 | 说明 |
|---|---|---|
| 分布式数据并行(DDP) | 加速训练 | 把数据分到多张 GPU,各算各的梯度再汇总 |
| 张量并行(TP) | 突破单卡显存限制 | 一个模型切成多块,分布在不同 GPU 上 |
| 流水线并行(PP) | 突破单卡显存限制 | 模型按层切分,不同 GPU 负责不同层 |
| 混合精度训练 | 节省显存+加速 | 用 FP16/BF16 做计算,FP32 做梯度更新 |
| 梯度检查点(Gradient Checkpointing) | 节省显存 | 不存中间激活值,需要时重新计算,用时间换空间 |
| 学习率调度 | 稳定训练 | 先预热(warmup)线性升高,再余弦衰减 |
2. SFT(监督微调):让模型学会"对话"
预训练模型的问题
预训练后的基础模型只会续写文本,你问它问题,它可能续写一个类似的问题而不是回答:
用户:中国的首都是哪里?
基础模型可能输出:中国的首都是哪里?日本的首都是哪里?韩国的首都是哪里?SFT 怎么做?
用人工编写的高质量指令-回答对训练模型:
{
"instruction": "请解释什么是机器学习",
"input": "",
"output": "机器学习是人工智能的一个分支,它让计算机能够从数据中学习规律,而不需要显式编程每一个规则..."
}{
"instruction": "请将以下文本翻译成英文",
"input": "今天天气很好",
"output": "The weather is very nice today."
}训练细节
| 维度 | 说明 |
|---|---|
| 数据量 | 几千到几万条(相比预训练很少,但质量极高) |
| 训练方式 | 和预训练一样是预测下一个词,但只计算回答部分的损失 |
| 学习率 | 比预训练小很多(预训练的 1/10 ~ 1/5),避免"遗忘"预训练知识 |
| 训练轮数 | 通常 2-5 个 epoch,多了容易过拟合 |
关键点: SFT 的数据质量远比数量重要。几千条精心标注的数据,效果可能比几十万条低质量数据好得多。
3. RLHF / DPO(对齐):让模型更"安全"
SFT 后的模型能对话了,但可能:输出有害内容、胡编乱造、不遵循用户意图。
RLHF(Reinforcement Learning from Human Feedback)
分两步走:
Step 1:训练奖励模型(Reward Model)
给模型同一个问题,让它生成两个回答:
问题:"什么是 Python?"
回答 A(好):"Python 是一种通用编程语言,以简洁易读著称..."
回答 B(差):"Python 是一种蛇,生活在热带..."
人类标注:A 比 B 好
收集几万~十几万条这样的偏好数据 → 训练一个"打分模型"(奖励模型)奖励模型能自动给任意回答打分:好回答高分,差回答低分。
Step 2:用 PPO 强化学习优化
策略模型(大模型)生成回答 → 奖励模型打分 → PPO 算法更新策略模型
↑
让模型倾向于生成高分回答同时加一个 KL 散度惩罚,防止模型为了追求高分而偏离太远(比如只输出空话)。
PPO 的问题: 训练不稳定、实现复杂、需要同时维护 4 个模型(策略模型、参考模型、奖励模型、价值模型)。
DPO(Direct Preference Optimization)-- RLHF 的简化版
核心思想: 跳过奖励模型,直接从人类偏好数据中学习。
同样的偏好数据(A 比 B 好)
DPO 直接优化:
- 增大生成"好回答 A"的概率
- 减小生成"差回答 B"的概率| 对比 | RLHF (PPO) | DPO |
|---|---|---|
| 需要奖励模型 | 是 | 否 |
| 训练稳定性 | 不稳定,超参敏感 | 稳定 |
| 实现复杂度 | 高 | 低 |
| 效果 | 成熟,经过大规模验证 | 接近 RLHF,部分场景更好 |
| 代表模型 | ChatGPT、Claude | LLaMA-3、Qwen-2(后期版本也用) |
趋势: 越来越多模型(尤其是开源模型)转向 DPO 或其变体。
4. 训练全流程总结
原始数据(TB级文本)
│
▼
┌─────────┐
│ 预训练 │ ──→ 基础模型(Base Model)── 会续写,不会对话
└─────────┘
│ + 几千条指令数据
▼
┌─────────┐
│ SFT │ ──→ 指令模型(SFT Model)── 能对话,但可能不安全
└─────────┘
│ + 几万条偏好数据
▼
┌─────────┐
│ RLHF/DPO │ ──→ 对齐模型(Chat/Instruct Model)── 有用、诚实、无害
└─────────┘类比理解:
| 阶段 | 类比 |
|---|---|
| 预训练 | 读了整个图书馆 -- 知识渊博但不知道怎么和人交流 |
| SFT | 学会了面试技巧 -- 知道怎么回答问题了 |
| RLHF/DPO | 学会了职场礼仪 -- 不仅会回答,还知道什么该说什么不该说 |
十一、面试高频题
Q1:Transformer 和 RNN 的区别?
| 维度 | RNN | Transformer |
|---|---|---|
| 处理方式 | 顺序处理 | 并行处理 |
| 长距离依赖 | 信息衰减 | 任意位置直接交互 |
| 计算效率 | 无法并行 | 高度并行 |
| 核心机制 | 循环连接 | 自注意力 |
Q2:自注意力怎么工作?
Q(查询)+ K(键)+ V(值)→ Q 和所有 K 算相关性 → 用分数给 V 加权 → 融合上下文的新表示
Q3:Token 和"词"的区别?
Token 是模型最小单位,不等于词也不等于字符。1 个汉字 ≈ 1-2 个 Token。API 按 Token 计费。
Q4:Temperature 怎么调?
0 = 确定,低 = 保守,高 = 创造性。客服/代码 → 低,写作/头脑风暴 → 高。
Q5:为什么会有幻觉?
模型"生成概率高的词"而非"检索事实"。无法完全消除,只能用 RAG/Prompt 约束/外部工具缓解。
Q6:上下文窗口为什么有限制?
Self-Attention O(n^2) 复杂度 + 显存限制。超过会报错。管理方法:滑动窗口、摘要、RAG。
Q7:Embedding 是什么?
文本转向量。语义相似的文本向量也相似。用于语义搜索(RAG)、分类、推荐。
Q8:GPT vs BERT?
GPT = Decoder-only,单向注意力,擅长生成。BERT = Encoder-only,双向注意力,擅长理解。现在 GPT 类是主流。
Q9:预训练、微调、对齐?
预训练学语言 → SFT 学对话 → RLHF/DPO 学价值观。
Q10:什么是梯度消失?Transformer 怎么缓解?
反向传播时梯度层层连乘,越乘越小,前面的层几乎学不到东西。Transformer 通过残差连接(output = x + Sublayer(x))让梯度可以"跳层"传播,避免连乘衰减。
Q11:残差连接、Layer Norm、Dropout 各自的作用?
| 机制 | 作用 |
|---|---|
| 残差连接 | 解决梯度消失,让梯度跳层传播 |
| Layer Norm | 稳定每层输出分布,加速训练收敛 |
| Dropout | 随机丢弃神经元,防止过拟合 |
Q12:RLHF 和 DPO 的区别?
RLHF 需要先训练奖励模型再用 PPO 强化学习,实现复杂、不稳定。DPO 直接从偏好数据学习,跳过奖励模型,更简单稳定。趋势是越来越多模型转向 DPO。
Q13:预训练的损失函数是什么?
交叉熵损失。模型预测所有候选词的概率分布,损失 = -log(预测正确答案的概率)。预测越准,损失越小。
Q14:为什么大模型不能直接回答企业内部知识?
只知道训练数据里的内容,不存储知识而是生成概率高的文本。解决:RAG、微调、外部工具。
十二、练习题
练习 1:概念理解
- 为什么 Transformer 比 RNN 更适合处理长文本?
- Self-Attention 在"理解"一个句子时做了什么?
- 为什么 Token 不等于"词"?举 3 个例子。
- Temperature = 0 和 Temperature = 1 的输出有什么区别?
- 幻觉是不是 bug?能不能完全消除?
练习 2:参数调优
问题 1:客服机器人每次回答都一样,太"死板"。调哪个参数?怎么调?
问题 2:模型编造不存在的产品功能。调哪个参数?还有什么办法?
问题 3:模型回答经常重复同一个词。调哪个参数?
练习 3:实战设计
做一个"企业知识库问答系统":用什么架构?怎么防止幻觉?怎么管理上下文窗口?
练习 4:Debug 题
用户反馈"对话聊着聊着就报错了":
This model's maximum context length is 4096 tokens.
However, your messages resulted in 4523 tokens.问题是什么?有哪些解决办法(至少 3 种)?
下一讲预告
第 2 讲:Prompt Engineering 深度实践
- Prompt 的结构化设计框架
- Zero-shot vs Few-shot vs Chain-of-Thought
- Prompt 注入攻击与防御
- 10 个实战案例