<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>微调 on Zesean 的博客</title><link>https://zeseanblog.top/tags/%E5%BE%AE%E8%B0%83/</link><description>Recent content in 微调 on Zesean 的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 01 Sep 2026 22:58:08 +0800</lastBuildDate><atom:link href="https://zeseanblog.top/tags/%E5%BE%AE%E8%B0%83/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM 微调基础：LoRA 与 QLoRA 学习笔记</title><link>https://zeseanblog.top/p/lora-qlora/</link><pubDate>Sat, 11 Jul 2026 10:00:00 +0800</pubDate><guid>https://zeseanblog.top/p/lora-qlora/</guid><description>&lt;h2 id="第一阶段llm微调基础"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e9%98%b6%e6%ae%b5llm%e5%be%ae%e8%b0%83%e5%9f%ba%e7%a1%80" class="header-anchor"&gt;&lt;/a&gt;第一阶段：LLM微调基础&#13;&#10;&lt;/h2&gt;&lt;p&gt;目标：理解文档里提到的&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;LoRA(Low-Rank Adaptation，低秩适应)&#10;QLoRA（Quantized LoRA）&#10;SFT（Supervised Fine-Tuning，监督微调）&#10;DPO（Direct Preference Optimization，直接偏好优化）&#10;RLHF&#10;vLLM&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sftdpo"&gt;&lt;a href="#sftdpo" class="header-anchor"&gt;&lt;/a&gt;SFT、DPO&#13;&#10;&lt;/h3&gt;&lt;img src="images/image-20260616192221905.png" alt="image-20260616192221905" style="zoom:50%;" /&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;SFT&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;DPO&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;训练数据&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高质量的标准答案（input → output 对）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;偏好对比数据（input → chosen/rejected 对）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;学习信号&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;模仿标准答案（&amp;ldquo;这是什么&amp;rdquo;）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;学习相对偏好（&amp;ldquo;哪个更好&amp;rdquo;）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;优化目标&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最大化生成标准答案的概率&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最大化 chosen 优于 rejected 的边际&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;是否需要 Reward Model&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要（但隐式学习偏好）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;对齐效果&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;基础能力好，但容易过拟合或对齐不足&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对齐人类偏好更直接，泛化性通常更好&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;输入特定类型的文本&lt;/p&gt;&#10;&lt;p&gt;监督微调&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;SFT&lt;/strong&gt; 像&amp;quot;抄作业&amp;quot;：模型学习专家写好的标准答案，适合传授知识和基本格式。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DPO&lt;/strong&gt; 像&amp;quot;比较打分&amp;quot;：模型学习&amp;quot;答案 A 比答案 B 更好&amp;quot;，适合对齐人类价值观和偏好（如安全性、有用性、风格）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;数据：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;{&#10; &amp;#34;instruction&amp;#34;:&amp;#34;把红色方块放进盒子&amp;#34;,&#10; &amp;#34;output&amp;#34;:&amp;#34;对应动作序列&amp;#34;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;理解：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;输入&#10;↓&#10;标签&#10;↓&#10;训练&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;实际训练中通常是&lt;strong&gt;先 SFT 后 DPO&lt;/strong&gt;（或 RLHF）：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;SFT 阶段&lt;/strong&gt;：用高质量指令数据训练模型，让它学会基本对话格式和知识。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DPO 阶段&lt;/strong&gt;：用偏好数据（如人类标注的 good/bad 回答）进一步微调，让模型输出更符合人类偏好。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;技术细节补充&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;DPO 的优势&lt;/strong&gt;：避免了 RLHF 中复杂的 Reward Model 训练和 PPO 强化学习，将偏好优化转化为简单的分类损失，训练更稳定高效。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SFT 的局限&lt;/strong&gt;：如果标准答案本身质量不够高或分布有偏，模型会学到错误模式；且无法表达&amp;quot;好答案&amp;quot;和&amp;quot;更好答案&amp;quot;之间的细微差别。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="rlhf"&gt;&lt;a href="#rlhf" class="header-anchor"&gt;&lt;/a&gt;RLHF&#13;&#10;&lt;/h3&gt;&lt;p&gt;RLHF（Reinforcement Learning from Human Feedback，基于人类反馈的强化学习）是&lt;strong&gt;大模型对齐阶段&lt;/strong&gt;的核心方法，解决 SFT 无法表达&amp;quot;好/坏&amp;quot;偏好的问题。&lt;/p&gt;&#10;&lt;p&gt;SFT 的局限：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;只知道&amp;quot;标准答案&amp;quot;，不知道&amp;quot;A 比 B 更好&amp;quot;&lt;/li&gt;&#10;&lt;li&gt;无法处理&lt;strong&gt;开放性任务&lt;/strong&gt;（如创意写作、多轮对话）&lt;/li&gt;&#10;&lt;li&gt;缺乏&lt;strong&gt;安全边界&lt;/strong&gt;（可能生成有害内容）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;RLHF 的目标：&lt;strong&gt;让模型输出更符合人类偏好&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 1. SFT 模型 │ → │ 2. 训练 Reward Model │ → │ 3. PPO 强化学习 │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ (学会基本对话) │ │ (学会打分) │ │ (优化模型输出) │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────┘ └─────────────────┘ └─────────────────┘&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;训练 Reward Model（奖励模型）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;问题：解释量子计算&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回答 A（好）：&amp;#34;量子计算利用量子叠加和纠缠...&amp;#34; → 得分高&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回答 B（差）：&amp;#34;量子计算是一种计算...&amp;#34;（含糊） → 得分低&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回答 C（有害）：&amp;#34;量子计算可以用来破解密码...&amp;#34;（误导）→ 得分极低&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="lora"&gt;&lt;a href="#lora" class="header-anchor"&gt;&lt;/a&gt;LoRA:&#13;&#10;&lt;/h3&gt;&lt;p&gt;参数高效微调（Parameter-Efficient Fine-Tuning，PEFT）技术中的一种,冻结AIGC大模型的大部分参数，再引入一小部分可训练的参数作为适配模块进行微调训练&lt;/p&gt;&#10;&lt;p&gt;本质是&lt;strong&gt;特征矩阵进行低秩分解的一种近似数值分解技术&lt;/strong&gt;，可以大幅降低特征矩阵的参数量，但是会伴随着一定的有损压缩，可以大幅降低特征矩阵的参数量，但是会伴随着一定的有损压缩&lt;/p&gt;&#10;&lt;p&gt;我们假设原来的是100&lt;em&gt;1024的参数矩阵，那么参数量为102400，LoRA模型将矩阵拆成了两个矩阵相乘，如果我们设置Rank=8，那么就是100&lt;/em&gt;8的A矩阵与8*1024的B矩阵做矩阵乘法，参数量为800+8192=8992，&lt;strong&gt;整体参数量下降了约11.39倍&lt;/strong&gt;&lt;/p&gt;&#10;&lt;img src="https://pic2.zhimg.com/v2-0244c66c7cb412b3e09b70a2d2345601_1440w.jpg" alt="img" style="zoom:50%;" /&gt;&#10;&lt;p&gt;&lt;strong&gt;Transformer架构&lt;/strong&gt;&lt;/p&gt;&#10;&lt;img src="images/image-20260616191546887.png" alt="image-20260616191546887" style="zoom:50%;" /&gt;&#10;&lt;p&gt;比如attention模块就是&lt;/p&gt;&#10;&lt;img src="images/image-20260616191611072.png" alt="image-20260616191611072" style="zoom:50%;" /&gt;&#10;&lt;p&gt;可以控制的就是这些矩阵，矩阵的值就是模型参数&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;模型预训练：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;把海量数据放入模型进行计算；&lt;/p&gt;&#10;&lt;p&gt;模型输出和期望输出通过数学方式比较，从而调整参数&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;模型微调&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;在预训练模型基础上，集中训练特定领域文本，让模型回复快速集中到特定领域&lt;/p&gt;&#10;&lt;p&gt;但监督微调sft显存占用与预训练模型一致&lt;/p&gt;&#10;&lt;img src="images/image-20260616192332004.png" alt="image-20260616192332004" style="zoom:50%;" /&gt;&#10;&lt;img src="images/image-20260616192416588.png" alt="image-20260616192416588" style="zoom:50%;" /&gt;&#10;&lt;img src="images/image-20260616192507332.png" alt="image-20260616192507332" style="zoom: 33%;" /&gt;&#10;&lt;h3 id="qloraquantized-lora"&gt;&lt;a href="#qloraquantized-lora" class="header-anchor"&gt;&lt;/a&gt;QLoRA（Quantized LoRA）：&#13;&#10;&lt;/h3&gt;&lt;p&gt;背景：模型量化（quantization）也被叫做模型的低精度表示，指的是在不大幅降低模型效果的前提下使用更低的精度来表示模型中的参数，从而缩减模型的体积和训练模型时占用的显存。量化的本质是函数映射，根据量化过程是否线性我们可以把量化分为&lt;strong&gt;线性量化&lt;/strong&gt;和&lt;strong&gt;非线性量化&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;即从一种数据类型“舍入”到另一种数据类型；量化操作不可避免的带来一些误差，例如从float32到int8的round操作带来的精度损失，超出int8范围的溢出值的截断&lt;/p&gt;&#10;&lt;p&gt;最常见的 量化技术是最大绝对值：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20260616161405046" class="gallery-image" data-flex-basis="1819px" data-flex-grow="757" height="88" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/lora-qlora/images/image-20260616161405046.png" width="667"&gt;&lt;/p&gt;&#10; &lt;img src="images/image-20260616161427759.png" alt="image-20260616161427759" style="zoom: 67%;" /&gt;&#10;&lt;p&gt;还有一种量化技术叫做零点量化：&lt;/p&gt;&#10;&lt;p&gt;第一步值域映射，即通过缩放将原始的数值范围映射为量化后的数值范围; 第二步零点调整，即通过平移将映射后的数据的最小值对齐为目标值域的最小值。&lt;/p&gt;&#10;&lt;p&gt;按照量化过程是否以0点为对称点量化又可以分为&lt;strong&gt;对称量化&lt;/strong&gt;和&lt;strong&gt;非对称量化&lt;/strong&gt;；&lt;/p&gt;&#10;&lt;p&gt;对称量化将原浮点数的&lt;strong&gt;最小或最大值的绝对值&lt;/strong&gt;作为映射值的范围，而非对称量化是将原浮点数的&lt;strong&gt;最小和最大值映射&lt;/strong&gt;为量化数据的最小和最大值，如图1。在非对称量化中，0的映射也可能会有偏移，因此不一定会被映射到0。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20260616161950103" class="gallery-image" data-flex-basis="983px" data-flex-grow="409" height="202" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/lora-qlora/images/image-20260616161950103.png" srcset="https://zeseanblog.top/p/lora-qlora/images/image-20260616161950103_hu_127fca4f0494d1ee.png 800w, https://zeseanblog.top/p/lora-qlora/images/image-20260616161950103.png 828w" width="828"&gt;&lt;/p&gt;&#10;&lt;p&gt;非线性量化：&lt;/p&gt;&#10;&lt;p&gt;分位数量化（Quantile Quantization）&lt;strong&gt;顺序排列&lt;/strong&gt;的一组数据分割为若干个相等块的分割点的数值&lt;/p&gt;&#10;&lt;p&gt;累积分布函数（CDF）&lt;img alt="image-20260616190129653" class="gallery-image" data-flex-basis="1167px" data-flex-grow="486" height="37" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/lora-qlora/images/image-20260616190129653.png" width="180"&gt;使用分位数将张量分成了大小相同的若干个块，这样我们得到更加均匀的量化特征，这也就是分位数量化。如图3所示，对于4比特量化，我们希望需要找到15个分位数来将这个曲线下面的面积（积分）等分成16份。两个分位数的中点便是模型量化到这个区间映射的值。预训练模型的参数往往是符合正态分布的，因此我们可以通过累积分布函数的反函数&lt;img alt="image-20260616190332018" class="gallery-image" data-flex-basis="732px" data-flex-grow="305" height="40" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/lora-qlora/images/image-20260616190332018.png" width="122"&gt;&lt;/p&gt;&#10;&lt;img src="images/image-20260616190355699.png" alt="image-20260616190355699" style="zoom:50%;" /&gt;&#10;&lt;h4 id="qlora"&gt;&lt;a href="#qlora" class="header-anchor"&gt;&lt;/a&gt;QLoRA&#13;&#10;&lt;/h4&gt;&lt;p&gt;第一个工作是结合了分位数量化和分块量化的&lt;strong&gt;4位标准浮点数量化&lt;/strong&gt;（4-bit NormalFloat Quantization）。第二个工作是对模型进行两次量化的&lt;strong&gt;双重量化&lt;/strong&gt;（Double Quantization），它的第二次量化只作用在第一次量化产生的量化常数上，可以进一步节约显存占用。第三个工作是&lt;strong&gt;分页优化&lt;/strong&gt;（Paged Optimizer），使用CPU内存代替GPU显存保存部分梯度参数。&lt;/p&gt;&#10;&lt;p&gt;一、分位数量化方法我们可以将FP2精度量化到4bit的精度，但是直接这么用的一个问题是不能保证高精度的0一定被映射到低精度的0，但是0点又是深度学习中一个重要的值，例如在模型稀疏化，数据padding的时候一般都是使用0来完成&lt;/p&gt;&#10;&lt;p&gt;二、保存模型时我们不仅要保存量化后的结果，还要保存每个块的量化常数。虽然量化后的参数只有4bit的精度，但是这个量化常量的精度是float32。在QLoRA中，每个块的大小是64，因为块中的每个值占4比特。这相当于为了存储量化常数，模型要额外占用12.5%&lt;/p&gt;&#10;&lt;p&gt;三、QLoRA分页优化其实就是当显存不足是，将保存的部分梯度检查点转移到CPU内存上，和计算机的内存数据转移到硬盘上的常规内存分页一个道理&lt;/p&gt;&#10;&lt;h3 id=""&gt;&lt;a href="#" class="header-anchor"&gt;&lt;/a&gt;&#13;&#10;&lt;/h3&gt;</description></item></channel></rss>