# 4.llm\_note

参考<https://github.com/changyeyu/LLM-RL-Visualized>，对应的书《大模型算法：强化学习、微调与对齐》）

## 概述

llm训练时的teacher forcing机制：生成第i个token的输入：

* 推理时：是模型生成的第0到第i-1的序列
* 训练时：训练数据中实际的token序列

例如输入的是12345，输入1的时候生成了8，那要预测3的时候，输入的就是18；而训练时输入的还是12

## SFT

### lora

* lora的核心思想：微调前后模型的参数差异具有低秩性，所以可以用A和B两个矩阵来表示，这两个矩阵的秩是$$lora\_{rank}$$
* A一般是随机初始化，**B用0初始化**或者用很小的随机数初始化，为了保证在训练初期，lora不会对原始输出造成太大扰动
* 参数$$lora\_{alpha}$$用于缩放Lora输出，即$$W\_{merge}=W+A*B*lora\_{alpha}/lora\_{rank}$$
* 学习率一般开始的时候比较小，后面可以再调整，不过如果lora\_alpha较大，可以适当减小学习率
* 在推理的时候，可以先进行融合，其实就是算好$$W\_{merge}$$，推理的时候直接用

### prefix-tuning

大概是在prompt的最前面加若干个虚拟token，然后这部分有自己的参数（最开始的emb，还有后面的k和v，这里的k和v都是2个mlp，先映射到小一点的d'，再映射到d），总的可训练参数量参考：

![](/files/vk1ReTvyS8ON8obg1Ms1)

### sft loss与logsoftmax

* LM head：从hidden dim映射到vocab size
* 计算时label是shift得到的(左移一位，因为要预测next item)
* 正常是先过LM head，算出logit矩阵，然后每个位置对所有词表里的词算softmax得到p，再去算交叉熵（只有label那个字有log(p)），所以就是log(softmax(x))
* prompt没有loss，只有response有loss，假设response长度为k，假设第i个位置对应的label是j，那交叉熵是$$-1/k\sum\_{i=1}^{k} log(p\_ij)$$

对于response里的第i个词来说，词表大小为$$n$$，$$x\_{max}=max(x\_0,x\_1,...,x\_n)$$，下式第三行就是第二行分子分母同时乘$$e^{-x\_{max}}$$

$$
\begin{aligned}
\operatorname{LogSoftmax}\left(x\_i\right) & =\log \left(\operatorname{Softmax}\left(x\_i\right)\right) \\
& =\log \left(\mathrm{e}^{x\_i} / \sum\_{j=0}^n \mathrm{e}^{x\_j}\right) \\
& =\log \left(\mathrm{e}^{\left(x\_i-x\_{\text {max }}\right)} / \sum\_{j=0}^n \mathrm{e}^{\left(x\_j-x\_{\text {max }}\right)}\right) \\
& =\left(x\_i-x\_{\text {max }}\right)-\log \left(\sum\_{j=0}^n \mathrm{e}^{\left(x\_j-x\_{\text {max }}\right)}\right)
\end{aligned}
$$

这个简化有2个好处：

* 减少计算量：例如除法、少量对数
* 数值稳定：上式是log-sum-exp技巧，减掉max可以避免溢出

另外还有一个常用名词logprobs（log probabilities），即logsoftmax的结果，因为softmax是0到1，所以logprobs取值范围是负无穷到0

### 如何减小SFT引入的幻觉

sft阶段引入的新知识越多，幻觉发生率也越高

模型主要通过预训练来获取知识，sft主要是用来教会模型如何更有效地利用这些知识。

所以，新知识应该在预训练阶段或者基于预训练模型继续预训练（CPT），再用sft进行优化

另外，sft选哪个版本的开源模型作为基础模型也有讲究：

* 需要加一堆新知识进行深度微调时，选base版本，因为base版本未指令微调，更有通用性
* 任务与现有指令任务类似（通用对话、开放域问答等），且指令数据不多，选指令微调版本（-instruct或者-chat）

## DPO

DPO（direct preference optimization）是监督学习，不是强化学习，loss如下

$$
\begin{aligned}
& \mathcal{L}*{\mathrm{DPO}}\left(\pi*\theta ; \pi\_{\mathrm{ref}}\right) \\
& =-\mathbb{E}*{\left(x, y*{\mathrm{w}}, y\_1\right) \sim \mathcal{D}}\left\[\log \sigma\left(r\left(x, y\_{\mathrm{w}}\right)-r\left(x, y\_1\right)\right)\right] \\
& =-\mathbb{E}*{\left(x, y*{\mathrm{w}}, y\_1\right) \sim \mathcal{D}}\[\log \sigma(\underbrace{\beta \log \frac{\pi\_\theta\left(y\_{\mathrm{w}} \mid x\right)}{\pi\_{\text {ref }}\left(y\_{\mathrm{w}} \mid x\right)}}*{\text {优质回答的隐式奖励}\uparrow }-\underbrace{\beta \log \frac{\pi*\theta\left(y\_1 \mid x\right)}{\pi\_{\text {ref }}\left(y\_1 \mid x\right)}}\_{\text {劣质回答的隐式奖励 } \downarrow})]
\end{aligned}
$$

其中，

* $$r$$是策略模型和参考模型的比值，即一个隐式的奖励模型，$$r\_{\theta}(x,y)=\beta log \frac{\pi\_{\theta}(y|x)}{\pi\_{ref}(y|x)}$$
* 策略模型是复制的sft模型，参考模型一般也是复制sft模型，有些时候可以选一个更复杂的模型，但要注意两者的kl散度和训练数据分布不要差太多

### DPO流程

![](/files/m9Kc8S6h6rMfOPDBENdx)

* concat：将$$x$$和$$y\_w$$与$$y\_l$$分别concat，作为策略模型和参考模型的输入（实际会将三者concat一起）
* gather：算完logit和softmax后，再把y部分的拿出来，算出隐式奖励，再算Loss

### beta作用

在RLHF中，$$\beta$$和最终奖励$$=r(x,y)$$、最终奖励$$=r\_{\phi}(x,y)$$的关系如下，

$$
r(x,y)=r\_{\phi}(x,y)-\beta (log \pi \_{\theta}(y|x)-log \pi \_{ref}(y|x))
$$

* $$\beta$$很小时，策略模型和偏好数据分布更接近，
* $$\beta$$很大时，策略模型和参考模型更接近

在DPO中，

* $$\beta$$很小时，KL惩罚力度很小，策略模型有更多自由度去探索，策略模型和偏好数据分布更接近
* $$\beta$$很大时，KL惩罚力度很大，策略模型始终要兼顾和参考模型的距离，策略模型和参考模型更接近

### DPO的效果

对无害性有很大提升，对基础能力基本无影响（MMLU等）

### DPO的梯度

$$
\nabla\_\theta \mathcal{L}*{\mathrm{DPO}}\left(\pi*\theta ; \pi\_{\mathrm{ref}}\right)=-\beta \mathbb{E}*{\left(x, y*{\mathrm{w}}, y\_l\right) \sim \mathcal{D}}\[\underbrace{\sigma\left(r\_\theta\left(x, y\_l\right)-r\_\theta\left(x, y\_{\mathrm{w}}\right)\right)}*{\text {动态系数 }}\[\underbrace{\nabla*\theta \log \pi\_\theta\left(y\_{\mathrm{w}} \mid x\right)}*{\text {优质回答的概率 } \uparrow}-\underbrace{\nabla*\theta \log \pi\_\theta\left(y\_l \mid x\right)}\_{\text {劣质回答的概率 } \downarrow}]]
$$

* 增加优势回答出现的概率，降低劣势回答出现的概率
* 动态系数：优势答案和劣势答案的隐式奖励差异（注意$$r\_{\theta}(x,y)=\beta log \frac{\pi\_{\theta}(y|x)}{\pi\_{ref}(y|x)}$$），如下图：
  * $$r\_{\theta}(x,y\_l)\<r\_{\theta}(x,y\_w))$$时：隐式奖励模型能正确地给优质回答较高评分，图中左侧，说明已经学得比较好了，梯度比较小
  * $$r\_{\theta}(x,y\_l)>r\_{\theta}(x,y\_w))$$时：隐式奖励模型不太行，图中右侧，要加强梯度

![](/files/Fx0ApCZdO9FC4e3eTToN)

解释：

![](/files/mVKnmMQlpRUjcj8WttCE)

## Training-free的方法

### 提示词工程

prompt设计原则：

* 递进式尝试：先试zero-shot，效果不行再试few-shot，还是不行再尝试sft
* 灵活运用系统消息：引导模型的行为、风格、角色等
* 明确指令并用分隔符：在开头用冒号、三重引号、xml标签、换行等进行分隔
* 明确期望的输出格式并提供输出示例：详细描述具体输出格式要求
* 避免模糊描述：避免“较长”“较短”，要用具体数字，如5个要点、3段话
* 同时提供禁止和替代指令：告诉模型不要做什么，还有对应的替代方案
* 提供必要的上下文和角色信息：明确模型需要扮演的角色
* 分解复杂任务：复杂任务可以分进行意图分类或者逐步拆解任务
* 引导模型先思考后回答：明确指示模型在回答前先进行详细推理
* 使用参考文本并基于参考作答：提供可信的参考文本，要求模型基于此作答，可以进一步要求模型标明引用来源或参考文献
* 动态总结上下文：对话长度超出模型上下文窗口限制时，可以定期总结或筛选最相关信息

### CoT

![](/files/bnKuufDpAKWvK10v2AKa)

* 思维链：CoT，Chain of Thoughts，Google提出，[Chain-of-Thought Prompting Elicits Reasoning in Large Language Models](https://arxiv.org/pdf/2201.11903)
* 思维树：ToT，Tree of Thoughts，[Tree of Thoughts: Deliberate Problem Solving with Large Language Models](https://arxiv.org/pdf/2305.10601)，普林斯顿提出，允许考虑多个不同推理路径并进行自我评估，以决定下一步行动，并在必要时前瞻或回溯
* 思维图：GoT，Graph of Thoughts，[Graph of Thoughts: Solving Elaborate Problems with Large Language Models](https://arxiv.org/pdf/2308.09687)，苏黎世联邦理工学院提出，能将模型生成的信息建模为任意图结构，其中信息单元（思维）作为顶点，边对应这些顶点间的依赖关系，能有效组合任意的信息单元
* 自我一致性CoT：Self-consistency CoT，[Self-Consistency Improves Chain of Thought Reasoning in Language Models](https://arxiv.org/pdf/2203.11171)，Google提出，先生成多样化的推理路径集，然后从多个路径中选出最一致的答案
* Auto-CoT：[Automatic Chain of Thought Prompting in Large Language Models](https://arxiv.org/pdf/2210.03493)，自动构建CoT样本，先将问题聚类，再示例采样，每个类中选择一个具有代表性的问题，并用简单的Zero-shot CoT生成相应思维链
* 思维记忆：Memory of Thought，MoT，[MoT: Memory-of-Thought Enables ChatGPT to Self-Improve](https://arxiv.org/pdf/2305.05181)，复旦提出，不用更新参数，预思考：在未标注数据集上思考并将思维保存为外部记忆；推理：回忆相关记忆以帮助推理并回答给定问题
* XoT：Everything of Thoughts，[Everything of Thoughts: Defying the Law of Penrose Triangle for Thought Generation](https://arxiv.org/pdf/2311.04254)，RL+MCTS，结合轻量级的策略和价值网络，对特定任务进行训练以进行思维搜索，并随后泛化到新问题。训练完后，用轻量的策略和价值网络通过MCTS高效地思维搜索，再基于MCTS和LLM写作的框架进行思维修正，进一步提升思维质量。能最大程度减少LLM调用次数

如何自动选择few-shot示例？langchain等框架中实现了example selector

* 基于相似性
* 基于n-gram重叠分数
* 基于MMR(最大边际相关性)：在保证相关性的基础上引入多样性

多模态CoT：

* [Multimodal Chain-of-Thought Reasoning in Language Models](https://arxiv.org/pdf/2302.00923)：交大，两阶段框架，推理理由生成阶段：根据文本prompt+图像生成推理理由；答案推断阶段：根据文本prompt+图片+推理理由推断出最终答案
* [Improve Vision Language Model Chain-of-thought Reasoning](https://arxiv.org/pdf/2410.16198)，CMU，基于GPT-4o提取推理路径，对vlm进行微调以增强推理能力，再构造正负对加dpo提升效果

### 解码策略

以transformers.generate参数为例

* beam search：每次保留**累积概率**的topk，最终有k个路径，再选出最高的那个
* diverse beam search：[Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence Models](https://arxiv.org/pdf/1610.02424)，分成多个组（num\_beam\_groups），每个组内beam search，组间通过多样性惩罚降低生成结果的相似性
* 受限beam search：[Guided Open Vocabulary Image Captioning with Constrained Beam Search](https://arxiv.org/pdf/1612.00576)，constraints参数指定限制条件，force\_words\_ids强制结果包含特定词/词组
* temperature：**控制不同词的概率差距**。当调小时，x/T变大，然后经过exp会指数放大，这样高logit的会变得更巨大，词的差距会被拉大，所以模型的输出会更稳定，输出结果更确定；反之不同词的差距更小，输出更多样
* 多项式采样：multinomial sampling，不是直接选概率最大的，而是按概率大小**随机采样**
  * top-k：只在概率前k的词中进行采样
  * top-p：累加概率大于p后截断，只对这些token采样，**控制长尾词的概率阈值**。top cummulative probability，是一个门槛，即从第一名往下数，累加后的概率大于p时，把后面的词扔掉，剩下的词再softmax，并去采样。调低会去掉长尾，输出稳定；调高会放低门槛，输出多样

\==> temperature和top-p虽然原理不同，但均是越大越多样，适用创作等场景；越小越稳定，适用于代码、数学

其他解码策略：

* contrastive search：对比搜索，[A Contrastive Framework for Neural Text Generation](https://arxiv.org/pdf/2202.06417)，在每个解码步骤中，从模型预测的最可能候选集中选择输出，以增强生成文本与人类编写前缀之间的语义连贯性，保持生成文本的词元相似度矩阵稀疏性，避免输出退化问题。
* speculative decoding：投机解码，引入一个较小模型，能一次性预生成多个候选token，主模型也并行验证这些候选token。deepseek v3就整合了投机采样和多token预测(MTP)，实现了每次预测2个token
* lookahead decoding：前瞻解码，[Break the Sequential Dependency of LLM Inference Using LOOKAHEAD DECODING](https://arxiv.org/pdf/2402.02057)，并行生成和验证多个n-gram，基于Jacobi迭代方法，打破自回归解码的顺序依赖，无需辅助模型或额外的数据存储，加速推理。
* decoding by contrasting layers(DoLa)：对比解码的一种，[DoLa: Decoding by Contrasting Layers Improves Factuality in Large Language Models](https://arxiv.org/pdf/2309.03883)，对比模型中较早层与最终层的logits的差异，DoLa能放大transformer层中特定部分局部化的事实知识，从而增强生成文本的真实性，旨在提高输出的事实准确性并减少幻觉现象。

控制生成细节的参数

* max\_length：包括prompt的总长度
* max\_new\_tokens：不包括prompt的总长度
* repetition\_penalty：大于1增加重复惩罚，减少重复token生成
* length\_penalty：beam类方法的长度惩罚，大于0时鼓励生成较长序列，反之鼓励较短序列
* force\_word\_ids/bad\_words\_ids：必须生成的token id列表/不能生成的token id列表
* output\_logits/output\_scores：输出logits/scores

### RAG

主要的点在于如何对文档进行分片（chunk），然后就是正常的向量召回流程了。例如Anthoripic的[Contextual RAG](https://www.anthropic.com/news/contextual-retrieval)会给每个chunk加一个上下文，把这段context放到chunk前面，然后再去做embedding。类似如下prompt：

```python
<document>…全文…</document>

<chunk>…分片…</chunk>

指令：“给一个简短、精炼的 context，用于把这个 chunk 放到整篇文档语境里，提升检索；
只输出这段 context，不要输出其它内容。”
```

### 工具调用

详见：<https://www.daiwk.net/5.llm_agentic#gong-ju-diao-yong>

## 强化学习核心知识

### 一些概念

* 回合(episode)：一次完整智能体和环境交互，从初始状态直到终止状态
* 马尔可夫链(MC)：下一状态只和当前状态有关，和之前时刻的状态无关
* 马尔可夫决策过程（MDP）：马尔可夫链的基础上引入动作和奖励，4元组$$(S,A,P,R)$$
* 部分可观测马尔可夫决策过程（POMDP）：智能体无法观测到环境的完整状态，只能看到一部分，7元组$$(S,A,T,R,\Omega,O,\gamma)$$，$$\Omega$$是观测集，智能体能观测到的所有可能结果，$$\gamma$$是折扣因子，$$T$$是转移概率，当前状态和动作下，转移到下一状态的概率

### 常见探索利用方法

* $$\epsilon$$ -greedy：以$$\epsilon$$的概率随机选一个动作，$$1-\epsilon$$的概率选择Q最大的动作；训练初期可以用大的$$\epsilon$$鼓励探索，后期减小来鼓励利用
* 上置信界（Upper Confidence Bound, UCB）：计算每个动作的置信度上界值，将预期回报和不确定性结合，选最高上界的动作
* 汤普森采样：从每个动作的后验概率分布中采样来选择动作
* 熵正则化：优化目标中加入熵正则项，下次加油策略多样性和探索性，PPO算法中提到的
* 乐观初始化：将价值函数的初始估计设置为较高值来促进探索，由于初始值被高估，算法会优先尝试未被充分探索的动作
* 玻尔兹曼探索（Boltzmann Exploration）：引入温度系数，将动作的估计价值转化为概率分布，以概率的方式选择动作。温度较高时，各动作的概率差异较小，更倾向于探索
* 噪声注入：OpenAI的[Parameter Space Noise for Exploration](https://arxiv.org/pdf/1706.01905)，在参数空间注入噪声，在奖励信号稀疏的任务中效果很好

### 同/异策略、在/离线强化学习：

![](/files/dhtW5NAorAQ760mjzRJV)

* 行为策略(behavior policy)：智能体与环境交互时，实际执行交互行为的策略，负责收集用于训练的数据。
* 目标策略(target policy)：最终希望得到的策略，用来最大化长期回报。
* 同策略：行为和目标策略是同一个策略，例如policy gradient和SARSA，因为通常依赖最新生成的经验来训练并更新策略，所以一般不能用replay buffer
* 异策略：两个策略是不同版本或者不同类型，Q-learning/DQN都是，行为策略是$$\epsilon$$ -greedy，目标策略是最终要学习的，需要借助replay buffer
* replay buffer：一般存$$(s\_t,a\_t,r\_t,s\_{t+1})$$四元组(非Sutton教材写法)
* 在线强化学习：训练时策略持续和环境交互并收集经验，动态生成训练数据，目标策略也不断进化
* 离线强化学习：又叫batch RL，或者fully off-policy RL，训练时智能体完全不和环境交互，仅依赖预先收集的数据。训练结束之后再将策略整体部署到线上环境中

### model-based/model-free：

* model-based：利用环境模型进行规划和决策，例如Dyna-Q、MCTS（用于AlphaGo等）
* model-free：直接与环境交互，学习策略或者价值函数，例如基于价值(Q-learning、DQN、SARSA)、基于策略（REINFORCE、PG、GRPO）、Actor-Critic（DDPG、PPO、A3C）

### 奖励、回报、价值函数

* 奖励r（reward）：t时刻执行动作后，环境给的的实时奖励，**在Sutton的教材**里记为$$R\_{t+1}$$或者$$r\_{t+1}$$（以下以这个为准），一般大写是随机变量，小写是观测到的具体值，另外，在别的地方也会记成$$r\_t$$
* 奖励塑形（reward shaping）：设计复杂的奖励函数以表示具体任务目标，例如短视频推荐就可以设计一个多目标融合公式
* 回报G（gain）：到未来的累计奖励，可以加折扣，$$G\_t=R\_{t+1}+\gamma G\_{t+1}$$
* 价值函数：
  * $$Q\_{\pi}(s,a)$$：动作价值函数，在状态s下，采取动作a，获得的期望回报
  * $$V\_{\pi}(s)$$：状态价值函数，在状态s下，采取所有可能动作获得的期望回报

![](/files/RoER3NMNga7VQCiRf7nl)

### 贝尔曼方程

用动态规划解决优化和决策问题。对于给定策略$$\pi$$，

* 状态价值函数的贝尔曼方程为$$V\_\pi(s)=\sum\_a \pi(a \mid s) \sum\_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left\[r+\gamma V\_\pi\left(s^{\prime}\right)\right]$$
* 动作价值函数的贝尔曼方程为$$Q\_\pi(s, a)=\sum\_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left\[r+\gamma \sum\_{a^{\prime}} \pi\left(a^{\prime} \mid s^{\prime}\right) Q\_\pi\left(s^{\prime}, a^{\prime}\right)\right]$$
* 最优状态价值函数的贝尔曼方程为$$V\_*(s)=\max *a \sum*{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left\[r+\gamma V\_*\left(s^{\prime}\right)\right]$$
* 最优动作价值函数的贝尔曼方程为$$Q\_*(s, a)=\sum\_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left\[r+\gamma \max *{a^{\prime}} Q**\left(s^{\prime}, a^{\prime}\right)\right]$$

### 蒙特卡洛方法（MC）

多次试验，获得多个实际运行轨迹（需要运行到回合结束），根据它们来估计价值函数或者优化策略。实际应用时，可以在每运行完一个回合后立即更新状态价值，如下，$$\alpha$$是学习率，$$G\_t$$是某个回合实验的回报

$$
V\left(s\_t\right) \leftarrow V\left(s\_t\right)+\alpha\left(G\_t-V\left(s\_t\right)\right)
$$

### 时序差分方法（TD）

TD(Temporal Difference，TD)，基于当前的价值估计进行自举（bootstrapping）学习，通过自身的估计值(如$$V(s\_{t+1})$$)来更新当前的估计值(如$$V(s\_{t})$$)。与MC的差别在于，TD不需要等整个回合结束，而是每前进一小就更新一次

TD目标和TD误差

$$
V\left(s\_t\right) \leftarrow V\left(s\_t\right)+\alpha\[\underbrace{\underbrace{r\_{t+1}+\gamma V\left(s\_{t+1}\right)}*{\text {TD 目标 }}-V\left(s\_t\right)}*{\text {TD误差 }}]
$$

TD误差：$$\delta\_t=V\_{\text {TD目标 }}-V\left(s\_t\right)=r\_{t+1}+\gamma V\left(s\_{t+1}\right)-V\left(s\_t\right)$$

* 单步TD：也叫TD(0)，智能体和环境每个时间步交互一次，仅依赖未来一步的奖励和下一个状态的价值估计$$V(s\_{t+1})$$
* 多步TD：智能体与环境交互n次，也可以在每个时间步更新，但依赖的是未来n步奖励和状态的价值估计$$V(s\_{t+n})$$，如下：

$$
\begin{aligned}
V\left(s\_t\right) & \leftarrow V\left(s\_t\right)+\alpha\left\[G\_t^{(n)}-V\left(s\_t\right)\right] \\
& =V\left(s\_t\right)+\alpha\[\underbrace{\left(r\_{t+1}+\gamma r\_{t+2}+\gamma^2 r\_{t+3}+\cdots+\gamma^{n-1} r\_{t+n}+\gamma^n V\left(s\_{t+n}\right)\right)}*{n \text { 步的折扣回报+第 }(t+n) \text { 步的价值 } V\left(s*{t+n}\right)}-V\left(s\_t\right)
\end{aligned}
$$

$$TD(\lambda)$$如下：

$$
V\left(s\_t\right) \leftarrow V\left(s\_t\right)+\alpha\left\[G\_t^\lambda-V\left(s\_t\right)\right]
$$

其中，$$G\_t^\lambda$$是在时间步$$t$$的$$\lambda$$回报，即综合考虑多个步数的回报，以$$\lambda$$为权重的加权和，计算公式如下：

$$
G\_t^\lambda=\underbrace{(1-\lambda)*{n=1}^{T-t-1} \lambda^{n-1} G*{t: t+n}}*{\text {侧重于 } \mathrm{TD}}+\underbrace{\lambda^{T-t-1} G\_t}*{\text {侧重于 } \mathrm{MC}}
$$

### REINFORCE recall

p.s.回头看一下REINFORCE recall：[Off-policy Learning in Two-stage Recommender Systems](https://www.researchgate.net/publication/341128860_Off-policy_Learning_in_Two-stage_Recommender_Systems)

1. 当reward是one-step的时候，等价于监督学习下的policy gradient；
2. 当reward是multi-step的时候（例如从列表页点击视频，进入落地页后的时长叠加），等价于TD(1)的强化学习

![](/files/VnZ5JejLujpxqt3B8j4X)

p.s. 复习一下log trick

![](/files/jr2184zkewggw2HeToU8)

## 一些总结

### EvoLM

<https://zhuanlan.zhihu.com/p/2024394597879619874>

[EvoLM: In Search of Lost Language Model Training Dynamics](https://arxiv.org/pdf/2506.16029)

<https://github.com/zhentingqi/evolm>

<https://huggingface.co/collections/ZhentingNLP/evolm-datasets>

<https://zhentingqi.github.io/internal/projects/EvoLM/>

### 优化器

<https://docs.pytorch.org/docs/main/generated/torch.optim.Adam.html#torch.optim.Adam>

这里的weight decay其实是L2正则，求导后就是w，所以其实是对梯度做了decay，如图

![](/files/p7cs3ziszbjf1aUEv4kK)

<https://docs.pytorch.org/docs/main/generated/torch.optim.AdamW.html#torch.optim.AdamW>

这里真的是weight decay，即对原始w做了decay

![](/files/2xZavD78CkFKiEs2FNBh)

### BP

看周志明那本书的bp部分，没太看懂，和豆包与gpt讨论了下，发现：hiton 1986的[Learning representations by back-propagating errors](https://www.nature.com/articles/323533a0)，[pdf](https://www.cs.utoronto.ca/~hinton/absps/naturebp.pdf)

BP之前确实有多层训练方法，但大多是：局部规则、试探式扰动、逐层构造、结构搜索、无监督自组织，而其实BP很早就有人提了，比如Werbos 1974年博士论文就包含把反向传播用于训练网络的思想；Widrow的综述也提到，Werbos 1971年发展出backpropagation训练算法，1974年发表在博士论文里。Amari 1960s也讨论过用随机梯度下降端到端训练多层感知机的想法；Schmidhuber的历史综述提到，Ivakhnenko是逐层训练深层网络，而Amari 1967年提出从头用SGD端到端训练多层MLP。

但为什么大家还是把 1986 那篇当成“神经网络复兴”的关键？因为 Rumelhart、Hinton、Williams 把这个方法：讲清楚了、实验展示了、和hidden representation学习联系起来了、让社区真正用起来了。

BP：实际相当于是一个动态规划，因为多层nn的不同参数，在链式求导时中间的梯度有很多是公用的部分，而bp可以先算出来，缓存起来，算下一层的参数的梯度时候可以直接复用（这一点应该是相比周志明那本书里提的直接前向模式，即一参一路径，串行独推，原生无共享机制），这个其实和动态规划很像([这里](https://zhuanlan.zhihu.com/p/4762957769)也提到了这个思路)

这个库实现了简单的自动求导，<https://github.com/karpathy/micrograd>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.daiwk.net/4.llm_note.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
