每段信息尽量给出来源,没有详细总结的可以点进去看。图片尽量使用外链保留原链接,无法加载请挂梯子。
目录
LLM基础知识
占用显存
- 推理:
- 一个 float32 型数字占用 4 Byte,所以 1B 参数模型全精度部署占用 4e9 Bytes = 4 GB. 同理,半精度 fp16/bf16 每B参数占用2GB,int8 每B占用1GB,int4 0.5GB
- 前向计算开销:通常在模型权重的20%左右,因此总的显存占用在1.2倍的模型显存左右
- 训练:
- fp32所占的显存过大,fp16的精度往往达不到期望的程度,因此普遍使用混合精度训练:采用fp32、fp16和混合精度训练时,一般保存权重的时候是 fp16/bf16,fp32只用在累加算子上,防止误差的累积。
- 需要加载的有模型权重参数、梯度值、优化器状态(如Adam需要维护主权重、一阶动量和二阶动量,并且采用fp32形式保存参数,所以=3*4*参数量 Bytes)、激活状态()
- 强化学习训练:
- 根据算法不同还需要加载、更新 Reward Model、Reference Model等
大模型训练推理显存计算简介 - 知乎
https://zhuanlan.zhihu.com/p/624740065
熵与KL散度
信息熵(Entropy, $ H $ ) 衡量的是一个随机变量的不确定性。对于一个离散概率分布 $ P(X) $ ,其熵定义为:
其中, $ P(x) $ 是随机变量 $ X $ 取值 $ x $ 的概率, $ \log $ 通常以 2 为底(单位为比特)或以 $ e $ 为底(单位为纳特,nats)。
交叉熵(Cross-Entropy, $ H(P, Q) $ ) 衡量的是当实际分布为 $ P $ 时,用分布 $ Q $ 进行编码的期望信息量。定义如下:
如果 $ P = Q $ ,则交叉熵等于信息熵( $ H(P, P) = H(P) $ ),否则 $ H(P, Q) \geq H(P) $ 。
KL 散度(Kullback-Leibler Divergence, $ D_{KL}(P \parallel Q) $ )(或相对熵)衡量的是两个概率分布 $ P $ 和 $ Q $ 之间的差异,定义为:
KL 散度可以通过交叉熵与信息熵的关系表示:
这表明,KL 散度衡量了使用分布 $ Q $ 进行编码相比于最优分布 $ P $ 额外的编码代价(即冗余信息量)。由于交叉熵总是大于等于信息熵,因此 KL 散度总是非负的,即 $ D_{KL}(P \parallel Q) \geq 0 $ ,当且仅当 $ P = Q $ 时取 0。
Transformer
LLM可视化结构参见:https://bbycroft.net/llm
- Encoder:
- 由多层堆叠的 Self-Attention 和 Feed-Forward Network (FFN) 组成。
- 输入流程: 输入嵌入 → 位置编码 → 多头自注意力 → Add & LayerNorm → FFN → Add & LayerNorm。
- Decoder:
- 在 Encoder 基础上增加 Encoder-Decoder Attention 层。
- 自注意力层使用 Masked Attention(防止看到未来信息)。
- 输入流程: 输入嵌入 → 位置编码 → 掩码多头自注意力 → Add & LayerNorm → 编码器-解码器注意力 → Add & LayerNorm → FFN → Add & LayerNorm。
自注意力机制通过计算输入序列中每个位置与其他位置的 Attention Scores ,动态捕捉全局依赖关系。具体步骤:
- 将输入向量通过线性变换生成Query(Q)、Key(K)、Value(V)。
- 计算注意力分数:
其中 $ d_k $ 是Key的维度,用于缩放梯度。 - 多头注意力(Multi-Head)将Q、K、V分割到多个子空间并行计算,增强模型对不同语义关系的捕捉能力。
具体实现
- 残差连接:
- 作用:保留输入信息,缓解梯度消失问题,提高训练稳定性。
- FFN:
- 作用:Self-Attention 主要负责捕捉长距离依赖关系,但它本身是线性的,缺乏强大的特征提取能力。FFN 提供非线性变换,提高特征表达能力。对attention score先升维后降维让模型更好地整理、精炼已经被注意力提取的信息
- self attention是token mixer。FFN是channel mixer。也就是说attention会混合多个token的信息来提取特征,但每个channel(特征维度)保持独立。而FFN不混合token,而是混合不同的feature channel。两种计算操作不同的层面来提取特征,相得益彰。
- Layer Normalization (LN):
- 对同一样本的所有特征进行归一化。
- 作用:稳定训练,防止分布偏移,提高模型收敛速度。
- 公式:
其中 $ \mu, \sigma $ 是样本的均值和标准差, $ \gamma, \beta $ 是可学习参数。
- 其他归一化方式:
- Root Mean Square Layer Normalization (RMSNorm): 在 LN 的基础上不再计算均值,只计算均方根来衡量数据的平均幅度,加快计算速度,增加训练效率。当 $ \mu = 0 $ 时,LN == RMSNorm
- Batch Normalization (BN): 对不同样本的同一特征归一化,适合固定长度的数据(如图像)。
- encoder decoder 区别:
- Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作;第二个 MHA 根据 Encoder 的输出 C 计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。
常见问题
为什么要将 $ QK^T $ 进行scale
$ K^T $ 维度为 $ d_k $ , $ d_k $ 很大, $ QK^T $ 点乘结果方差过大,让softmax函数退化成argmax,导致梯度消失。
为什么要用 $ \sqrt{d_k} $ 进行scale
这是 $ QK^T $ 的方差,这样操作可以把它归一化成服从正态分布的量。
为什么用 LN 而非 BN?
- BN 不适用于不定长序列,但 NLP 中序列长度可变。LN 不受批次、序列长度影响。
- BN 会损失信息差异性,在 batch 中归一化,会抹平不同样本差异,而训练 LLM 需要不同信息的差异。
为什么要用MHA
一个 attention head 可能会过度将注意力集中于自身的位置,MHA 的输出包含不同子空间的编码表示信息,可以学到多维度的特征信息,从而增强模型的表达能力。同时 MHA 可并行计算,便于 Scale Up,提升计算效率。
与RNN相比的优势:
- 并行性:自注意力可同时计算所有位置的关联,便于Scale Up;而RNN是串行的,需逐步处理。(encoder的MHA和FFN是并行的,decoder在训练时可以,但由于mask的存在,推理阶段是串行的)
- 长距离依赖:无论序列长度,任意两位置的交互只需一步计算,避免RNN的梯度消失/爆炸问题。
为什么现在的LLM都是Decoder only的架构?
- Decoder架构主要是是为了预测下一个输出token,而这个任务更适配大模型的上下文学习。
- Pipeline Parallel 流水并行的训练并行度最高,它的条件是需要一个规整对称的、线性顺序的网络结构,而 Decoder-Only 的架构最为简单,方便于 Scale Up,基于 Scaling Laws 的实际训练成本最低。 Encoder-Decoder 和 Encoder-Only 架构的优势无法弥补训练成本的大幅提升。
Encoder 架构的问题:
- Encoder 的 attention 是 双向的,不能像 decoder 那样顺序处理 → 导致需要一次性处理整个输入 → 并行切不动。
- Encoder-decoder 通常等 encoder 处理完所有输入后,decoder 才能开始 → 串行依赖严重,无法并发。
- Encoder-decoder 有两个不同网络 → 不对称 → 切分困难,资源利用率低。
初始化方法
- Xavier/Glorot 初始化: 适用于 Sigmoid/Tanh 激活函数,使得前向传播时信号方差保持稳定,方差为 $ 2 / (n_{\text{in}} + n_{\text{out}}) $ 。
- He 初始化: 适用于 ReLU,保证前向和反向传播时信号不易消失或爆炸,方差为 $ 2/n_{\text{in}} $ 。
- 正交初始化: 保持矩阵正交性,防止梯度爆炸/消失。
全零初始化的缺陷
- 对称性问题: 所有神经元输出相同,反向传播时梯度对称,导致无法学习差异特征。
位置编码与位置外推
对于不带Attention Mask的纯Attention模型,它是全对称的。因此self-attention的运算是无向的,token的位置是无法分辨的信息,因此要给每个位置都加上一个位置编码向量。
位置外推能力是指模型处理超过其训练序列长度的输入序列的能力,从而能够在扩展序列上保留上下文和一致性,即 Train short, test long.
正弦函数位置编码
vanilla transformer使用正弦函数位置编码
- 绝对性: 每个token的向量唯一(每个sin函数的频率足够小)
- 位置向量的值是有界的,且位于连续空间中。模型在处理位置向量时更容易泛化,即更好处理长度和训练数据分布不一致的序列(sin函数本身的性质)
- 相对性: 不同的位置向量是可以通过一个旋转矩阵的线性转换得到的,即
- 距离衰减性: 两个位置编码的点积(dot product)仅取决于偏移量 $ △t $ ,内积越小,两个点距离越远
存在的问题:
- 对称性: 位置编码的点积是无向的,即 虽然位置向量的点积可以用于表示距离(distance-aware),但是它却不能用来表示位置的方向性(lack-of-directionality)
- 当位置编码随着input被喂进attention层时,采用的映射方其实是: 所以进入attention层之后,内积的距离意识(distance-aware)的模式遭到了破坏。
Transformer学习笔记一:Positional Encoding(位置编码) - 知乎
ALiBi
ALiBi工作于attention计算过程中:在计算attention score的时候,会对之前位置的分数按照与当前位置的差距进行不同程度的惩罚。具体来说,在qk点积时,增加携带位置信息的惩罚$softmax(q_iK^T+m\left[-(i-1),…,-2,-1,0\right])$
RoPE
RoPE是当前大模型标配的位置编码方式。这种编码不是作用在embedding的输入层,而是作用在与Attention的计算中。它使用旋转矩阵对绝对位置进行编码,同时在自注意力公式中结合了明确的相对位置依赖性。
具体来说,RoPE首先计算query矩阵和key矩阵,接着将每个位置的query和key向量的元素按照两两一组应用旋转变换,最后再利用注意力分数对value矩阵进行加权。
https://kexue.fm/archives/8265
https://zhuanlan.zhihu.com/p/863378538
其他长上下文方法
由于 KV cache 的存在,输入文本越长占用显存越多。在位置编码方式不变的前提下,可以通过模型优化来降低使用的显存,从而容纳更多上下文。具体见各种优化章节。
MoE
- 与稠密模型相比, 预训练速度更快
- 与具有相同参数数量的模型相比,具有更快的 推理速度
- 需要 大量显存,因为所有专家系统都需要加载到内存中
- 微调难度更大
因此为开源社区打造的 LLM 更倾向于稠密模型,为大公司打造的更倾向于 MoE。
而且稠密模型可以更新成 MoE,反之不行
混合专家模型主要由两个关键部分组成:
- 稀疏 MoE 层: 这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干”专家”(例如 8 个),通常是前馈网络 (FFN),也可以是更复杂的网络结构,甚至可以是 MoE 层本身
- 门控网络或路由: 这个部分用于决定哪些令牌 (token) 被发送到哪个专家。路由器由学习的参数组成,并且与网络的其他部分一同进行预训练。
流程:
- Gating / Router:
如果所有的令牌都被发送到只有少数几个受欢迎的专家,那么训练效率将会降低。为了缓解这个问题,引入了一个 辅助损失,旨在鼓励给予所有专家相同的重要性。这个损失确保所有专家接收到大致相等数量的训练样本,从而平衡了专家之间的选择。 - Dispatch: 将输入token根据上一步得到的权重分发给对应的专家FFN
- Combine: 最终输出是各个专家的输出根据 gating score 的加权求和
稀疏混合专家模型 (MoE) 适用于拥有多台机器且要求高吞吐量的场景。在固定的预训练计算资源下,稀疏模型往往能够实现更优的效果。相反,在显存较少且吞吐量要求不高的场景,稠密模型则是更合适的选择。
混合专家模型(MoE)详解
Mixture of Experts in LLMs Explained
各种优化
- KV cache
- KV缓存通过存储之前生成的tokens的键向量(key vector)和值向量(value vector),避免了重复计算。当生成新token时,只需使用缓存中的键向量和值向量进行计算。这是一个用存储换效率的方案。从数学来说,KV缓存需要O(N^2)的空间复杂度。
- 好处是计算复杂度从token长度的平方降低到线性,显著提高了推理效率。在处理长序列或大批次数据时,效果尤其显著。
- 坏处是KV矩阵占用的缓存大小与token长度的平方成正比:当token长度增加时,GPU缓存占用急剧上升。
- MHA MQA GQA (三字狂魔)
- MLA
- Linear Attention
- 注意力机制复杂度 n^2 的来源:由于有 softmax 存在,需要先计算 Q×K^T 得到一个 n*n 的矩阵,再右乘一个 n×d 大小的 V ,因此时间复杂度 O(n)= kn^2。如果去掉 softmax 就可以先算 K^T×V ,大小 d×n 的 乘 n×d 的 得到 d×d 的矩阵,再左乘 n×d 的 Q, 时间复杂度 O(n)= nk^2
- 线性Attention的探索:Attention必须有个Softmax吗? - 科学空间|Scientific Spaces
- Sparse Attention
- 只计算距离当前相对距离不超过k的、相对距离为k,2k,3k,…位置的注意力分数,让 Attention 具有“局部紧密相关和远程稀疏相关”的特性,因为真正需要密集的长程关联的任务事实上是很少的。
- https://spaces.ac.cn/archives/6853#Sparse%20Self%20Attention
- 量化、压缩模型
评估
Perplexity PPL 困惑度(预训练阶段)
对于一个随机变量,
对于两个分布之间,
其中, $ H(p_r, p_\theta) $ 是真实分布 $ p_r $ 和模型分布 $ p_\theta $ 之间的交叉熵:
因为我们只有给定语料 $ S $ 没有真实分布 $ p_r $ ,所以我们假设 $ p_r = 1/n $ ,因此得到
实际计算时为了节省计算量不计算n个,采用滑动窗口:
BLEU
decoding 策略
- top-p: 仅从累计概率达到 p 的候选 token 中进行采样,去掉尾部低概率 token。
- top-k: 仅从概率最高的 K 个 token 中随机采样,忽略其他候选 token。
- temperature: $ P_i = \frac{\exp(\frac{\log P_i}{T})}{\sum \exp(\frac{\log P_j}{T})} $
- $ T > 1 $ :概率分布变得更均匀,增加随机性,文本更有创造力,但可能不连贯。
- $ T < 1 $ :概率分布更陡峭,模型更倾向于选择最高概率的 token,使输出更确定,但可能缺乏多样性。
- $ T=0 $ 时,等价于贪心(Greedy Decoding)。
- beam-search: 在每一步保留 B(beam size)个最有可能的序列,并扩展它们,最终选择得分最高的序列。适用于翻译等需要高质量、确定性的任务,但可能导致文本缺乏多样性。
- Best-of-N: 生成 N 个候选文本序列,然后选择得分最高的一个作为最终输出。
- Majority Vote: 生成多个候选文本序列,对它们进行投票,选择出现最多的 token 作为最终输出。
LoRA
大型预训练模型参数量巨大,但在特定下游任务上,并不是所有参数都需要更新。LoRA 借鉴了这一思想,提出了一种低秩分解(low-rank decomposition)的方法来更新模型参数,从而大幅减少需要微调的参数量。
具体来说,对于预训练模型中的任何一个参数矩阵 $W_0 \in \mathbb{R}^{n \times m}$,LoRA 不直接对 $W_0$ 进行微调,而是引入一个低秩矩阵的增量 $\Delta W$:
其中 $A \in \mathbb{R}^{n \times r}$ 且 $B \in \mathbb{R}^{r \times m}$,而 $r$ 是一个非常小的秩(rank)。
因此,微调后的新矩阵 $W$ 可以表示为:
在微调过程中,我们固定原始的 $W_0$ 参数,只训练 $A$ 和 $B$ 这两个小矩阵。由于秩 $r$ 远小于 $n$ 和 $m$,所以 $A$ 和 $B$ 的总参数量远小于 $W_0$ 的参数量,从而实现了高效的微调。
https://kexue.fm/archives/9590
LLM RL
典型RL中智能体与环境的交互过程如下:
- 在 $ t $ 时刻,环境的状态为 $ S_t $ ,达到这一状态所获得的奖励为 $ R_t $
- 智能体观测到 $ S_t $ 与 $ R_t $ ,采取相应动作 $ A_t $
- 智能体采取 $ A_t $ 后,环境状态变为 $ S_{t+1} $ ,得到相应的奖励 $ R_{t+1} $
智能体在这个过程中学习,它的最终目标是:找到一个策略,这个策略根据当前观测到的环境状态和奖励反馈,来选择最佳的动作。
什么任务适合用 RL 做?
- 对于存在 GroundTruth 信号的任务(数学etc)来说,有一个明确的好答案标准、存在上限的任务适合 SFT ;难以标注(或定义)好答案,但很容易进行判别结果是否正确的任务,适合 RL。
- 对于不存在 GroundTruth 信号的任务(创作)来说,没有理想标准(或者标准更迭很快)、存在一些数据不一致性的场景适合 RL 。虽然我们不知道这个问题的最完美的答案是怎样的,但我们总能在当前的几个候选答案里找出最好的那一个。
RLHF
核心流程:
- 预训练:用大规模文本数据训练初始语言模型(LM)。
- 奖励模型训练:通过人类标注的偏好数据(如对多个回答排序),训练奖励模型(RM)。
- 强化学习微调:使用PPO等算法,以RM为奖励信号优化LM,使其生成更符合人类偏好的输出。
奖励模型
我们希望获得人类偏好的分布,x代表输入的prompt,两个不同的输出y1,y2,假设y1比y2好,这是个概率,我们希望最终的模型是完美的,每进一个x,能够打分:
p 表示在理想情况下,模型输出 $y_1$ 优于 $y_2$ 的概率。
r 是最优的(optimal)、无法直接获得的奖励函数。
这就是 Bradley-Terry模型。假设对于问题 x
,奖励模型给回答 y1
打了3分,给回答 y2
打了1分。
那么,模型预测人类认为 y1
比 y2
好的概率就是:
这意味着,模型有88%的把握认为人类会选择 y1
而不是 y2
。
- 对同一提示,标注员对多个模型生成的回答进行排序(如A > B > C),构造为三元组 $ (x, y_w, y_l) $ ,其中 $ y_w $ 是更优的回答。
- 我们通常使用最大似然估计(Maximum Likelihood Estimation)的原则来构建损失函数。通俗地说,就是“让已经发生的事情(即我们收集到的人类偏好数据)在模型看来,发生的概率最大”。对于一个偏好数据
(x, y_w, y_l)
,我们希望最大化模型预测它发生的概率,也就是最大化上面的 $P^(y_w \succ y_l\mid x)$。 - 在实践中,直接最大化概率的乘积(对于整个数据集)在计算上很困难,所以我们通常会:
- 取对数(Logarithm),将乘积问题变为加法问题,这不改变最优解。这就是对数似然(Log-Likelihood)。
- 将“最大化”问题转化为等价的“最小化”问题,只需在前面加一个负号。
- 这样,我们就得到了奖励模型最常用的损失函数(Loss Function)—— 负对数似然损失(Negative Log-Likelihood Loss)。
- 或者用sigmoid函数写作
- reward model通过SFT后的LLM加一层线性层去初始化
LLM 中主流的 RLHF 方向分为两大路线:
以 PPO 为代表的 On-Policy 路线:训练过程中,需要模型亲自参与”生成”来收集新的数据样本。
以 DPO 为代表的 Off-Policy 路线:训练过程中,不需要”在线”生成,更多依赖事先收集到的(或由别的策略产生的)数据进行离线学习。
https://mp.weixin.qq.com/s/S72LO26IsZ8AED8sQKIWnQ
https://zhuanlan.zhihu.com/p/675329917
从策略梯度算法到 PPO
1. 策略梯度
原始策略梯度算法 (REINFORCE / Vanilla Policy Gradient)奠定了后续所有算法的基础。
核心思想: 直接对策略本身进行建模和优化。如果一个动作序列(Trajectory)最终获得了很高的回报,那么我们就调整策略,让策略网络在遇到这些状态时,更有可能输出这些带来高回报的动作。反之亦然。
目标函数: 算法的目标是最大化期望总回报(Expected Total Reward)。我们用 $\theta$ 表示策略网络 $\pi_\theta$ 的参数,$\tau$ 表示一条完整的轨迹($s_0, a_0, r_0, s_1, a_1, r_1, \dots$),$R(\tau)$ 是这条轨迹的总回报。目标函数为:
这个公式的含义是,在当前策略 $\pi_\theta$ 下,采样很多轨迹,计算这些轨迹总回报的平均值,我们希望这个平均值越大越好。
梯度与损失函数: 目标函数 $J(\theta)$ 是通过与环境进行复杂的、随机的交互产生的,它不是一个关于 $\theta$ 的简单、可直接求导的函数。奖励信号来自环境,而不是来自模型内部。我们无法像在监督学习中那样,直接通过奖励对模型参数进行反向传播。直接对 $J(\theta)$ 求导很困难,因为期望的概率分布 $P(\tau; \theta)$ 也依赖于 $\theta$。通过“策略梯度定理”(Policy Gradient Theorem),我们可以得到一个可计算的梯度形式:
在实践中,为了减少方差,我们不会用整条轨迹的总回报 $R(\tau)$ 来评估时间步 $t$ 的动作 $a_t$,因为在 $t$ 时刻的动作并不会影响 $t$ 之前的奖励。因此,我们使用“未来回报总和”(Reward-to-go),即从当前时刻 $t$ 到轨迹结束的总回报 $G_t = \sum_{k=t}^{T} \gamma^{k-t} r_k$。
梯度更新就变成了:
为了使用梯度下降(最小化)来优化,我们构造一个损失函数,通常是目标函数的负数:
这个损失函数直观地告诉我们:如果 $G_t$ 是正的(未来回报高),就最小化 $-\log \pi_\theta$,即增大 $\log \pi_\theta$,也就是增大动作 $a_t$ 的概率;如果 $G_t$ 是负的(未来回报低),就减小动作 $a_t$ 的概率。
主要问题: 高方差 (High Variance)。$G_t$ 的值完全依赖于一次采样的结果,波动性非常大。可能某次采样中,一个不错的动作因为后续随机性导致了不好的结果,从而得到了负向更新。这种噪声使得训练过程非常不稳定,收敛缓慢。
2. Actor-Critic (AC)
Actor-Critic 旨在解决 REINFORCE 的高方差问题。
核心思想: 将策略梯度分成两个部分:
- Actor (演员): 策略网络 $\pi_\theta(a|s)$,负责选择动作,和 REINFORCE 中的策略网络一样。
- Critic (评论家): 价值网络 $V_\phi(s)$ 或 $Q_\phi(s,a)$,负责评估当前状态或状态-动作对的好坏,它的作用是为 Actor 的行为打分。
改进之处: AC 不再使用随机性很强的蒙特卡洛采样回报 $G_t$ 来作为权重,而是使用 Critic 网络给出的一个更稳定的价值评估。具体来说,我们引入优势函数 (Advantage Function) $A(s_t, a_t)$ 来取代 $G_t$。
优势函数的直观含义是:在状态 $s_t$ 下,采取动作 $a_t$ 比通常情况(平均水平 $V(s_t)$)要好多少。这比单纯的 $G_t$ 是一个更好的基准(Baseline),因为它减去了状态本身价值的干扰,只关注动作的相对好坏,进一步降低了方差。
目标与损失函数:
- Actor 的损失函数: 形式上和 REINFORCE 很像,只是用优势函数 $A(s_t, a_t)$ 替代了 $G_t$。在实践中,优势函数通常用 TD-error $\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)$ 来近似,因为它是一个对优势函数的无偏估计。
- Critic 的损失函数: Critic 的目标是准确地学习价值函数 $V_\phi(s)$。它通过最小化 TD-error 的均方误差来更新。
主要问题: 尽管降低了方差,但 Actor 的更新步长(学习率)非常敏感。如果某次更新的步子迈得太大,可能会导致策略突然变得很差,并且很难再恢复过来。学习过程仍然不够稳定。
3. TRPO
TRPO (Trust Region Policy Optimization)直接解决了 AC 算法中更新步长难以确定、策略容易“崩溃”的问题。
核心思想: 我们希望策略向好的方向更新,但又不希望新策略和旧策略偏离太远,以保证更新的稳定性。TRPO 将这个思想数学化,定义了一个“信赖域”(Trust Region),强制要求每次更新后的新策略都位于这个域内。
目标函数: TRPO 的目标函数是最大化一个“代理目标函数”(Surrogate Objective),它衡量了新策略 $\pi_\theta$ 相对于旧策略 $\pi_{\theta_{old}}$ 的改进程度。令概率比率 $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$。
这里的比率 $r_t(\theta)$ 是重要性采样(Importance Sampling)的权重,$\hat{A}_t$ 是优势函数的估计。
改进之处 (核心): TRPO 的精髓在于它不是直接最大化这个目标函数,而是把它变成一个带约束的优化问题:
这个约束使用 KL 散度(KL Divergence)来衡量新旧策略的差异,并要求这个差异不能超过一个很小的阈值 $\delta$。这保证了策略更新的平稳性,避免了灾难性的更新。
损失函数: TRPO 没有一个简单的损失函数。它是一个约束优化问题,需要用到共轭梯度法(Conjugate Gradient)等二阶优化方法来求解,计算非常复杂。
主要问题: 计算复杂且难以实现。TRPO 涉及复杂的二阶优化,与现代深度学习框架(如 TensorFlow, PyTorch)中常用的一阶优化器(如 Adam)不兼容,实现起来非常困难。
4. PPO
PPO (Proximal Policy Optimization) 的目标是实现 TRPO 的稳定更新思想,但使用更简单、易于实现的一阶优化方法。
核心思想: TRPO 的 KL 散度约束太复杂,我们能否直接修改目标函数,使得在优化这个函数时,就能自然地达到限制策略更新幅度的效果?PPO 通过“裁剪”(Clipping)来实现这一点。
目标函数/损失函数 (PPO-Clip): PPO 使用的目标函数从 TRPO 改进而来,创新地增加了裁剪机制。令概率比率 $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$。
这个公式是 PPO 的灵魂:
- $\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)$: 强制将概率比率 $r_t$ 裁剪到 $[1-\epsilon, 1+\epsilon]$ 的区间内($\epsilon$ 是一个超参数,如 0.2)。
- $\min(\dots, \dots)$:
- 当优势 $\hat{A}_t > 0$ 时(即这是一个好动作),目标函数变为 $\min(r_t \hat{A}_t, (1+\epsilon)\hat{A}_t)$。这意味着 $r_t$ 的增长被限制在 $1+\epsilon$,防止策略更新过于激进,过分地增加这个好动作的概率。
- 当优势 $\hat{A}_t < 0$ 时(即这是一个坏动作),目标函数变为 $\max(r_t \hat{A}_t, (1-\epsilon)\hat{A}_t)$(因为 $\hat{A}_t$ 是负数,min 相当于 max)。这限制了 $r_t$ 的减小不能低于 $1-\epsilon$,防止策略为了避免一个坏动作而过度改变。
通过这种方式,PPO 将 TRPO 的硬约束(KL散度)变成了一种软约束,直接体现在了目标函数中。这个 $L^{CLIP}(\theta)$ 可以直接用 Adam 等一阶优化器进行最大化(或者最小化其负数)。
改进之处: PPO 在实现 TRPO 稳定性的同时,大大简化了算法的实现难度和计算开销,使其成为当前最流行、最常用的强化学习算法之一。
动手学强化学习
Spinning Up in Deep RL
https://zhuanlan.zhihu.com/p/614115887
PPO
概念与组成
当下的状态和动作会影响到未来的状态和动作,进而影响到未来的整体收益。因此要将未来的收益纳入当前的考虑。因此 $ V_t=R_t+γ V_{t+1} $
其中:
- $ V_t $ : t 时刻的(预期)总收益(return),注意这个收益蕴涵了”即时”和”未来”的概念
- $ R_t $ : t 时刻的即时收益
- $ V_{t+1} $ : t+1 时刻的(预期)总收益。而 $ V_{t+1} $ 对 $ V_t $ 来说就是”未来”。
- $ γ $ :折扣因子。它决定了我们在多大程度上考虑将”未来收益”纳入”当下收益”。
在 t 时刻,模型产出token $A_t$ 对应着的即时收益为 $R_t$,总收益为 $V_t$ ,模型的状态从 $S_t$ 变为$S_{t+1}$
如上图,在RLHF-PPO阶段,一共有四个主要部分,分别是:
- Actor Model (Policy Model):演员模型,这就是我们想要训练的目标语言模型
- Reward Model:奖励模型,”裁判”,它的作用是计算最终收益 $ r(s, y) $ 。参数冻结
- Critic Model (Value Model):评论家模型,”教练”,它的作用是预估某一时刻的总收益 $ V_t $ 。实际上只有模型响应生成结束后才能由 Reward Model 判断对错,因此训练过程奖励是稀疏的, Critic Model 就是要把稀疏的奖励信号换算成每一步的收益,方便训练。需更新参数
- Reference Model:参考模型,就是保存一个没有经过 RL 的模型作为参考。它的作用是在RLHF阶段给语言模型增加一些”约束”,防止语言模型训歪(很容易偏离原本的分布,朝不受控制的方向更新,效果可能越来越差)。参数冻结
(四大天王有五个不是常识吗)Generalized Advantage Estimation (GAE) 将大模型完整回答的奖励$ r(s, y) $ 以及预估收益 $ V_t $换算成每个 token 的收益 $R_t$
训练流程
- 策略模型 (Policy LM) 根据上下文 $s$ 生成完整的回应 $y$。
- 奖励模型 (Reward Model) 评估这些回应,并为其打出奖励分数 $r(s,y)$。
- 广义优势估计 (GAE) 结合奖励分数和价值模型的估计值,来计算:
- 每个词元 (token) 的回报 (Returns) $R_t$(用于训练价值模型)。
- 每个词元选择的优势 (Advantages) $Adv(t)$(用于训练策略语言模型)。
- 更新价值模型 (Value Model),以提升回报 $R_t$ 和优势 $Adv(t)$ 估计的准确性。
- 使用优势值更新策略语言模型 (Policy LM),以优化其生成回应的能力。
*: 图中 SFT model 指 reference model
公式推导
第一步:确立总目标函数
我们从 RLHF 的最终优化目标出发。这是一个理论上的期望,我们希望最大化它:
即
这个目标是针对完整生成序列的,无法直接用于 PPO 这种按步更新的算法。实际上因为不可能用整个序列计算 KL散度(指数时间复杂度),我们将KL分到每个token计算一次,再加和。
第二步:将总目标分解为每一步的奖励信号
为了让 PPO 算法能够“理解”这个目标,我们必须将其分解为在每个时间步(time-step)t 都能获得的奖励信号 $R_t$。
其中 $$
\begin{aligned}
KL[Actor(X)||Ref(X)] & = \mathbb{E}_{x \sim Actor(x)} \left[ \log \frac{Actor(x)}{Ref(x)} \right] \\
& = \text{log-probs} - \text{ref-log-probs}
\end{aligned}
这个公式的直观含义是:用一个“权重”来决定是否要增加动作 $(a_t|s_t)$ 的概率。
第四步:用优势函数作为“权重”
理论证明,最好的“权重”是优势函数 (Advantage Function) $\text{Adv}_t$,因为它能减小方差,让训练更稳定。优势函数的计算完全基于第二步中定义的奖励信号 $R_t$。
于是,我们的策略梯度更新公式就具体化为:
$\text{Adv}_t$ 中已经包含了来自总目标函数的所有信息(奖励模型分数和KL惩罚)。
GAE 计算 Advantage 的过程:
意为采取 $ A_t $ 后与不采取相比增加的总收益,再加上对未来的收益。最后一个时刻$t=T$时未来收益$V_{T+1}$和未来优势$\text{Adv}_{T+1}$都是0,因此 $ \text{Adv}_T = R_t - V_t$,由此可以从后往前计算 $\text{Adv}$
第五步:构建 actor model 的损失函数
在深度学习框架中,我们习惯于通过梯度下降最小化一个损失函数。而策略梯度 $\nabla_\theta J(\theta)$ 是我们需要上升 (ascend)的方向。
我们只需简单地在梯度表达式前加上一个负号,就可以将其转换为一个损失函数:
而如果我们想让一个batch的经验值被重复使用ppo_epochs次,等价于我们想要Actor在这个过程中,模拟和环境交互ppo_epochs次,每次都能吐出一些新数据出来。我们只要尽量保证每次更新后的 $Actor_{new}$ 能模仿最开始的那个 $Actor_{old}$(这里涉及“重要性采样”):
这个公式从直觉上也可以理解成:在Actor想通过模拟交互的方式,使用一个batch的经验值更新自己时,它需要收到真正吃到batch的那个时刻的Actor的约束,这样才能在有效利用batch,提升训练速度的基础上,保持训练的稳定。
另外,PPO-clip还加入了Clip机制用来限制策略更新幅度,防止新策略与旧策略差异过大。
其中 $r_t(\theta)=\frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)}$,$ \epsilon $ 是剪切阈值(如0.2), $ \text{Adv}_t $ 是优势函数估计。
在实际计算时,我们用一批采样数据的均值来代替期望 $\mathbb{E}$,得到最终用于代码实现的 actor_loss。
第六步:构建 critic model 的损失函数
以上我们用算出来的 $R_t, V_t$ 更新了 actor model 的参数,其实这些还需要用来训练 critic model:
每次迭代用 MSE 计算 critic model 的预测和 GAE 给出的预测的差值更新 critic model,让它对收益的估计越来越准确。每个 batch 更新,batch 内 ppo_epochs 之间不变。
Critic Loss 也采用了裁剪机制来限制值函数的更新幅度,以防止训练过程中的不稳定。
其中:
- $V_\phi(s_t)$:当前值网络对状态 $s_t$ 的估计。
- $R_t$:目标回报(实际回报)。
- $V_\phi(s_t)^{\text{clipped}}$:裁剪后的值函数。它的计算方式如下:其中,$V_\phi(s_t)^{\text{old}}$ 是前一次的估计值,$\epsilon$ 控制裁剪的范围。
PPO相比传统策略梯度方法(如TRPO)有哪些改进?
改进:
- 简化实现:PPO通过剪切(Clip)替代TRPO的复杂约束优化,避免计算二阶导数。
- 数据效率:支持多次使用同一批数据更新策略(通过重要性采样)。
图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读 - 知乎
https://zhuanlan.zhihu.com/p/7461863937
https://zhuanlan.zhihu.com/p/19223907990
Reinforcement Learning With Human Feedback (RLHF) with Proximal Policy Optimization (PPO)
DPO
核心思路:对于同一个问题(prompt),有一个好答案/坏答案的数据对(pair-wise data),让策略函数(也就是大模型)离好答案的分布概率更近,离坏答案的分布概率更远。
DPO 原始论文中的概括的流程如下:
构建偏好数据集:对于每一个提示(prompt)$x$,从参考策略 $\pi_{\mathrm{ref}}(\cdot \mid x)$ 中采样生成两个补全(completion)$y_1$ 和 $y_2$。然后,根据人类的偏好对它们进行标注,从而构建一个离线的偏好数据集 $\mathcal{D} = \{ (x^{(i)}, y_w^{(i)}, y_l^{(i)}) \}_{i=1}^N$。其中 $y_w$ 代表更受偏好的回答(winner),$y_l$ 代表较差的回答(loser)。
优化模型:在给定的参考策略 $\pi_{\mathrm{ref}}$、数据集 $\mathcal{D}$ 和期望的超参数 $\beta$ 的条件下,通过最小化损失函数 $\mathcal{L}_{\text{DPO}}$ 来优化语言模型 $\pi_\theta$。
如何初始化策略模型
在实践中,研究者们更倾向于重用公开可用的偏好数据集,而不是自己生成样本并收集人类偏好。由于这些公开的数据集通常是使用一个经过监督微调(SFT)的模型 $\pi_{\text{SFT}}$ 进行采样的,因此,当 $\pi_{\text{SFT}}$ 模型可用时,我们通常将参考策略初始化为 $\pi_{\mathrm{ref}} = \pi_{\text{SFT}}$。
然而,当生成数据集的 $\pi_{\text{SFT}}$ 模型不可用时,我们会通过最大化更优补全 $(x, y_w)$ 的对数似然来初始化参考策略 $\pi_{\mathrm{ref}}$,即:
这个过程有助于缓解那个无法获得的、真实的参考分布与 DPO 实际所使用的参考策略 $\pi_{\mathrm{ref}}$ 之间的分布偏移问题。
DPO与PPO在优化目标上有何本质区别?DPO如何避免显式奖励模型的训练?
标准答案:
区别:
- PPO:依赖奖励模型提供标量奖励,通过强化学习更新策略。
- DPO:直接将偏好数据映射到策略优化目标,通过隐式奖励建模绕过显式RM训练。
DPO实现:
- 假设偏好数据服从Bradley-Terry模型,通过极大似然估计直接优化策略: 其中 $ \pi_{\text{ref}} $ 是参考策略(如初始LM), $ \beta $ 控制KL正则化强度。
为什么DPO只需要一个模型,表现(收敛性、易训性)却比PPO好?以下有一些猜测
- 奖励函数只传递单一维度,但好坏是多维度决定的;reward function过度压缩信息,dpo把两个信息挤压在一起,传输效率更好
- The Bitter Lesson:寻找捕捉复杂性的元方法,靠数据量 Scale Up 取胜而不是人工引入新的机制(Reward Model)
https://zhuanlan.zhihu.com/p/721073733
https://www.bilibili.com/video/BV1dWB2Y4EcG/?p=9
Deepseek R1 与 GRPO
Deepseek R1厉害在哪?
Deepseek R1 Zero 成功解决了不依赖大量标注reasoning数据来教授LLM一步步思考的挑战,仅通过RL让模型自己发现长思考的技能。
Deepseek不使用可能引起 reward hacking 的复杂 reward model,而是使用基于规则的、可以自动验证的 reward model ,自动验证避免了人工或LLM验证引起的错误、偏差或幻觉。
GRPO
GRPO 由 PPO 改进而来:它不是使用价值模型来估计优势计算的基线,而是为每个输入对多个输出进行采样,并使用每组内的平均奖励作为基线。这意味着,如果为数学问题生成 64 个输出,其中一个获得 0.9 的奖励,而组平均值为 0.7,则该解决方案将获得 0.2 的正优势。这种基于组的方法提供了一种自然的方法来确定输出是好于还是差于平均值,而无需单独的值模型进行预测。最终,模型学会了纠正自身错误的能力,例如“等等,我注意到上一步有错误…”这里的优势会更高。
DeepSeek R1 and R1-Zero Explained
Reward Hacking
- 如何避免?
- 对于针对系统设计的 reward hacking,将 Agent 沙盒化,不让它接触到reward function
- 多种奖励的组合。结合不同类型的奖励可能使其更难被 hacking
- 像 Deepseek R1 不使用可能引起 reward hacking 的复杂 reward model,而是使用基于规则的、可以自动验证的 reward model
增强模型推理能力的方法
- 推理时间扩展: 思维链提示、多数投票、Best-of-N
- 强化学习(RL): Deepseek R1 Zero
- SFT+RL: Deepseek R1
- 蒸馏: Deepseek R1 Distill
【LLM】增强大模型推理能力的四种范式_大模型的推理、微调、对齐、蒸馏-CSDN博客
大模型推理能力提升的一个技术总结 - 知乎
Agent
OpenAI提出的智能体五层级演进过程:
第一阶段,知识获取智能体。模型主要通过人机对话的方式进行信息交互与知识传递,表现为一种响应式的知识库,如ChatGPT的早期版本。(因此非推理大模型其实就是一种 RAG 系统,从训练的模型参数中检索世界知识;外置知识库的 RAG 系统效果不好,只是对大模型的拙劣模仿)
第二阶段,认知推理智能体。模型能力深化,能够处理复杂的认知任务,进行深度逻辑推理与抽象思考,从而胜任奥林匹克数学竞赛、科学研究推导等高级智力活动,成为增强人类智识的”智能助手”。如 OpenAI o3.
第三阶段,自主执行智能体(我们在这)。模型具备在真实或虚拟环境中自主完成任务的能力,如Claude Code。它不仅限于代码生成等单一指令,而是能够形成”感知-规划-行动-反馈”的闭环,展现出初级的能动性(Agency)。此阶段的能力在2025年2月于国际上达到了技术应用的引爆点。
第四阶段,创新发现智能体。模型的能力从任务执行跃迁至知识创造,能够生成新颖的、具有突破性的见解或成果,推动科学发现与技术创新,标志着其从”执行者”向”创新者”的角色转变,展现出真正的创造力。
第五阶段,协同多智能体系统。模型发展为复杂的生态系统,其中多个独立的智能体可以进行自主的分工、协作与协同进化。它们能够构建起虚拟的组织架构,跨领域合作,解决大规模、系统性的复杂问题。
个人面经
最终去向 奇绩创坛 行研-大模型算法实习生(模型评测方向)
- 自我介绍
- 手撕代码 P1112 波浪数 - 洛谷
- 对大模型有哪些了解(提到了Deepseek)Deepseek R1 的原理、MLA和MTP是否了解(并不了解)、其他魔改 attention 计算的方法(本来想说 linear attention 结果忘了……)
- 对同一个基座模型用三种方法训练得到 A, B, C 三个模型,输入“静夜思的作者是谁,请用一句话回答”。A 回答作者是李白,随后用很长的篇幅展开介绍李白; B 不断重复“静夜思的作者是李白”;C 回答“静夜思的作者是杜甫”。分析这几个模型分别存在的问题,给出可能的解决方案。(A不能遵循指令,需要在对应数据集上SFT、RL中给一个长度惩罚?;B对EOS的学习不够,需要调整repetition penalty、数据集长度过短,也可能是模型上下文长度太小?;C产生幻觉,需要充分学习语料、用RAG辅助、引入思维链)
- 长思考缓解幻觉问题是什么原理,在思考过程中回忆起知识,还是通过思考去逼近真实答案
- 9.9 和 9.11 哪个大、Strawberry有几个r 这种问题为什么会难住大模型
- 推理模型目前还有哪些方面可以优化(思考时间太长、很多思考没必要)
反思:
- 简历
OFFER
聚流沙科技 大模型RAG算法
初创小企业,线下面的,自我介绍完只问了半小时简历项目
一面挂
Mininax 算法
- 自我介绍
- 手撕斜向蛇形矩阵,有点坑了,做了20分钟
- Python 和 C 的区别,原理上讲为什么 C 速度快
- 问对 OS 有哪些了解(没有太多了解)
- 简单问了问项目
给我干哪来了,这还是算法岗吗?准备半天的算法是一点没问啊
一面挂
奇岱松科技
约50人 to G 小厂
- 自我介绍
- 讲讲 o3 o4mini (还没有仔细看)
- 深挖项目,评测指标用的什么,和同类模型对比
- 如果要构建灾后图像识别数据集应该怎么构建?数据量多少?怎么获取?
- 能否接受标数据的工作?(回答只要不占工作大部分就行)对哪方面工作感兴趣?
一面挂
商汤一面
- 自我介绍
- 深挖项目,项目具体工作、评测指标
- Transformer 相比 CNN 在处理图像方面的优势是什么
- 多模态模型用过哪些
- 是否自己训练过大模型?(只知道原理)讲一讲原理(三阶段,RL提到Deepseek)讲讲Deepseek
- 代码题
商汤二面
拷打项目,追问简历上项目所涉及的所有技术细节,寄
中科闻歌
- 自我介绍
- 项目
- 没了
小米语音算法
- 自我介绍
- 项目
- 是否了解语音相关技术(了解,事前专门看了较新的语音模型如MiniMax Speech 02)
- 你的背景和我们的岗位要求不符(那你捞我的简历就是为了给我撂下一句这个吗?)