LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】

news2025/4/13 7:37:38

LEARNING DYNAMICS OF LLM FINETUNING

一句话总结

作者将LLM的学习动力机制拆解成AKG三项,并分别观察了SFT和DPO训练过程中​​正梯度信号​​和​​负梯度信号​​的变化及其带来的影响,并得到以下结论:

  1. ​​SFT通过梯度相似性间接提升无关回答置信度​​;
  2. ​​DPO负梯度回传会引发confidence(softmax score) 向模型训练前confidence最高的token聚集:DPO中正样本与 负样本之间的margin虽然在增大,但正样本的confidence上涨幅度没有训练前模型最中意的答案的confidence涨得快

吐槽一下,这篇非常不适合LLM伴读和粗读,因为符号多,符号的描述写的很松散,图表的讲解非常碎(一张图的解释可能会横跨两个subsection),我开始用LLM伴读给我弄的非常混乱,自己粗读发现跳过一两段可能一个符号什么意思就不知道了。最后老老实实一行一行读。虽然作者的工作非常详实,但是……只能说这种写法不坑老实人吧。

↓↓↓这里先补充一下Learning Dynamic的分析逻辑↓↓

学习动力机制(Learning Dynamic)指什么?

Learning Dynamic,简单来说,就是研究每次模型经过一个batch的数据训练后,参数发生了变化,这个变化如何影响模型的表现。具体来说,哪些方面变好了?哪些方面变差了?

用来描述哪些方面变好,哪些方面变差的工具就是先做一个观察数据集,这个数据集是静态的。

观察一个batch的训练后,观察数据集里的<哪些样本>的预测结果有<什么样>的变化,就是研究Learning Dynamic。

为了衔接论文里的公式,这里把上面学习动力机制研究的公式写出来

第一步:定义,参数更新对特定样本的输出的影响
f ( x ; θ ) = π ( z ( x ; θ ) ) f(x;θ)=π(z(x;θ)) f(x;θ)=π(z(x;θ)) π π π是最后一层的softmax函数, x o x_o xo指的是观察集的样本。
—>参数更新 Δ θ Δθ Δθ 会导致输入 x x x的输出变化是
Δ f ( x o ; θ ) ≈ ∇ θ f ( x o ; θ ) ⋅ Δ θ Δf(x_o;θ)≈∇_θf(x_o;θ)⋅Δθ Δf(xo;θ)θf(xo;θ)Δθ

第二步:展开 第一项

∇ θ f ( x o ; θ ) = ∂ π ( z ( x o ; θ ) ) ∂ z ⏟ softmax雅可比  J π ( z ) ⋅ ∇ θ z ( x o ; θ ) ⏟ logits的梯度 \nabla_\theta f(x_o;\theta) = \underbrace{\frac{\partial \pi(z(x_o;\theta))}{\partial z}}_{\text{softmax雅可比 } J_\pi(z)} \cdot \underbrace{\nabla_\theta z(x_o;\theta)}_{\text{logits的梯度}} θf(xo;θ)=softmax雅可比 Jπ(z) zπ(z(xo;θ))logits的梯度 θz(xo;θ)

第三步: Δ θ Δθ Δθ 把梯度替换成 当批次样本 { x 1 , . . . , x i , . . . x n } \{x_1,...,x_i,...x_n\} {x1,...,xi,...xn} 带来的梯度

Δ θ Δθ Δθ 替换成 Δ θ = − η ∇ θ L ( θ ) Δθ=−η∇ _{θ}L(θ) Δθ=ηθL(θ) 即学习率乘以梯度

∇ θ L ( θ ) = 1 n ∑ i = 1 n ( π ( z ( x i ; θ ) ) − y i ) ⊤ ⋅ ∇ θ z ( x i ; θ ) ⏟ 通过链式法则: ∂ L ∂ z ⋅ ∂ z ∂ θ \nabla_\theta L(\theta) = \frac{1}{n} \sum_{i=1}^n \underbrace{\left( \pi(z(x_i;\theta)) - y_i \right)^\top \cdot \nabla_\theta z(x_i;\theta)}_{\text{通过链式法则:} \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial \theta}} θL(θ)=n1i=1n通过链式法则:zLθz (π(z(xi;θ))yi)θz(xi;θ)

第四步:两个展开式带回源式
Δ f ( x ; θ ) ≈ − η n ∑ i = 1 n [ J π ( z ( x ; θ ) ) ⋅ ∇ θ z ( x ; θ ) ] ⋅ [ ( π ( z ( x i ; θ ) ) − y i ) ⊤ ⋅ ∇ θ z ( x i ; θ ) ] \Delta f(x;\theta) \approx -\frac{\eta}{n} \sum_{i=1}^n \left[ J_\pi(z(x;\theta)) \cdot \nabla_\theta z(x;\theta) \right] \cdot \left[ \left( \pi(z(x_i;\theta)) - y_i \right)^\top \cdot \nabla_\theta z(x_i;\theta) \right] Δf(x;θ)nηi=1n[Jπ(z(x;θ))θz(x;θ)][(π(z(xi;θ))yi)θz(xi;θ)]
第五步:把gradient乘积写成NTK项
Δ f ( x ; θ ) ≈ − η n J π ( z ( x ; θ ) ) ∑ i = 1 n ⟨ ∇ θ z ( x ; θ ) , ∇ θ z ( x i ; θ ) ⟩ ⏟ NTK项  K ( x , x i ) ⋅ ( π ( z ( x i ; θ ) ) − y i ) Δf(x;θ) ≈ -\frac{η}{n} J_π(z(x;θ)) \sum_{i=1}^n \underbrace{\left\langle \nabla_θ z(x;θ), \nabla_θ z(x_i;θ) \right\rangle}_{\text{NTK项 } \mathbf{K}(x, x_i)} \cdot \left( π(z(x_i;θ)) - y_i \right) Δf(x;θ)nηJπ(z(x;θ))i=1nNTK K(x,xi) θz(x;θ),θz(xi;θ)(π(z(xi;θ))yi)
最终
Δ f ( x o ; θ ) ≈ − η n ⋅ J π ( z ( x o ; θ ) ) ⏟ softmax非线性效应 ⋅ ∑ i = 1 n K ( x o , x i ) ⏟ 样本相关性 ⋅ ( π ( z ( x i ; θ ) ) − y i ) ⏟ 训练样本误差 \Delta f(x_o;\theta) \approx -\frac{\eta}{n} \cdot \underbrace{J_\pi(z(x_o;\theta))}_{\text{softmax非线性效应}} \cdot \sum_{i=1}^n \underbrace{\mathbf{K}(x_o, x_i)}_{\text{样本相关性}} \cdot \underbrace{\left( \pi(z(x_i;\theta)) - y_i \right)}_{\text{训练样本误差}} Δf(xo;θ)nηsoftmax非线性效应 Jπ(z(xo;θ))i=1n样本相关性 K(xo,xi)训练样本误差 (π(z(xi;θ))yi)
最终这个式子里面的第一项、第二项和第三项分别对应了文章公式3的 AKG。
其中K的部分,代表了在函数空间中的样本相关性(不是两个样本乍看之下像不像,而是通过梯度核(NTK)映射之后像不像。文章在分析SFT时会一直用这个角度
G是训练样本误差带来的影响,这个在DPO分析中还会被拆成正负两项(因为DPO用的是margin)

关键细节与结论

1. G项给SFT带来的是训练Token的confidence上升

这里的confidence指的是Token的输出概率(softmax之后的score)
在这里插入图片描述
看上图中左侧第一张图,灰色是本步骤之前的这个样本的词表上的所有Score的曲线。蓝色就是这一步训练之后,词表上所有词的Score的变化。
这是很符合直觉的,也是论文的前菜.(但是这张图特别不好,把后面要说的东西的分析也放这儿了,看着很乱。大概是因为投稿篇幅的关系,作者压进来了)

2. SFT中 出现在训练集里的y,会在挂羊头卖狗肉的情况下也很自信

在这里插入图片描述
文中figure3的这张图,展示的是
π ( y u + ∣ x u ) π(y_{u^+}|x_u) π(yu+xu) -虚线, π ( y j ∣ x u ) π(y_{j}|x_u) π(yjxu)-蓝色线, 和 π ( y t e s t + ∣ x u ) π(y_{test^+}|x_u) π(ytest+xu)-橙色线 在训练过程中的变化。( π π π是softmax函数,这三条线都对应的是模型分)
其中 π ( y u + ∣ x u ) π(y_{u^+}|x_u) π(yu+xu) 就是训练集中样本A 对应的答案A的概率;
π ( y j ∣ x u ) π(y_{j}|x_u) π(yjxu)是训练集中样本A作为context(或者说prompt),后面接样本B的正确答案y_j的时候的score
π ( y t e s t + ∣ x u ) π(y_{test^+}|x_u) π(ytest+xu) 是训练集中样本A作为context,后面接测试集中某个样本的正确答案的时候的score。
如果按照我们的希望🔽

给定样本A的prompt,样本B的正确答案作为output的时候,这个答案是错的,他的confidence不应该上涨。
但在作者的实验记录下,这一数值上涨了。这就是作者认为SFT中一部分幻觉的来源

3. K项给SFT带来的是意思相近和格式相近的答案的confidence的上升

作者在分析的时候使用的是DPO数据集(Antropic-HH 和UltraFeedback),尽管他在训练SFT的时候仅适用了 DPO数据集中的prefer样本 y u + y_{u^+} yu+,但在分析中他同时分析了less prefer(负样本) y u − y_{u^-} yu
下图中, y u + y_{u^+} yu+ 是DPO样本集中<正样本>
y u − y_{u^-} yu 是DPO样本集中<负样本>
y g p t s + y_{gpts^+} ygpts+ 是用GPT针对DPO样本集中<正样本>做的同意改写样本
y g p t s − y_{gpts^-} ygpts 是用GPT针对DPO样本集中<负样本>做的同意改写样本
y h u m y_{hum} yhum 是随机的一个句子(跟训练样本无关)
y j ≠ u + y_{{j≠u}^+} yj=u+ 是训练集中另一个样本的<正样本>
y t e s t + y_{{test}^+} ytest+ 是测试集中某个样本的<正样本>
y r n d y_{{rnd}} yrnd 是随机英文词组成的字符串(连句子都不是)
在这里插入图片描述
基于以上符号意义,观察上图,蓝色部分confidence上涨,橙色就是下降。上图中左侧多个列都显示,每训练25步 [ x u ; y u ] [x_u;y_u] [xu;yu]就观察一次,发现一些语义或者格式相似( y g p t s + y_{gpts^+} ygpts+)的样本的confidence也上涨了。
同时乱序的字符串( y h u m y_{hum} yhum y r n d y_{rnd} yrnd)训练的时候,其他有正常语义的答案的confidence都会降低。因为,用K来衡量的距离跟这些乱序的答案的距离是很大的,Learning Dynamic的角度上看这些confidence也确实应该下降。
》最炸裂的其实是这个图的最后一列 DPO这列,这列引入的是下面一个结论

4. DPO中的负梯度会给所有未被训练的答案打负分

作者实验中发现,如果下图左1所示,在用DPO训练很多个epoch的过程中,根据训练样本正确答案改写的正样本 y g p t s + y_{gpts^+} ygpts+ (语义相同)和 y g p t f + y_{gptf^+} ygptf+ (格式相同)的confidence都在持续下降。
这是与我们的直觉相反的。
在这里插入图片描述
同时,上图左2显示,不仅DPO中正样本的改写样本的confidence在持续下滑,负样本的confidence也在持续下滑(仔细看数轴,这组斜率更大)
看上图的左4,在训练中的正样本和负样本的confidence的变化是:正样本的confidence先上涨后下滑,到第四个epoch,连正样本的confidence都比训练前要低了;而负样本的confidence全程咔咔下跌。
那正负样本的confidence都跌了,谁涨了呢?(毕竟是用softmax转换过的score,有人跌就有人涨)
答:看第左5,图中的黑线是模型在DPO之前(如果按照RL的说法,可以说是reference model)最prefer的答案的概率。

整个训练过程,reference model中概率最高的token的概率涨的最猛,比训练的正样本y还猛。

5. 这种错位的虹吸效应的源头是DPO的负梯度影响

文中的大部分拆解都沿用了经典的拆分方案。DPO上做了一个变化,把G分成了正负两部分。
在这里插入图片描述
这里有个比较讨厌的东西 χ u − χ^-_u χu 这个符号其实是附录中下面高亮部分的意思,就是 x u x_u xu是一样的,y不一样。这么表示其实有点讨厌,一来是符号不在公式附近(在附录B),二来这么写其实挺容易让人误解的。
在这里插入图片描述
前面这种奇怪的现象主要来自于负梯度的回传,也就是 G − G^- G的部分。
在附录中,作者还展示了reference model对 y u + y_{u^+} yu+分布形状不同的时候 ,DPO的负梯度带来的影响差别。
在这里插入图片描述
上面这个分析有个需要注意的点,就是这个DPO是off-policy的(虽然我们说DPO的时候通常就是off-policy的),即完全是静态的样本集,正样本和负样本都不是通过play逐步变化的。

那如果是on-policy的,也就是随着模型训练,概率分布有变化的时候(或者 y u + = y u ∗ y_{u^+}=y_{u^*} yu+=yu y u − = y u ∗ y_{u^-}=y_{u^*} yu=yu u ∗ u^* u指的就是reference model最中意的答案。)负梯度带来的影响是什么样的?
灰线是训练前,蓝线是训练后
在这里插入图片描述
看图的第三行,在原先分布是有几个特殊token的概率较高的情况下, y u − y_{u^-} yu直接作用到reference模型概率最高的token上时,其他概率相对较高的token的概率被直接抬起来很多。
看图的第四行,在原先分布是有几个特殊token的概率较高的情况下, y u − y_{u^-} yu直接作用到reference模型概率很低的token时,原先概率最高的token的概率被大大提升了。而不是所有概率高的token的概率都提升了,而是效用集中到一个token上。

评价

多于1个epoch问题就会逐渐凸显

在作者原文的大部分实验图中,都能看到,尽管DPO带来的挤压效应在多个epoch之后就显得非常病态。在实际训练过程中,其实也是这样的,不管是SFT还是DPO,在已知–>“全参数微调可以让模型在一个epoch之内完成记忆”<–这个前提下,训练超过1个epoch都要非常小心。而且在准备样本的过程中也要考虑,样本实际重复的情况来算实际epoch数。

定点制作DPO数据效果会很好

我这里提供的是论文作者论述以外,一个自己之前实践上的经验:制作两个只有关键知识点不同,其他描述完全相同的样本,比如“上海迪士尼上午9点开园”和“上海迪士尼上午10点开园”,这个会很大程度上提高模型的知识矫正(更新)效率。比unlearning还快。

完全静态的DPO样本集,会很快打乱SFT中已经训练好的模式

同样是跟作者的认知比较像的,如果先训练SFT把想要的模式注入到LLM里,然后用DPO来训,前面SFT的胜利成果可能在很小的样本量下就不行了。原因就在于SFT注入的本身就是一个模型原来并不prefer的格式。而且注入的点可能覆盖面并不够大(小样本的时候)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据集 | 沥青路面缺陷目标检测

文章目录 一、数据集概述1. 行业痛点与数据集价值2. 数据集技术规格 二、样本类别详解1. 裂缝 (Crack)2. 裂缝修补 (Crack Repair)3. 坑洞 (Pothole)4. 坑洞修补 (Pothole Repair)5. 井盖 (Manhole Cover)6. 其他 (Other) 三、标注工具四、下载地址 一、数据集概述 1. 行业痛点…

AllData数据中台升级发布 | 支持K8S数据平台2.0版本

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

.net Core 和 .net freamwork 调用 deepseek api 使用流输出文本(对话补全)

.net Core 调用 deepseek api 使用流输出文本 简下面直接上代码&#xff08;.net core&#xff09;&#xff1a;最后再贴一个 .net Freamwork 4 可以用的代码TLS 的代码至关重要的&#xff1a;&#xff08;下面这个&#xff09; 简 在官网里面有许多的案例&#xff1a;我们通过…

springcloud整理

问题1.服务拆分后如何进行服务之间的调用 我们该如何跨服务调用&#xff0c;准确的说&#xff0c;如何在cart-service中获取item-service服务中的提供的商品数据呢&#xff1f; 解决办法&#xff1a;Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请…

04-算法打卡-数组-二分查找-leetcode(69)-第四天

1 题目地址 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09;69. x 的平方根 - 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用任何内…

[Windows] 字体渲染 mactype v2025.4.11

[Windows] 字体渲染 mactype 链接&#xff1a;https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可变字体支持已到来。 本版本将可变字体支持扩展到所有 GDI 应用程序。 所有 win32 程序中的字体&#xff0c;如 Noto Sans、Se…

VSCode CMake调试CPP程序

文章目录 1 安装C与CMake插件2 配置CMakeLists.txt3 使用CMake编译调试3.1 编译3.2 调试 4 自定义构建调试参考 1 安装C与CMake插件 C插件 CMake插件 2 配置CMakeLists.txt 编写测试程序 #include<iostream>int main(int argc, char const *argv[]) {int a 1, b 2;i…

Halo 设置 GitHub - OAuth2 认证指南

在当今数字化时代&#xff0c;用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言&#xff0c;引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天&#xff0c;我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…

【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——Animator动画】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么&#xff1f;二、实战专栏推荐完结 一、状态机复…

C语言--汉诺塔问题

汉诺塔问题是一个典型的递归问题。 递归问题的基本思想&#xff1a;将问题逐步化简为相同思路但是规模更小的问题&#xff0c;直到问题可以直接解决 递归的关键在于基准情形和递归步骤&#xff0c;基准情形也就是退出条件&#xff0c;递归步骤也就是把问题简化为子问题的过程。…

301.找出3位偶数

2094. 找出 3 位偶数 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…

使用Python从零开始构建端到端文本到图像 Transformer大模型

简介&#xff1a;通过特征向量从文本生成图像 回顾&#xff1a;多模态 Transformer 在使用Python从零实现一个端到端多模态 Transformer大模型中&#xff0c;我们调整了字符级 Transformer 以处理图像&#xff08;通过 ResNet 特征&#xff09;和文本提示&#xff0c;用于视觉…

comfyui点击执行没反应一例

以前只遇到过执行工作流时出错的情况&#xff0c;从没试过说点了执行后一点反应都没有的情况。 今天下载 蓝色多脑盒《一键同时换头、换脸、发型、发色之双pulid技巧》分享的工作&#xff0c;第一次发现点击执行没反应。 发现左下角的地方连接错乱了。 更正连接后工作流能正常…

01-libVLC的视频播放器:环境搭建以及介绍

项目展示项目播放器 VLC简介VLC媒体播放器(VideoLAN Client)是一款开源、跨平台的自由多媒体播放器,由VideoLAN项目开发。它支持众多音频与视频格式(如MPEG-2、MPEG-4、H.264、MKV、WebM、WMV、MP3等),以及DVD、VCD和各种流媒体协议。 VLC的特点跨平台支持:Windows、mac…

用css画一条弧线

ui里有一条弧线&#xff0c;现在用css实现 关键代码 border-bottom-left-radius: 100% 7px 两个参数分别代表横向和纵向的深度border-bottom-right-radius: 100% 7px

FPGA上实现SD卡连续多块读的命令

在FPGA上实现SD卡连续多块读的命令 CMD17命令一次只能读取1个块 CMD18命令一次可以连续读取多个块&#xff0c;直到停止命令CMD12 CMD18命令读的块数程序可任意设置 目录 前言 一、SD卡多块读命令CMD18 二、停止读命令CMD12 三、SD卡初始化SD卡连续块读操作的verilog代码 …

从原理图到成品:PCBA设计的常见陷阱与规避方法

在电子设计领域&#xff0c;从原理图到PCBA&#xff08;Printed Circuit Board Assembly&#xff09;的转换过程中&#xff0c;布局布线是决定电路性能的关键环节。然而&#xff0c;许多工程师在实际操作中容易陷入一些常见误区&#xff0c;导致信号完整性、EMI&#xff08;电磁…

.py文件和.ipynb文件的区别:完整教程

一、概述 Python开发者常用的两种文件格式.py和.ipynb各有特点&#xff0c;本教程将通过对比分析、代码示例和场景说明&#xff0c;帮助开发者全面理解二者的区别与联系。 二、核心区别对比 1. 文件格式本质 特性.ipynb文件.py文件文件类型JSON结构化文档纯文本文件存储内容…

【项目管理】第11章 项目成本管理-- 知识点整理

相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 ​ ​ (二)知识笔记​ 第11章 项目成本管理 ​ 1.管理基础…

初学STM32之编码器测速以及测频法的实现

资料来着江协科技 这篇是编码器测速&#xff0c;江科大的源码在测速的时候&#xff0c;定时器TIM2是一直在跑的&#xff0c;不受其它控的&#xff0c;它就一直隔1S读一次CNT的值。它也不管是否有输入信号。源码程序修改一下是可以实现对PWM信号以测频法的方式读取。 笔者稍微改…