大模型底层面试题
IT周瑜大模型面试
1、请解释神经网络中"模型"的定义,并说明 y=wx+b 是什么类型的模型?
答案要点:
- 模型本质上就是一个函数,用于描述输入到输出的映射关系
- y = wx + b 是线性回归模型,也称为单层神经网络
- w 是权重(weight),控制输入对输出的影响程度
- b 是偏置(bias),控制输出曲线的上下偏移
- 这种模型只能拟合线性关系的数据
2、请说明数据归一化在神经网络训练中的作用,并对比 Min-Max 归一化和 Z-Score 标准化的优缺点。
答案要点:
- 归一化将数据缩放到统一的数值范围,使训练更稳定
- Min-Max 归一化:(x - min) / (max - min),将数据映射到 [0, 1]
- 优点:保留原始数据分布形状
- 缺点:对异常值敏感
- Z-Score 标准化:(x - mean) / std,将数据映射到均值为0、标准差为1的分布
- 优点:对异常值不那么敏感
- 缺点:不保证数值在 [0, 1] 范围内
3、请解释损失函数(误差函数)在神经网络训练中的作用,为什么通常使用平方误差 (y_predict - y)^2?
答案要点:
- 损失函数衡量模型预测值与真实值之间的差距
- 训练目标是最小化损失函数,找到最优参数
- 使用平方误差的原因:
- 误差平方后都为正数,避免正负误差相互抵消
- 平方会放大误差,使模型对误差更敏感
- 平方误差是平滑函数,便于求导
4、请说明激活函数在神经网络中的作用,列举三种常见激活函数及其特点。
答案要点:
- 激活函数引入非线性因素,使神经网络能够拟合非线性数据
- Sigmoid:输出范围 (0, 1),适合二分类输出层,但容易导致梯度消失
- ReLU:max(0, x),计算简单,缓解梯度消失,是目前最常用的激活函数
- Softmax:将输入转换为概率分布,常用于多分类问题的输出层
- 通常 ReLU 及其变种用于隐藏层,Sigmoid/Softmax 用于输出层
5、请解释梯度下降的基本原理,说明如何通过梯度来调整模型参数。
答案要点:
- 梯度是损失函数关于参数的导数,表示参数变化对损失的影响方向
- 梯度下降通过沿着梯度的反方向更新参数来寻找损失最小值
- 如果梯度为负,则增加参数值;如果梯度为正,则减少参数值
- 参数更新公式:w_new = w_old - learning_rate × gradient
- 梯度为 0 时表示到达极值点(可能是最小值)
6、请详细解释链式法则在神经网络反向传播中的应用,如何通过链式法则计算多层层级的梯度。
答案要点:
- 链式法则用于计算复合函数的导数:dy/dx = (dy/du) × (du/dx)
- 在神经网络中,输出层损失需要通过多层网络向前传递梯度
- 对于复合函数如 sigmoid(w×x + b),需要按顺序计算各部分导数
- 例如对于 sigmoid(wx+b):
- 设 z = wx+b,sigmoid(z) 的导数为 sigmoid(z)×(1-sigmoid(z))
- ∂loss/∂w = ∂loss/∂sigmoid × ∂sigmoid/∂z × ∂z/∂w
- 这种逐层传递梯度的过程就是反向传播的核心
7、请对比 SGD(随机梯度下降)、Mini-batch SGD 和全量梯度下降的优缺点和适用场景。
答案要点:
- 全量梯度下降:每次使用所有样本计算梯度
- 优点:收敛稳定,方向准确
- 缺点:计算量大,无法处理大数据集
- SGD:每次随机选取一个样本计算梯度
- 优点:计算快,能跳出局部最小值
- 缺点:收敛不稳定,震荡较大
- Mini-batch SGD:每次选取一批样本计算梯度
- 优点:兼顾收敛稳定性和计算效率,可并行化
- 缺点:需要调参 batch_size
适用场景:
- 小数据集:全量梯度下降
- 大数据集:Mini-batch SGD
- 在线学习:SGD
8、请解释学习率(Learning Rate)在神经网络训练中的重要作用,学习率过大或过小会有什么问题?
答案要点:
- 学习率控制每次参数更新的步长大小
- 学习率过大:
- 参数更新幅度过大,可能错过最低点
- 导致损失函数震荡甚至发散
- 模型无法收敛
- 学习率过小:
- 参数更新幅度过小,收敛速度慢
- 容易陷入局部最小值
- 训练时间过长
- 学习率策略:
- 可以使用学习率衰减:随着训练进行逐渐降低学习率
- 可以使用自适应学习率优化器(如 Adam)
- 一般从 0.01、0.001 开始尝试
9、请解释多层神经网络如何通过激活函数处理非线性数据,说明为什么单层线性模型无法拟合复杂数据。
答案要点:
- 单层线性模型 y=wx+b 只能拟合线性关系的数据
- 对于非线性数据(如二分类问题),需要引入激活函数
- 多个带激活函数的神经元可以组合成复杂的非线性函数
- 例如:y = w1 × sigmoid(w2×x+b2) + w3 × sigmoid(w4×x+b4) + b1
- 通过调整多个神经元的参数,可以逼近任意连续函数(万能逼近定理)
- 每一层都可以提取不同层次的特征:
- 第一层:简单特征(边缘、纹理)
- 第二层:复杂特征(形状、模式)
- 更深层:抽象特征(物体、概念)
B --> C{激活函数}
C --> D[隐藏层2]
D --> E{激活函数}
E --> F[输出层]
F --> G[输出 y]
style C fill:#ff9999
style E fill:#ff9999
style B fill:#99ccff
style D fill:#99ccff -->
10、请解释 PyTorch 的动态计算图(Dynamic Computation Graph)机制,说明 loss.backward() 如何自动计算梯度。
答案要点:
- 动态计算图记录张量之间的运算关系
- 当对张量进行运算时(如 y_pred = w×x + b),PyTorch 构建计算图
- 计算图保存了每个操作的梯度规则(如乘法、加法的求导规则)
- 调用 loss.backward() 时:
- 从 loss 节点开始反向遍历计算图
- 使用链式法则逐层计算梯度
- 将梯度存储在对应参数的 .grad 属性中
- 只有 requires_grad=True 的张量才会计算梯度
- optimizer.zero_grad() 清除上一次的梯度,防止梯度累加
- optimizer.step() 根据计算出的梯度更新参数
11、请解释什么是 Token(词元)?
答案要点:
- Token 是自然语言处理中的基本单位
- 英文中可以是单词、字母、标点符号、子词(如 unhappy → un 和 happy)
- 中文可以是字、词语、成语
- Token 是模型处理文本的最小粒度
12、请解释 N-Gram 模型的工作原理。
答案要点:
- N-Gram 是将句子分成 N 个单词进行统计的模型
- 常用的是 2-gram(bigram)和 3-gram(trigram)
- 2-gram 用前一个词预测后一个词
- 3-gram 用前两个词预测第三个词
- 核心思想:根据上下文窗口内的词预测下一个词
13、请说明 Word2Vec 的两种训练方式 SkipGram 和 CBOW 的区别。
答案要点:
- SkipGram:给定中心词,预测周围词(一对多)
- CBOW:给定周围词,预测中心词(多对一)
- SkipGram 训练更精细,能更好识别词与词之间的语义关系,适合小数据集
- CBOW 训练更快,适合大数据集
end
subgraph CBOW["CBOW"]
A2[周围多个词] --> B2[取平均] --> B3[预测中心词]
end -->
14、请解释 Word2Vec 中词向量(Word Embedding)的作用。
答案要点:
- 将离散的单词映射到连续的低维向量空间
- 相似语义的词在向量空间中距离更近
- 便于模型进行数学运算和语义推理
- 降低了稀疏性,提高了模型泛化能力
15、请说明 Word2Vec 中 Embedding 层和 Linear 层(加 one-hot)的关系。
答案要点:
- 在输入为 one-hot 编码时,Embedding 和 Linear 的权重矩阵本质等价
- Embedding 使用查找表(lookup table),直接根据索引获取向量
- Linear 层通过矩阵乘法获取向量
- Embedding 在实现上更高效,避免了大量无效的乘法运算
16、请对比 N-Gram、Word2Vec 和 BERT 三种模型的语义表示能力。
答案要点:
- N-Gram:仅统计局部词共现,无法捕捉长距离依赖和语义关系
- Word2Vec:学习静态词向量,能捕捉词义相似性,但无法处理一词多义
- BERT:基于 Transformer 的动态上下文表示,能捕捉长距离依赖和一词多义
| 模型 | 表示类型 | 上下文能力 | 多义处理 | 典型应用 |
|---|---|---|---|---|
| N-Gram | 统计计数 | 局部窗口 | 不支持 | 语言模型 |
| Word2Vec | 静态向量 | 无上下文 | 不支持 | 词相似度 |
| BERT | 动态向量 | 全局上下文 | 支持 | 各类NLP任务 |
17、请解释 Word2Vec 训练中如何从周围词预测中心词(CBOW)的具体流程。
答案要点:
- 定义窗口大小(如 2),收集中心词周围的上下文词
- 将上下文词的索引输入 Embedding 层,获取对应的词向量
- 对所有上下文词向量取平均,得到一个融合向量
- 将融合向量通过 Linear 层映射到词汇表大小
- 使用 CrossEntropyLoss 计算预测与真实中心词的损失
- 反向传播更新 Embedding 层的权重,最终学到的词向量就是权重矩阵的列
18、请分析 N-Gram 模型的优缺点及其适用场景。
答案要点:
- 优点:
- 计算简单、速度快
- 易于实现和调试
- 不需要预训练,直接统计即可
- 缺点:
- 无法捕捉距离较远的词之间的关系
- 数据稀疏问题严重,长 n-gram 可能从未出现过
- 缺乏语义理解能力,仅基于统计共现
- 适用场景:
- 拼写检查和自动纠错
- 简单的文本生成(如输入法联想)
- 作为特征工程的补充手段
19、请解释 Word2Vec 如何学习到词之间的语义关系(如 King-Man+Woman≈Queen)。
答案要点:
- 通过训练时词共现信息学习词向量
- 语义相似的词会出现在相似的上下文中,它们的向量会学到相似的模式
- 在向量空间中,语义关系体现为向量运算的线性关系
- 例如:King - Man + Woman ≈ Queen,是因为词向量编码了性别、皇室等属性
- 这种特性来源于模型在训练时自动捕捉到的词间关系
20、请解释 RNN 中隐藏状态 h_t 的含义。
答案要点:
- h_t 是 RNN 在时间步 t 的隐藏状态(hidden state)
- 它是模型对之前所有输入信息的记忆和总结
- h_t 由当前输入 x_t 和上一时刻隐藏状态 h_{t-1} 共同计算得到
- 每个时间步的 h_t 会传递给下一个时间步
21、请写出 RNN 的核心公式并解释各参数含义。
答案要点:
- 公式:$ h_t = \tanh(W_{xh}x_t + W_{hh}h_{t-1} + b_h) $
- $ h_t $:当前时间步的隐藏状态
- $ x_t $:当前时间步的输入
- $ h_{t-1} $:上一时间步的隐藏状态
- $ W_{xh} $:输入到隐藏层的权重矩阵
- $ W_{hh} $:隐藏层到隐藏层的权重矩阵
- $ b_h $:偏置项
- $ \tanh $:激活函数,将输出压缩到 [-1, 1] 区间
B[h_t-1 上一状态] --> C
C --> D[h_t 当前状态]
D -->|传递| E[下一时间步]
D --> F[输出 o_t] -->
22、请说明 RNN 输出每个时间步的 o_t 和最终 h_t 的区别及应用场景。
答案要点:
- o_t(每个时间步的输出):
- 包含每个 token 对应的隐藏状态序列
- 适用于序列标注、机器翻译等需要对每个位置做预测的任务
- h_t(最终隐藏状态):
- 包含整句话的综合信息
- 适用于文本分类、情感分析等需要对整个序列做判断的任务
23、请解释 RNN 的 tanh 激活函数的作用。
答案要点:
- 将非线性变换引入模型
- 将输出压缩到 [-1, 1] 区间,防止梯度爆炸
- 相比 sigmoid,tanh 的梯度更大,训练更稳定
- 对称的输出特性有助于模型收敛
24、请分析 RNN 的两个主要缺点及其原因。
答案要点:
- 无法处理长文本(梯度消失/梯度爆炸):
- 文本越长,历史信息在传递过程中被逐渐遗忘
- 梯度在反向传播时多次连乘,导致梯度消失或爆炸
- 远距离的依赖关系难以被模型学习到
- 只能串行,不能并行:
- 每个时间步的计算依赖于前一个时间步的输出
- 无法像 Transformer 那样并行计算整个序列
- 推理速度慢,不适合处理超长序列
25、请对比 RNN 和 Seq2Seq 在处理机器翻译任务上的差异。
答案要点:
- RNN:通常输入和输出长度相同,难以处理长度不一致的翻译
- Seq2Seq:
- 由 Encoder 和 Decoder 组成
- Encoder 将输入序列编码成固定长度的上下文向量
- Decoder 根据上下文向量逐词生成输出序列
- 输入和输出长度可以不同,更适合翻译任务
26、请解释为什么 RNN 容易出现梯度消失问题。
答案要点:
- RNN 需要按时间步反向传播梯度
- 每一层的梯度会通过矩阵乘法传递到之前的时间步
- 如果权重矩阵的特征值小于 1,梯度会指数级衰减(梯度消失)
- 如果权重矩阵的特征值大于 1,梯度会指数级增长(梯度爆炸)
27、请分析在什么场景下应该使用 RNN,什么时候选择其他模型。
答案要点:
- 适合使用 RNN 的场景:
- 序列较短(< 50 个 token)
- 对实时性要求高
- 计算资源受限
- 时间序列预测(股价、温度等)
- 应该选择其他模型的场景:
- 序列较长(> 100 个 token)→ 选择 LSTM/GRU
- 需要长距离依赖 → 选择 Transformer
- 需要并行加速 → 选择 Transformer/CNN
- 复杂语义理解任务 → 选择 BERT/GPT 等 Transformer 模型
28、请解释 RNN 如何利用过去信息来理解当前内容。
答案要点:
- RNN 通过隐藏状态 h_t 传递历史信息
- h_t = f(x_t, h_{t-1}),其中 h_{t-1} 携带了之前所有时间步的信息
- 每个新的输入都会与历史信息融合,更新隐藏状态
- 这种机制使 RNN 具有了"记忆"能力
- 但由于梯度消失问题,RNN 的"记忆"能力有限,难以保留很早的信息
- LSTM 和 GRU 通过门控机制改善了这一问题
29、请解释 LSTM 中输入门、遗忘门、输出门的作用。
答案要点:
- 输入门 i_t:控制新信息进入记忆单元的多少
- 遗忘门 f_t:控制保留多少旧的记忆单元信息
- 输出门 o_t:控制从记忆单元输出多少信息作为当前隐藏状态
- 三者共同协作,使 LSTM 能够选择性记忆和遗忘信息
30、请写出 LSTM 的核心公式。
答案要点:
- 输入门:$ i_t = \sigma(W_{xi}x_t + W_{hi}h_{t-1} + b_i) $
- 遗忘门:$ f_t = \sigma(W_{xf}x_t + W_{hf}h_{t-1} + b_f) $
- 输出门:$ o_t = \sigma(W_{xo}x_t + W_{ho}h_{t-1} + b_o) $
- 候选记忆单元:$ \tilde{c}t = \tanh(W{xc}x_t + W_{hc}h_{t-1} + b_c) $
- 记忆单元更新:$ c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t $
- 隐藏状态:$ h_t = o_t \odot \tanh(c_t) $
31、请解释 LSTM 中细胞状态 c_t 和隐藏状态 h_t 的区别。
答案要点:
- 细胞状态 c_t(长期记忆):
- 通过遗忘门保留旧记忆,通过输入门添加新记忆
- 实现长程依赖的传递
- 信息变化较慢,适合长期记忆
- 隐藏状态 h_t(短期记忆):
- 由输出门和当前细胞状态共同决定
- 作为当前时间步的输出
- 信息变化较快,反映当前状态
B --> C[输入门 i_t]
B --> D[遗忘门 f_t]
B --> E[输出门 o_t]
A --> F[候选状态 c̃_t]
D --> G[c_t = f_t · c_t-1 + i_t · c̃_t]
C --> G
F --> G
G --> H[h_t = o_t · tanh c_t]
H --> I[输出 h_t]
G --> J[传递给下一时间步] -->
32、请写出 GRU 的核心公式。
答案要点:
- 更新门:$ z_t = \sigma(W_{xz}x_t + W_{hz}h_{t-1} + b_{z}) $
- 重置门:$ r_t = \sigma(W_{xr}x_t + W_{hr}h_{t-1} + b_{r}) $
- 候选隐状态:$ \tilde{h}t = \tanh(W{xh}x_t + W_{hh}(r_t \odot h_{t-1}) + b_h) $
- 最终隐状态:$ h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t $
33、请解释 GRU 中更新门 z_t 的作用。
答案要点:
- 控制新旧隐状态的混合比例
- 当 z_t = 1 时,完全采用新状态(类似 RNN)
- 当 z_t = 0 时,完全保留旧状态
- 通过这个机制,GRU 可以选择性地更新或保留隐状态
34、请对比 LSTM 和 GRU 在结构设计上的差异。
答案要点:
| 特性 | LSTM | GRU |
|---|---|---|
| 门数量 | 3 个(输入、遗忘、输出) | 2 个(更新、重置) |
| 状态数量 | 2 个(细胞状态 c_t、隐藏状态 h_t) | 1 个(隐藏状态 h_t) |
| 参数量 | 更多(4 个线性变换) | 更少(3 个线性变换) |
| 复杂度 | 更复杂 | 更简单 |
35、请解释为什么 GRU 计算效率比 LSTM 更高。
答案要点:
- GRU 只有 2 个门,LSTM 有 3 个门
- GRU 只维护一个状态(h_t),LSTM 维护两个状态(c_t 和 h_t)
- GRU 参数更少,计算量更小
- GRU 的更新门同时实现了 LSTM 的输入门和遗忘门的功能
- 因此 GRU 在相同硬件上训练和推理速度更快
36、请解释 LSTM 如何解决 RNN 的梯度消失问题。
答案要点:
- LSTM 引入了细胞状态 c_t 作为"信息高速公路"
- 细胞状态的梯度主要通过"加法"而非"乘法"传递
- 即使输入门和遗忘门激活值很小,梯度仍可通过恒等映射(identity mapping)传递
- 遗忘门可以选择性保留旧信息,使梯度能够长时间保持
- 这种设计使 LSTM 能够学习长距离依赖
37、请对比 LSTM 和 GRU 在实际应用中的选择建议。
答案要点:
- 选择 LSTM 的场景:
- 数据量很大,需要更复杂的建模能力
- 任务对长距离依赖要求极高
- 计算资源充足
- 选择 GRU 的场景:
- 数据量较小
- 追求训练和推理速度
- 计算资源受限
- 任务相对简单
- 一般经验:
- GRU 在大多数任务上表现与 LSTM 相当
- GRU 更适合快速实验和原型开发
- LSTM 在某些复杂任务上可能表现更好,但差异不大
38、请解释注意力机制(Attention)的核心思想。
答案要点:
- 模拟人类阅读时关注重点的能力
- 在处理序列时,动态分配不同位置不同的权重
- 通过 Query、Key、Value 三元组计算注意力权重
- Query:当前需要关注的内容
- Key:所有位置的信息
- Value:实际的内容信息
39、请写出自注意力(Self-Attention)的计算公式。
答案要点:
- 计算注意力分数:$ Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $
- Q = $ XW_Q $,K = $ XW_K $,V = $ XW_V $
- $ QK^T $:计算 Query 和所有 Key 的相似度
- 除以 $ \sqrt{d_k} $:缩放,防止梯度过大
- softmax:归一化为概率分布
- 乘以 V:加权求和得到注意力输出
40、请解释多头注意力(Multi-Head Attention)的作用。
答案要点:
- 将注意力机制并行执行多次(多个"头")
- 每个头学习不同的关注模式
- 可以同时关注不同类型的信息(如句法、语义)
- 多个头的输出拼接后进行线性变换
- 提高了模型的表达能力
41、请解释 Transformer 中位置编码(Positional Encoding)的作用和设计原理。
答案要点:
- 作用:
- Attention 机制本身是位置不变的(不区分位置)
- 需要显式注入位置信息
- 使模型能够理解词的顺序
- 设计原理:
- 使用正弦和余弦函数生成固定编码
- 不同维度使用不同频率
- 位置编码与词向量相加
- 具有平移不变性和相对位置关系
公式:
$ PE_{(pos,2i)} = \sin(pos/10000^{2i/d_{model}}) $
$ PE_{(pos,2i+1)} = \cos(pos/10000^{2i/d_{model}}) $
42、请解释 Transformer Encoder 和 Decoder 的区别。
答案要点:
- Encoder:
- 只有自注意力(Self-Attention)
- 可以并行计算整个序列
- 用于理解输入序列
- Decoder:
- 有两种注意力:Masked Self-Attention 和 Cross-Attention
- Masked Self-Attention 确保只能看到当前及之前的位置
- Cross-Attention 关注 Encoder 的输出
- 用于生成输出序列
43、请详细解释 Transformer 中注意力分数缩放(除以 √d_k)的原因。
答案要点:
- 当 d_k 较大时,Q 和 K 的点积数值会变得很大
- 数值过大导致 softmax 进入饱和区,梯度趋近于 0
- 导致梯度消失,训练困难
- 除以 √d_k 是为了保持点积的方差稳定在合理范围
- 这样 softmax 的梯度不会过小
44、请对比 Transformer 和 RNN/LSTM 在并行性方面的差异。
答案要点:
| 特性 | RNN/LSTM | Transformer |
|---|---|---|
| 计算方式 | 串行(依赖上一时刻) | 并行(所有位置同时计算) |
| 训练速度 | 较慢 | 快 |
| 推理速度 | 慢 | 快 |
| 长距离依赖 | 难以捕捉 | 天然支持 |
| 显存占用 | 低 | 高(需要存储注意力矩阵) |
- Transformer 的 Attention 机制允许所有位置同时计算
- RNN 必须按顺序逐个时间步计算
- 这使得 Transformer 在 GPU 上训练效率极高
45、请解释 Transformer Decoder 中的 Masked Self-Attention 的作用。
答案要点:
- 防止 Decoder 在生成时看到"未来"的信息
- 通过将未来位置的注意力分数设为 -∞ 实现
- Softmax 后这些位置的权重为 0
- 确保生成过程的自回归性质
- 在训练时模拟推理时的行为
46、请解释 Transformer 中的残差连接和层归一化的作用。
答案要点:
- 残差连接(Residual Connection):
- x + F(x):将原始输入与变换后的输出相加
- 缓解梯度消失问题
- 允许网络学习恒等映射
- 便于训练深层网络
- 层归一化(Layer Normalization):
- 对每个样本的特征维度进行归一化
- 稳定训练,加速收敛
- 减少内部协变量偏移(Internal Covariate Shift)
- 组合使用:
- x + LayerNorm(F(x)) 或 LayerNorm(x + F(x))
- Transformer 使用 Post-LN 结构(先加后归一化)
- 一些现代变体使用 Pre-LN(先归一化后相加),更稳定
47、请解释 BERT 和 GPT 的核心区别。
答案要点:
- BERT:
- 基于 Transformer Encoder
- 双向注意力(能看到整个序列)
- 自编码模型(Autoencoding)
- 适合理解类任务(分类、NER、QA)
- GPT:
- 基于 Transformer Decoder
- 单向注意力(只能看到之前的位置)
- 自回归模型(Autoregressive)
- 适合生成类任务(文本生成、续写)
48、请解释 BERT 的 MLM(Masked Language Model)任务。
答案要点:
- 将输入文本中随机 15% 的词进行 Mask
- 训练模型预测被 Mask 的词(完形填空)
- Mask 策略:80% 替换为 [MASK],10% 随机替换,10% 保持不变
- 使模型学习双向上下文理解
- 单独看无法判断词性,但结合前后文可以
49、请解释 BERT 的 NSP(Next Sentence Prediction)任务。
答案要点:
- 给定两个句子 A 和 B,判断 B 是否是 A 的下一句
- 输入格式:[CLS] A [SEP] B [SEP]
- 二分类任务(是/否)
- 使模型学习句子间的关系
- 训练数据构造:50% 正样本(相邻句子),50% 负样本(随机配对)
50、请解释 GPT 的训练目标。
答案要点:
- 标准的语言建模目标
- 预测下一个词:$ P(w_t | w_{<t}) $
- 自回归生成:每个词只能看到之前的词
- 使用最大似然估计训练
- 损失函数:CrossEntropy Loss
51、请说明 BERT 中 [CLS]、[SEP]、[MASK] 等特殊 token 的作用。
答案要点:
- [CLS]:
- 序列的开始标记
- 其输出表示整个序列的语义
- 用于分类任务(取 [CLS] 位置的输出)
- [SEP]:
- 分隔符标记
- 用于分隔两个句子
- 在 NSP 任务中标识句子边界
- [MASK]:
- MLM 任务中被遮盖的词的占位符
- 模型需要预测原始词
- [PAD]:
- 填充标记
- 用于对齐序列长度
52、请对比 BERT 和 GPT 在预训练任务上的差异。
答案要点:
| 特性 | BERT | GPT |
|---|---|---|
| 架构 | Encoder | Decoder |
| 注意力方向 | 双向 | 单向(从左到右) |
| 预训练任务 | MLM + NSP | 语言建模(预测下一个词) |
| 输入格式 | 单句或双句 | 单句 |
| 适用任务 | NLU(理解) | NLG(生成) |
- BERT 的 MLM 使其能充分利用上下文,适合理解
- GPT 的自回归特性使其适合生成
- BERT 适合分类、抽取式任务
- GPT 适合生成式任务
53、请分析为什么 BERT 使用 MLM 而不是单向语言模型。
答案要点:
- MLM 允许模型双向访问上下文
- 单向模型只能看到左侧(或右侧)的信息
- 对于理解任务(如判断情感),双向信息更重要
- MLM 使 BERT 能学习到更丰富的语义表示
- 例如:在"这家餐厅的__很差,但服务很好"中,BERT 可以同时看到前后,更容易推断出"食物"
54、请解释 GPT 在推理时的自回归生成过程。
答案要点:
- 输入初始文本(或只输入起始标记)
- 模型输出下一个 token 的概率分布
- 选择概率最高的 token(或采样)
- 将选中的 token 添加到输入序列
- 重复步骤 2-4,直到生成结束标记或达到最大长度
- 每次只能看到一个 token,无法看到未来
55、请分析 BERT 和 GPT 各自的优势和局限性。
答案要点:
- BERT 优势:
- 双向理解能力强
- 适合下游理解任务
- 预训练任务丰富(MLM + NSP)
- BERT 局限:
- 不适合生成任务
- 生成时需要额外的解码器(如 BART、T5)
- GPT 优势:
- 天然支持文本生成
- 持续改进(GPT-2、GPT-3、GPT-4)
- 规模效应显著(模型越大效果越好)
- GPT 局限:
- 单向限制理解能力
- 生成质量依赖 prompt 设计
- 可能产生幻觉(hallucination)
56、请解释如何将预训练的 BERT/GPT 微调到下游任务。
答案要点:
- BERT 微调流程:
- 根据任务设计输入格式(分类、序列标注、QA 等)
- 在 BERT 输出后添加任务特定的层(如线性分类层)
- 冻结或解冻部分 BERT 参数
- 使用下游任务数据训练整个模型
- 学习率通常比预训练时小
- GPT 微调流程:
- 设计 prompt 和 response 格式
- 准备指令微调数据(Instruction Tuning)
- 使用自回归损失训练
- 可以结合 LoRA 等参数高效微调方法
- 学习率通常很小
- 常见微调策略:
- 全量微调:更新所有参数
- 部分微调:只更新最后几层
- 参数高效微调:LoRA、Adapter、Prefix Tuning 等
57、什么是 Vision Transformer(ViT)?它与 CNN 有什么区别?
答案要点:
- ViT 将 Transformer 架构应用于视觉任务,2020 年 11 月发布
- 核心思想:将图像分割成 patches,将每个 patch 视为序列中的一个 token
- 与 CNN 的区别:
- CNN 使用局部卷积核,ViT 使用全局自注意力
- CNN 有归纳偏置(平移等变),ViT 需要大规模预训练
- ViT 计算复杂度与 patch 数量的平方成正比
- ViT 处理流程:图像 → Patches → Patch Embedding → Position Encoding → Transformer → CLS Token → 分类
58、请解释 ViT 中的 Patch Embedding 和 Position Encoding。
答案要点:
- Patch Embedding:
- 将图像分割成固定大小的 patches(如 16x16)
- 每个 patch 展平成一维向量
- 通过线性层投影到固定维度(embed_dim)
- 也可以用卷积层实现:Conv2d(kernel_size=patch_size, stride=patch_size)
- Position Encoding:
- Transformer 没有位置信息,需要显式加入位置编码
- 通常使用可学习的 Embedding 层
- 维度为 [num_patches + 1, embed_dim],+1 是为了 CLS token
- 在 patch embeddings 之上逐元素相加
59、ViT 中的 CLS Token 是什么?为什么需要它?
答案要点:
- CLS Token 是一个特殊的可学习向量,类似于 BERT 的 [CLS] token
- 在序列开头添加,与所有 patches 进行交互
- 输出时只取 CLS Token 对应的输出作为整个图像的表示
- 优点:
- 不需要聚合所有 patch 的输出
- 通过自注意力机制自然学到全局信息
- 便于预训练和微调
- 与全局平均池化(GAP)的对比:CLS Token 更灵活,GAP 更简单
60、什么是 CLIP?它的设计目标是什么?
答案要点:
- CLIP(Contrastive Language-Image Pre-training)是 OpenAI 提出的图文预训练模型
- 设计目标:通过对比学习学习图像和文本的联合表示
- 核心思想:相似的图像和文本在特征空间中应该接近
- 模型架构:双编码器结构
- Image Encoder:Vision Transformer(ViT)
- Text Encoder:Transformer(类似 BERT)
- 两个编码器输出相同维度的特征向量(如 512 维)
- 训练数据:大规模图文对(如 4 亿对)
- 应用场景:零样本分类、文搜图、图搜文
61、请解释 CLIP 的对比损失是如何计算的。
答案要点:
- 对比损失有两个方向:图像到文本(I2T)和文本到图像(T2I)
- Logits 计算:logits = image_features @ text_features.T
- I2T 损失:对于每张图像,匹配正确的文本
- T2I 损失:对于每段文本,匹配正确的图像
- 总损失:(loss_i2t + loss_t2i) / 2
- 为什么要算两次:
- loss_i2t 优化 Image Encoder,使其输出的图像特征与对应文本更相似
- loss_t2i 优化 Text Encoder,使其输出的文本特征与对应图像更相似
- 双向优化,两个编码器共同进步
62、请详细说明 LLaVA 的架构,以及它如何实现图像-文本理解。
答案要点:
- LLaVA(Large Language-and-Vision Assistant)是多模态大语言模型
- 核心思想:将视觉特征融入语言模型,实现图生文任务
- 架构组成:
- 视觉编码器:使用 CLIP 的 ViT 提取图像特征
- 语言模型:如 Qwen、LLaMA 等大语言模型
- 投影层:将图像特征维度对齐到语言模型的隐藏层维度
- 关键技术:
- 使用特殊 token(如
<|IMG|>)标记图像位置 - 将图像特征替换该 token 的 embedding
- 训练时使用统一的图文对数据
- 使用特殊 token(如
- 训练目标:语言模型的交叉熵损失,学习在图像上下文中生成文本
- 与 CLIP 的区别:CLIP 是图文匹配,LLaVA 是图像理解+文本生成
C[输入: 图像] --> D[视觉编码器: CLIP ViT]
B --> E[文本 token embeddings]
D --> F[图像特征向量]
F --> G[投影层: 对齐维度]
G --> H[替换 IMG token]
E --> I[拼接: 文本 + 图像特征]
H --> I
I --> J[语言模型: Qwen/LLaMA]
J --> K[生成回答] -->
63、Diffusion Model(扩散模型)的核心思想是什么?请解释前向扩散和反向去噪过程。
答案要点:
- 核心思想:通过逐步添加噪声破坏图像,然后学习逐步去噪恢复图像
- 前向扩散过程:
- 从原始图像 x0 开始,逐步添加高斯噪声
- 经过 T 步(如 1000 步),x0 变成纯噪声 xT
- 加噪公式:xt = √(α̅t) * x0 + √(1-α̅t) * ε
- α̅t 是累积的 alpha 值,控制噪声强度
- 反向去噪过程:
- 从纯噪声 xT 开始,逐步去噪
- 每步预测噪声 εθ(xt, t),然后移除噪声
- 去噪公式:xt-1 = 1/√αt * (xt - (1-αt)/√(1-α̅t) * εθ) + σt * z
- 重复 T 步,得到去噪后的图像 x0'
- 训练目标:学习预测每一步添加的噪声
64、Stable Diffusion 与 DDPM 有什么区别?VAE 在其中扮演什么角色?
答案要点:
- Stable Diffusion 的改进:
- 在潜在空间(Latent Space)而不是像素空间进行扩散
- 大幅降低计算开销和显存占用
- 支持高分辨率图像生成
- VAE 的作用:
- Encoder:将图像编码到低维潜在表示(如 4x4)
- Decoder:将潜在表示解码回高分辨率图像
- 扩散过程在潜在空间进行,训练和推理都更快
- VAE 预训练后冻结,不参与扩散模型训练
- 文本条件:
- Stable Diffusion 加入交叉注意力机制
- 使用 CLIP 的文本编码器获取文本特征
- 文本特征通过交叉注意力注入到 UNet
- 实现文生图:给定文本提示词生成对应图像
- CFG(Classifier-Free Guidance):
- 同时用条件(有文本)和无条件(空文本)生成
- 组合:x = x_uncond + guidance_scale * (x_cond - x_uncond)
- 增强对文本的控制能力
65、请解释扩散模型中的时间步(Time Step)和时间嵌入(Time Embedding)。
答案要点:
- 时间步 t:
- 扩散过程的步数,从 0(无噪声)到 T(纯噪声)
- 每个时间步对应不同的噪声强度
- 训练时随机采样 t,推理时从 T 逆向到 0
- 时间嵌入:
- 使用 Embedding 层将时间步 t 转为向量
- 通常通过线性层投影到与特征匹配的维度
- 广播到特征图每个位置相加
- 作用:让网络知道当前处于扩散的哪个阶段,预测对应的噪声
- Beta 调度:
- beta_t:每步添加噪声的方差,通常从 0.0001 线性增长到 0.02
- alpha_t = 1 - beta_t
- alpha_bar_t = cumprod(alpha_t):累积的 alpha 值
66、在 Stable Diffusion 中,交叉注意力(Cross Attention)是如何工作的?
答案要点:
- 交叉注意力让文本特征影响图像生成过程
- 实现方式:
- Query:来自 UNet 的特征图,展平为 [batch, H*W, dim]
- Key/Value:来自文本编码器的特征,形状 [batch, seq_len, dim]
- Attention: Attention(Q, K, V) = softmax(QK^T/√d) V
- 输出形状与 Query 相同:[batch, H*W, dim]
- Reshape 回图像特征图形状
- 作用机制:
- 文本中的每个词(Key/Value)可以关注图像的每个位置(Query)
- 根据注意力权重将文本信息注入到图像特征中
- 使生成图像的语义与文本提示词一致
- 通常在 UNet 的中间层使用,如最底层的特征图
67、请对比 CLIP、LLaVA、Stable Diffusion 的应用场景和输出形式。
答案要点:
- CLIP:
- 应用:零样本分类、文搜图、图搜文、图文匹配
- 输出:图像和文本的相似度分数
- 特点:双向理解,但不能生成内容
- LLaVA:
- 应用:图像理解、视觉问答、图生文描述
- 输出:文本(对图像的描述或回答)
- 特点:结合视觉和语言能力,可以理解复杂场景
- Stable Diffusion:
- 应用:文生图、图生图、图像编辑
- 输出:图像(根据文本或输入图像生成)
- 特点:强大的图像生成能力,支持创意创作
- 组合使用:
- 用 CLIP 进行图文匹配检索
- 用 LLaVA 生成图像描述
- 用 Stable Diffusion 根据描述生成新图像
68、在 ViT 实现中,使用卷积层进行 Patch Embedding 有什么优势?
答案要点:
- 直接展平 + 线性投影:
- 需要手动将图像分块,代码复杂
- 需要处理图像的通道数
- 使用卷积层:
- Conv2d(in_channels, num_patches, kernel_size=patch_size, stride=patch_size)
- 一步完成分块和投影,更高效
- 自动处理多通道图像(如 RGB)
- 输出形状:[batch, num_patches, patch_height, patch_width]
- 可以看作是用滑动窗口提取 patch
- 展平后直接得到 patch embeddings
- 示例:28x28 图像,patch_size=7,Conv2d(1, 16, 7, 7) → 16 个 7x7 patches
69、请解释 CLIP 模型命名中 ViT-B-16、ViT-L-14 等的含义。
答案要点:
- ViT:Vision Transformer,图像编码器架构
- B/L/H:模型规模
- B(Base):基础规模
- L(Large):大型模型
- H(Huge):超大型模型
- 数字(16/14):Patch Size,即每个 patch 的大小
- 16:图像切成 16x16 的 patches
- 14:图像切成 14x14 的 patches
- Patch 越小,模型的细节捕捉能力越强,但计算量越大
- 336:特殊标注,表示该模型在 336x336 分辨率上训练
- RN50:表示图像编码器使用 ResNet-50 而非 ViT
- 文本编码器通常使用 BERT(如 RoBERTa-wwm-ext-base-chinese)
70、在 LLaVA 训练中,如何将图像特征与文本特征对齐?
答案要点:
- 问题:CLIP 的图像特征维度(如 768)与语言模型维度(如 1024)不同
- 解决方法:使用投影层进行对齐
- 实现方式:
- 获取 CLIP 图像特征:[batch, 768]
- 使用线性层投影:
nn.Linear(768, 1024) - 得到对齐后的特征:[batch, 1024]
- 找到文本中
<|IMG|>token 的位置 - 将图像特征替换该 token 的 embedding
- 拼接为完整的输入 embeddings:[batch, seq_len, 1024]
- 输入语言模型进行训练
- 注意:
- 图像特征是单一向量,需要广播替换
- 需要扩展 attention mask 以匹配新的序列长度
71、在扩散模型训练中,如何构造训练样本?损失函数是什么?
答案要点:
- 训练样本构造:
- 从数据集获取真实图像 x0
- 随机采样时间步 t ∈ [0, T]
- 生成随机噪声 ε ~ N(0, I)
- 计算加噪后的图像:xt = √(α̅t) * x0 + √(1-α̅t) * ε
- 将 (xt, t) 输入 UNet,预测噪声 εθ
- 损失函数:
- MSE Loss:L = ||ε - εθ(xt, t)||²
- 即预测噪声与真实噪声的均方误差
- 不需要预测去噪后的图像,只预测添加的噪声
- 训练流程:
for epoch in epochs:
for images in dataloader:
noise = torch.randn_like(images)
t = torch.randint(0, T, (batch_size,))
xt = sqrt_alpha_bar[t] * images + sqrt_one_minus_alpha_bar[t] * noise
noise_pred = model(xt, t)
loss = mse_loss(noise_pred, noise)
loss.backward()
optimizer.step()
72、什么是强化学习?它与监督学习有什么区别?
答案要点:
- 强化学习是通过与环境交互,学习如何最大化累积奖励的方法
- 强化学习学习的是"好坏",监督学习学习的是"对错"
- 强化学习中没有标准答案,只有奖励反馈
- 核心要素:环境(Environment)、状态(State)、动作(Action)、奖励(Reward)、智能体(Agent)
73、请解释 Q-Learning 中的 Q 表是什么?它如何更新?
答案要点:
- Q 表是一个二维表格,行表示状态,列表示动作
- Q(s,a) 表示在状态 s 执行动作 a 的期望累积奖励
- 更新公式:Q(s,a) = reward + γ * max(Q(s', all_actions))
- γ 是未来奖励衰减因子,通常设置为 0.9-0.99
- 训练过程中不断更新 Q 表,使得智能体能够选择最优动作
B --> C[执行动作 获得 reward]
C --> D[观察新状态 s']
D --> E[查找 s' 中所有动作的最大 Q 值]
E --> F[计算 Q_target = reward + γ * max_Q]
F --> G[更新 Q 表]
G --> H[下一轮训练] -->
74、Q-Learning 中的 EPSILON 参数有什么作用?如何平衡探索与利用?
答案要点:
- EPSILON 是贪婪度参数,控制探索与利用的比例
- 如果 random() > EPSILON,选择 Q 值最大的动作(利用)
- 否则随机选择一个动作(探索)
- 典型值:EPSILON = 0.9,即 90% 利用,10% 探索
- 探索是为了发现更好的策略,利用是执行当前最优策略
75、DQN 与 Q-Learning 有什么区别?DQN 为什么需要经验回放池?
答案要点:
- Q-Learning 使用表格存储 Q 值,存在维度灾难问题
- DQN 使用神经网络近似 Q 值函数,可以处理高维状态空间
- 经验回放池(Replay Buffer)的作用:
- 打破样本间的相关性,提高训练稳定性
- 重复利用历史数据,提高样本利用率
- 通常使用 deque,设置最大容量(如 2000)
- DQN 的训练流程:采样轨迹→存入回放池→从池中随机采样 batch→训练网络
76、REINFORCE 算法的核心思想是什么?它与基于价值的方法有什么不同?
答案要点:
- REINFORCE 是基于策略梯度的算法,直接优化策略函数
- 不需要 Q 值或价值函数,直接输出动作概率分布
- 使用累积回报(Returns)作为梯度方向
- 如果累积回报为正,提高对应动作的概率;为负则降低
- 与价值方法(如 DQN)的区别:策略梯度直接优化策略,价值方法先学 Q 值再导出策略
- 必须等待 Episode 结束才能更新
77、请详细说明 A2C(Advantage Actor-Critic)算法的架构,并解释 Actor 和 Critic 的职责。
答案要点:
- Actor:策略函数 π(a|s),负责选择动作,输出动作概率分布
- Critic:价值函数 V(s),负责评估状态的好坏,输出期望回报
- 优势函数 Advantage = Returns - V(s),表示实际收益与预期收益的差值
- Actor Loss = -sum(log_prob * Advantage),提高高质量动作的概率
- Critic Loss = MSE(V(s), Returns),让价值预测更准确
- A2C 相比 REINFORCE 的优势:可以单步更新,不需要等 Episode 结束
- 网络结构通常共享底层特征提取层,分别输出动作概率和状态价值
78、请对比 PPO 和 A2C 算法的主要区别,解释 PPO 的裁剪机制是如何工作的。
答案要点:
- PPO 在 A2C 的基础上增加了裁剪机制,防止策略更新过大
- PPO 会多次利用同一条轨迹进行更新(K_EPOCHS),A2C 只利用一次
- Ratio = new_log_prob / old_log_prob,表示新策略与旧策略的概率比
- 裁剪公式:
- surr1 = ratio * advantage
- surr2 = clamp(ratio, 1-ε, 1+ε) * advantage
- actor_loss = -min(surr1, surr2)
- 当 ratio > 1+ε 时,更新被限制;当 ratio < 1-ε 时也被限制
- ε 通常设置为 0.2,限制策略单次更新的幅度
- PPO 的优势:更稳定、更适合大规模分布式训练
79、GRPO 算法的核心创新是什么?它如何替代 Critic 网络?
答案要点:
- GRPO(Group Relative Policy Optimization)通过"群体对标"方式计算相对优势
- 不需要 Critic 网络预测价值,简化了模型结构
- 核心流程:
- 对同一起点采样 G 条轨迹(GROUP_SIZE)
- 计算每条轨迹的累积回报 G_return
- 计算组内均值 mean_reward 和标准差 std_reward
- Relative Advantage = (G_return - mean_reward) / std_reward
- 优势:
- 减少网络参数,降低计算量
- 不需要训练价值网络,训练更简单
- 在 DeepSeek-R1 等大模型对齐中表现出色
- 仍使用 PPO 的裁剪机制,保证训练稳定性
80、请解释大模型训练的三个阶段,以及 RLHF 在其中的作用。
答案要点:
- 预训练(Pre-training):在海量无标注文本上训练,学习语言规律、知识、逻辑
- SFT(Supervised Fine-Tuning):在高质量指令-应答对上训练,学会遵循指令和格式
- RLHF(Reinforcement Learning from Human Feedback):基于人类反馈的强化学习,让回答"优秀"而不仅仅是"正确"
- RLHF 流程:
- 输入提示词给 SFT 模型,得到 n 个输出
- 人类标注人员按质量排序
- 训练奖励模型(Reward Model),输入句子输出分数
- 使用 PPO 或 GRPO 微调 SFT 模型,最大化奖励模型分数
- 比喻:预训练=博览群书,SFT=家教教作文,RLHF=作文比赛评分精进
81、在 DQN 训练中,detach() 的作用是什么?为什么在计算目标 Q 值时需要使用它?
答案要点:
detach()将张量从计算图中分离,不参与梯度传播- 在 DQN 中,目标 Q 值计算:q_target = reward + γ * max(q_next.detach())
- 原因:
- 防止目标网络参与梯度更新,导致训练不稳定
- q_next 是下一个状态的动作价值,应该是固定的参考值
- 只有主网络被更新,保持训练的稳定性
- 类似 DQN 中的目标网络(Target Network)概念,虽然这里是同一个网络但通过 detach 隔离
82、请比较 DQN、A2C、PPO、GRPO 的优缺点和适用场景。
答案要点:
- DQN:
- 优点:适合离散动作空间,实现简单
- 缺点:经验回放需要大量内存,训练不稳定
- 适用场景:Atari 游戏、简单决策任务
- A2C:
- 优点:可以连续动作,采样效率高
- 缺点:需要调节两个网络,训练复杂
- 适用场景:连续控制、机器人控制
- PPO:
- 优点:稳定、采样效率高、易于实现
- 缺点:需要计算优势函数,推理速度较慢
- 适用场景:通用 RL 任务、大模型对齐
- GRPO:
- 优点:不需要 Critic 网络,参数少,训练简单
- 缺点:需要多次采样,计算开销较大
- 适用场景:大模型对齐、DeepSeek-R1
83、在秘境寻宝游戏中,如果成功率只有 78%,可能的原因是什么?如何改进?
答案要点:
- 可能原因:
- EPSILON 太大,探索过度
- 训练轮数不足
- 奖励设计不合理(如每步扣分太少)
- 学习率设置不当
- 改进方法:
- 调整 EPSILON,如从 0.9 降到 0.95
- 增加训练轮数
- 优化奖励函数:给普通步骤设置负奖励(如 -0.1)鼓励走短路
- 使用更大的学习率或调整优化器参数
- 添加更多的陷阱或改变终点位置增加难度
84、请解释强化学习中的维度灾难问题,以及深度强化学习如何解决这个问题。
答案要点:
- 维度灾难:当状态或动作空间很大时,Q 表的存储和计算变得不可行
- 例如:图像状态有 256^H×W 种可能,Q 表无法存储
- 深度强化学习的解决方案:
- 使用神经网络近似 Q 值函数(DQN)
- 神经网络可以泛化到未见过的状态
- 参数数量与输入维度无关,只与网络结构相关
- 支持高维输入(如图像、文本)
- 其他技术:状态降维、动作离散化、分层强化学习
85、在 GRPO 微调 Qwen3 时,LoRA 的作用是什么?奖励函数如何设计?
答案要点:
- LoRA(Low-Rank Adaptation)的作用:
- 冻结原模型参数,只训练少量适配器参数
- 减少显存占用和训练时间
- 常见配置:r=8, target_modules=["q_proj", "k_proj", "v_proj"]
- 奖励函数设计示例:
def reward_func(completions, answer):
rewards = []
for content, ans in zip(completions, answer):
if ans in content:
rewards.append(1.5) # 答对给 1.5 分
else:
rewards.append(0.0)
return rewards
- 其他设计思路:
- 使用奖励模型打分
- 检查推理过程是否合理
- 对输出长度、格式等进行约束