<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Training on Tarragon</title><link>https://tarrragon.github.io/blog/tags/training/</link><description>Recent content in Training on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/training/index.xml" rel="self" type="application/rss+xml"/><item><title>In-Context Learning</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/in-context-learning/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/in-context-learning/</guid><description>&lt;p>In-context learning（ICL）的核心概念是「&lt;strong>模型在不更新權重的情況下，從 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window&lt;/a> 內資訊臨時學會任務格式與判準&lt;/strong>」。它是 LLM 跟傳統模型最不同的能力之一：任務規則可以放在 context 裡，而不是一定要 fine-tune 進權重。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>ICL 是推論時行為，不是訓練流程。&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/few-shot-prompting/" data-link-title="Few-shot prompting" data-link-desc="在 prompt 內塞 input-output 範例對齊任務、不動模型權重的 in-context learning 技術">Few-shot prompting&lt;/a> 是 ICL 最常見的操作方式；SFT、LoRA、QLoRA 則是修改權重的訓練或微調方式。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>給模型三個分類範例後，第四個樣本就按同一標準分類，這是 ICL。把專案命名規則、輸出格式、review rubric 放進 prompt，模型在當次回合遵守，也屬於 ICL。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>ICL 適合快速迭代與少量範例；當範例多到吃滿 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window&lt;/a>、每天重複使用且標準穩定時，再考慮 fine-tune。需要穩定輸出格式時，ICL 應搭配 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/structured-output/" data-link-title="Structured Output" data-link-desc="讓 LLM 輸出可被 parser 穩定消費的推論階段設計：JSON mode、schema-guided decoding、grammar 約束都屬於這一層">structured output&lt;/a> 或 validator。&lt;/p></description><content:encoded><![CDATA[<p>In-context learning（ICL）的核心概念是「<strong>模型在不更新權重的情況下，從 <a href="/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window</a> 內資訊臨時學會任務格式與判準</strong>」。它是 LLM 跟傳統模型最不同的能力之一：任務規則可以放在 context 裡，而不是一定要 fine-tune 進權重。</p>
<h2 id="概念位置">概念位置</h2>
<p>ICL 是推論時行為，不是訓練流程。<a href="/blog/llm/knowledge-cards/few-shot-prompting/" data-link-title="Few-shot prompting" data-link-desc="在 prompt 內塞 input-output 範例對齊任務、不動模型權重的 in-context learning 技術">Few-shot prompting</a> 是 ICL 最常見的操作方式；SFT、LoRA、QLoRA 則是修改權重的訓練或微調方式。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>給模型三個分類範例後，第四個樣本就按同一標準分類，這是 ICL。把專案命名規則、輸出格式、review rubric 放進 prompt，模型在當次回合遵守，也屬於 ICL。</p>
<h2 id="設計責任">設計責任</h2>
<p>ICL 適合快速迭代與少量範例；當範例多到吃滿 <a href="/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window</a>、每天重複使用且標準穩定時，再考慮 fine-tune。需要穩定輸出格式時，ICL 應搭配 <a href="/blog/llm/knowledge-cards/structured-output/" data-link-title="Structured Output" data-link-desc="讓 LLM 輸出可被 parser 穩定消費的推論階段設計：JSON mode、schema-guided decoding、grammar 約束都屬於這一層">structured output</a> 或 validator。</p>
]]></content:encoded></item><item><title>Training Example Coverage</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/training-example-coverage/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/training-example-coverage/</guid><description>&lt;p>Training example coverage（訓練範例覆蓋度）的核心概念是「&lt;strong>模型在訓練時看過的任務情境是否足以支撐部署時遇到的變化&lt;/strong>」。LLM 的能力宣稱常寫成支援某功能，但實際穩定性取決於範例是否覆蓋工具數量、參數形狀、語言變體、錯誤情境與 edge cases。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Coverage 是訓練資料分佈的問題，常在 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT&lt;/a>、偏好資料、tool-use data、domain fine-tune 裡出現。它跟 prompt 範例不同：few-shot 範例只存在於當次 context，training examples 會透過訓練更新模型權重，影響模型「自然」傾向怎麼回答。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">訓練資料有覆蓋 → 模型自然輸出穩定
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">訓練資料缺口大 → 靠 prompt / structured output / validator 兜底&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>Function calling 的 coverage 可從四個面向判讀：該呼叫時是否呼叫、工具選擇是否正確、參數型別是否正確、巢狀 schema 與多工具情境是否穩定。小模型常在單一工具 + 平坦 schema 表現可用，但一進到多工具、optional field、nested object、跨語言 query 就明顯掉分，這通常是 coverage 不足而不是單純 parser 問題。&lt;/p>
&lt;p>Coverage 的陷阱是只看 happy path。訓練範例如果只有成功呼叫工具，模型會傾向每次都呼叫；如果缺少「資訊不足時先追問」「使用者要求超出權限時拒絕」「工具錯誤時重試或回退」這類範例，部署後會在安全與可靠性邊界失敗。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>評估模型能力時，把支援功能改問成覆蓋範圍：支援哪些 tool schema 複雜度、哪些語言、哪些錯誤路徑、哪些反例。下一步路由是用 eval set 補齊代表性情境；如果 coverage 無法補在模型訓練層，就用 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/structured-output/" data-link-title="Structured Output" data-link-desc="讓 LLM 輸出可被 parser 穩定消費的推論階段設計：JSON mode、schema-guided decoding、grammar 約束都屬於這一層">structured output&lt;/a>、validator、retry 與 fallback 降低失敗成本。&lt;/p></description><content:encoded><![CDATA[<p>Training example coverage（訓練範例覆蓋度）的核心概念是「<strong>模型在訓練時看過的任務情境是否足以支撐部署時遇到的變化</strong>」。LLM 的能力宣稱常寫成支援某功能，但實際穩定性取決於範例是否覆蓋工具數量、參數形狀、語言變體、錯誤情境與 edge cases。</p>
<h2 id="概念位置">概念位置</h2>
<p>Coverage 是訓練資料分佈的問題，常在 <a href="/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT</a>、偏好資料、tool-use data、domain fine-tune 裡出現。它跟 prompt 範例不同：few-shot 範例只存在於當次 context，training examples 會透過訓練更新模型權重，影響模型「自然」傾向怎麼回答。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">訓練資料有覆蓋 → 模型自然輸出穩定
</span></span><span class="line"><span class="ln">2</span><span class="cl">訓練資料缺口大 → 靠 prompt / structured output / validator 兜底</span></span></code></pre></div><h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>Function calling 的 coverage 可從四個面向判讀：該呼叫時是否呼叫、工具選擇是否正確、參數型別是否正確、巢狀 schema 與多工具情境是否穩定。小模型常在單一工具 + 平坦 schema 表現可用，但一進到多工具、optional field、nested object、跨語言 query 就明顯掉分，這通常是 coverage 不足而不是單純 parser 問題。</p>
<p>Coverage 的陷阱是只看 happy path。訓練範例如果只有成功呼叫工具，模型會傾向每次都呼叫；如果缺少「資訊不足時先追問」「使用者要求超出權限時拒絕」「工具錯誤時重試或回退」這類範例，部署後會在安全與可靠性邊界失敗。</p>
<h2 id="設計責任">設計責任</h2>
<p>評估模型能力時，把支援功能改問成覆蓋範圍：支援哪些 tool schema 複雜度、哪些語言、哪些錯誤路徑、哪些反例。下一步路由是用 eval set 補齊代表性情境；如果 coverage 無法補在模型訓練層，就用 <a href="/blog/llm/knowledge-cards/structured-output/" data-link-title="Structured Output" data-link-desc="讓 LLM 輸出可被 parser 穩定消費的推論階段設計：JSON mode、schema-guided decoding、grammar 約束都屬於這一層">structured output</a>、validator、retry 與 fallback 降低失敗成本。</p>
]]></content:encoded></item><item><title>Adam / AdamW</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/adam-adamw/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/adam-adamw/</guid><description>&lt;p>Adam（Adaptive Moment Estimation、Kingma &amp;amp; Ba, 2014）的核心概念是「&lt;strong>對每個參數維護兩個 EMA&lt;/strong>（gradient 的一階矩 = 平均、二階矩 = 變異）、用這兩個值自適應地縮放每個參數的更新步長」。AdamW（Loshchilov &amp;amp; Hutter, 2017）是 Adam 加上「decoupled weight decay」的修正版、是現代 LLM 訓練的標準 optimizer。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Adam 更新規則（簡化）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">m_t = β₁ × m_{t-1} + (1 - β₁) × g_t ← gradient 的 EMA（一階矩、方向）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">v_t = β₂ × v_{t-1} + (1 - β₂) × g_t² ← gradient² 的 EMA（二階矩、變動率）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">W -= lr × m_t / (sqrt(v_t) + ε)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> └──────┬──────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> 每個參數獨立縮放
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> 經常變動的方向減小步長、穩定方向加大&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>跟其他 optimizer 對比：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>對比&lt;/th>
 &lt;th>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sgd/" data-link-title="SGD" data-link-desc="Stochastic Gradient Descent：每次用 mini-batch 算 gradient 更新權重的基礎 optimizer">SGD&lt;/a>&lt;/th>
 &lt;th>SGD + Momentum&lt;/th>
 &lt;th>Adam&lt;/th>
 &lt;th>AdamW&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>每參數自適應&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>是&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>記憶體開銷&lt;/td>
 &lt;td>1× W（就 gradient）&lt;/td>
 &lt;td>2× W&lt;/td>
 &lt;td>3× W&lt;/td>
 &lt;td>3× W&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hyperparameter&lt;/td>
 &lt;td>lr&lt;/td>
 &lt;td>lr + μ&lt;/td>
 &lt;td>lr + β₁、β₂&lt;/td>
 &lt;td>lr + β₁、β₂ + weight_decay&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>LLM 訓練主流&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>早期&lt;/td>
 &lt;td>現在主流&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵：AdamW 對 weight decay 跟 lr 解耦、修正了 Adam 在「lr × weight_decay」交互上的 bug、是 GPT、Llama、Gemma 等系列訓練的標配。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 LLM training paper / config 看到 &lt;code>optimizer: AdamW&lt;/code>、&lt;code>betas: [0.9, 0.95]&lt;/code>、&lt;code>weight_decay: 0.1&lt;/code> 等就是這個 optimizer 的標準設定。記憶體佔用 = 模型權重 × 3（model + m + v）、加上 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> 的 activation、是訓練 vs 推論記憶體差距的主要來源。&lt;/p></description><content:encoded><![CDATA[<p>Adam（Adaptive Moment Estimation、Kingma &amp; Ba, 2014）的核心概念是「<strong>對每個參數維護兩個 EMA</strong>（gradient 的一階矩 = 平均、二階矩 = 變異）、用這兩個值自適應地縮放每個參數的更新步長」。AdamW（Loshchilov &amp; Hutter, 2017）是 Adam 加上「decoupled weight decay」的修正版、是現代 LLM 訓練的標準 optimizer。</p>
<h2 id="概念位置">概念位置</h2>
<p>Adam 更新規則（簡化）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">m_t = β₁ × m_{t-1} + (1 - β₁) × g_t      ← gradient 的 EMA（一階矩、方向）
</span></span><span class="line"><span class="ln">2</span><span class="cl">v_t = β₂ × v_{t-1} + (1 - β₂) × g_t²     ← gradient² 的 EMA（二階矩、變動率）
</span></span><span class="line"><span class="ln">3</span><span class="cl">W -= lr × m_t / (sqrt(v_t) + ε)
</span></span><span class="line"><span class="ln">4</span><span class="cl">            └──────┬──────┘
</span></span><span class="line"><span class="ln">5</span><span class="cl">        每個參數獨立縮放
</span></span><span class="line"><span class="ln">6</span><span class="cl">        經常變動的方向減小步長、穩定方向加大</span></span></code></pre></div><p>跟其他 optimizer 對比：</p>
<table>
  <thead>
      <tr>
          <th>對比</th>
          <th><a href="/blog/llm/knowledge-cards/sgd/" data-link-title="SGD" data-link-desc="Stochastic Gradient Descent：每次用 mini-batch 算 gradient 更新權重的基礎 optimizer">SGD</a></th>
          <th>SGD + Momentum</th>
          <th>Adam</th>
          <th>AdamW</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>每參數自適應</td>
          <td>否</td>
          <td>否</td>
          <td>是</td>
          <td>是</td>
      </tr>
      <tr>
          <td>記憶體開銷</td>
          <td>1× W（就 gradient）</td>
          <td>2× W</td>
          <td>3× W</td>
          <td>3× W</td>
      </tr>
      <tr>
          <td>Hyperparameter</td>
          <td>lr</td>
          <td>lr + μ</td>
          <td>lr + β₁、β₂</td>
          <td>lr + β₁、β₂ + weight_decay</td>
      </tr>
      <tr>
          <td>LLM 訓練主流</td>
          <td>否</td>
          <td>否</td>
          <td>早期</td>
          <td>現在主流</td>
      </tr>
  </tbody>
</table>
<p>關鍵：AdamW 對 weight decay 跟 lr 解耦、修正了 Adam 在「lr × weight_decay」交互上的 bug、是 GPT、Llama、Gemma 等系列訓練的標配。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀 LLM training paper / config 看到 <code>optimizer: AdamW</code>、<code>betas: [0.9, 0.95]</code>、<code>weight_decay: 0.1</code> 等就是這個 optimizer 的標準設定。記憶體佔用 = 模型權重 × 3（model + m + v）、加上 <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> 的 activation、是訓練 vs 推論記憶體差距的主要來源。</p>
]]></content:encoded></item><item><title>Backpropagation</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/</guid><description>&lt;p>Backpropagation（反向傳播）的核心概念是「從輸出端的 loss 開始、用 chain rule 一層層往輸入端遞推、算出每個權重的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a>」。它是訓練神經網路的核心演算法、沒有它就無法在合理時間內訓練深度模型。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Backpropagation 是訓練 loop 的中段、夾在 forward pass 跟權重更新之間：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">[forward pass]：input → layer1 → layer2 → ... → output → loss
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">[backpropagation]：把 loss 對最後一層權重的偏微分算出來
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ←─ chain rule ─ 再往前傳播一層、算前一層的 gradient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> ←─ chain rule ─ ...一路傳回輸入層
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">[optimizer step]：每個權重 w 用對應的 gradient 更新&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>關鍵特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>計算成本 ≈ forward pass 的 2~3 倍&lt;/strong>：每個 layer 都要存 forward 階段的中間值（activation）、反向時拿來算 gradient。所以訓練比推論貴一個量級。&lt;/li>
&lt;li>&lt;strong>記憶體佔用 = forward 階段 activation 的累計&lt;/strong>：這是訓練比推論吃 VRAM 的主因、不是「權重變大」、是「activation 要存著」。&lt;/li>
&lt;li>&lt;strong>數值穩定性敏感&lt;/strong>：long chain 的 chain rule 容易導致 gradient 爆炸或消失、見 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a> 卡。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>推論階段完全不用 backpropagation。理解這點能解釋幾個現象：為什麼同樣模型訓練要 8 卡 H100 一週、推論單卡就跑得動（差幾十倍的計算與記憶體需求）；為什麼 LoRA / QLoRA 等 parameter-efficient fine-tuning 能大幅降低訓練成本（凍住大部分權重、只對少數 LoRA 矩陣做 backpropagation）；為什麼 inference framework（llama.cpp、vLLM）跟 training framework（PyTorch、JAX）的設計重點完全不同。&lt;/p></description><content:encoded><![CDATA[<p>Backpropagation（反向傳播）的核心概念是「從輸出端的 loss 開始、用 chain rule 一層層往輸入端遞推、算出每個權重的 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a>」。它是訓練神經網路的核心演算法、沒有它就無法在合理時間內訓練深度模型。</p>
<h2 id="概念位置">概念位置</h2>
<p>Backpropagation 是訓練 loop 的中段、夾在 forward pass 跟權重更新之間：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">[forward pass]：input → layer1 → layer2 → ... → output → loss
</span></span><span class="line"><span class="ln">2</span><span class="cl">                                                          ↓
</span></span><span class="line"><span class="ln">3</span><span class="cl">[backpropagation]：把 loss 對最後一層權重的偏微分算出來
</span></span><span class="line"><span class="ln">4</span><span class="cl">                  ←─ chain rule ─ 再往前傳播一層、算前一層的 gradient
</span></span><span class="line"><span class="ln">5</span><span class="cl">                  ←─ chain rule ─ ...一路傳回輸入層
</span></span><span class="line"><span class="ln">6</span><span class="cl">                                                          ↓
</span></span><span class="line"><span class="ln">7</span><span class="cl">[optimizer step]：每個權重 w 用對應的 gradient 更新</span></span></code></pre></div><p>關鍵特性：</p>
<ol>
<li><strong>計算成本 ≈ forward pass 的 2~3 倍</strong>：每個 layer 都要存 forward 階段的中間值（activation）、反向時拿來算 gradient。所以訓練比推論貴一個量級。</li>
<li><strong>記憶體佔用 = forward 階段 activation 的累計</strong>：這是訓練比推論吃 VRAM 的主因、不是「權重變大」、是「activation 要存著」。</li>
<li><strong>數值穩定性敏感</strong>：long chain 的 chain rule 容易導致 gradient 爆炸或消失、見 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> 卡。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>推論階段完全不用 backpropagation。理解這點能解釋幾個現象：為什麼同樣模型訓練要 8 卡 H100 一週、推論單卡就跑得動（差幾十倍的計算與記憶體需求）；為什麼 LoRA / QLoRA 等 parameter-efficient fine-tuning 能大幅降低訓練成本（凍住大部分權重、只對少數 LoRA 矩陣做 backpropagation）；為什麼 inference framework（llama.cpp、vLLM）跟 training framework（PyTorch、JAX）的設計重點完全不同。</p>
]]></content:encoded></item><item><title>Catastrophic Forgetting</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/catastrophic-forgetting/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/catastrophic-forgetting/</guid><description>&lt;p>Catastrophic forgetting（災難遺忘）的核心概念是「&lt;strong>Fine-tune 模型時、新訓練資料的 gradient 更新破壞了模型原本學到的能力&lt;/strong>」。在 LLM fine-tuning 場景特別常見：在自己 domain 資料上 fine-tune、結果模型在原 benchmark / 通用任務上分數大幅下降。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Catastrophic forgetting 在 LLM fine-tuning 的典型表現：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">Before fine-tune（base instruct model）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> HumanEval: 75
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> MMLU: 70
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> 自己 domain 任務 hit rate: 40%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">After fine-tune（在自己 domain 資料上跑 SFT、3 epochs）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> HumanEval: 55 ← 下降 20 點
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> MMLU: 50 ← 下降 20 點
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> 自己 domain 任務 hit rate: 70% ← 提升 30 點
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">→ 自己 domain 強了、但通用能力崩了&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>成因：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Gradient 在新資料上對 base 權重做大更新&lt;/strong>：原本 base 的權重對通用任務有用、被覆蓋掉&lt;/li>
&lt;li>&lt;strong>資料分佈差距大&lt;/strong>：自己 domain 跟 pretrain corpus 分佈差距大、學新的 = 忘舊的&lt;/li>
&lt;li>&lt;strong>訓練 epoch 太多&lt;/strong>：模型 over-fit 到新資料、舊能力衰退更嚴重&lt;/li>
&lt;li>&lt;strong>Learning rate 太高&lt;/strong>：每步更新幅度大、舊權重變化快&lt;/li>
&lt;/ol>
&lt;h2 id="緩解策略">緩解策略&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>策略&lt;/th>
 &lt;th>機制&lt;/th>
 &lt;th>適用情境&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/qlora/" data-link-title="QLoRA" data-link-desc="把 base model 量化到 4-bit &amp;#43; LoRA fine-tune 的組合、消費級 GPU 也能 fine-tune 大模型">QLoRA&lt;/a>&lt;/td>
 &lt;td>凍住 base 權重、只訓 adapter、舊能力完全保留&lt;/td>
 &lt;td>多數 fine-tune 場景的 default&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>資料 mixing&lt;/td>
 &lt;td>訓練 batch 內 mix 通用資料 + domain 資料、避免分佈完全偏移&lt;/td>
 &lt;td>跟 LoRA 結合使用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lower learning rate&lt;/td>
 &lt;td>用較小 lr（如 5e-6 vs 1e-5）、減慢更新&lt;/td>
 &lt;td>全參數 fine-tune 必選&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fewer epochs&lt;/td>
 &lt;td>訓 1-2 epoch 就停、不過度擬合&lt;/td>
 &lt;td>同上&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Regularization（KL constraint）&lt;/td>
 &lt;td>Loss 加「不能偏離 base 太遠」的約束&lt;/td>
 &lt;td>RLHF / DPO 已內建&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>EWC（Elastic Weight Consolidation）&lt;/td>
 &lt;td>對重要權重加更強懲罰、防止它們被改&lt;/td>
 &lt;td>研究用、實務罕見&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>主流 fine-tuning 配置（避免 catastrophic forgetting）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">方法：QLoRA fine-tune
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">參數：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> - rank: 16-64（看資料量）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> - alpha: 32（typical）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> - lr: 1e-4 ~ 5e-4（LoRA 適合較大 lr）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> - epochs: 1-3（不過度訓）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl"> - 資料：80% in-domain + 20% 通用 instruction data（保留通用能力）&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 fine-tune paper / 報告看到「forgetting」「retention」「regression」就是這現象。寫 code 場景的判讀：&lt;/p></description><content:encoded><![CDATA[<p>Catastrophic forgetting（災難遺忘）的核心概念是「<strong>Fine-tune 模型時、新訓練資料的 gradient 更新破壞了模型原本學到的能力</strong>」。在 LLM fine-tuning 場景特別常見：在自己 domain 資料上 fine-tune、結果模型在原 benchmark / 通用任務上分數大幅下降。</p>
<h2 id="概念位置">概念位置</h2>
<p>Catastrophic forgetting 在 LLM fine-tuning 的典型表現：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">Before fine-tune（base instruct model）：
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  HumanEval: 75
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  MMLU: 70
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  自己 domain 任務 hit rate: 40%
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">After fine-tune（在自己 domain 資料上跑 SFT、3 epochs）：
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  HumanEval: 55  ← 下降 20 點
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  MMLU: 50       ← 下降 20 點
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  自己 domain 任務 hit rate: 70%  ← 提升 30 點
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">→ 自己 domain 強了、但通用能力崩了</span></span></code></pre></div><p>成因：</p>
<ol>
<li><strong>Gradient 在新資料上對 base 權重做大更新</strong>：原本 base 的權重對通用任務有用、被覆蓋掉</li>
<li><strong>資料分佈差距大</strong>：自己 domain 跟 pretrain corpus 分佈差距大、學新的 = 忘舊的</li>
<li><strong>訓練 epoch 太多</strong>：模型 over-fit 到新資料、舊能力衰退更嚴重</li>
<li><strong>Learning rate 太高</strong>：每步更新幅度大、舊權重變化快</li>
</ol>
<h2 id="緩解策略">緩解策略</h2>
<table>
  <thead>
      <tr>
          <th>策略</th>
          <th>機制</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> / <a href="/blog/llm/knowledge-cards/qlora/" data-link-title="QLoRA" data-link-desc="把 base model 量化到 4-bit &#43; LoRA fine-tune 的組合、消費級 GPU 也能 fine-tune 大模型">QLoRA</a></td>
          <td>凍住 base 權重、只訓 adapter、舊能力完全保留</td>
          <td>多數 fine-tune 場景的 default</td>
      </tr>
      <tr>
          <td>資料 mixing</td>
          <td>訓練 batch 內 mix 通用資料 + domain 資料、避免分佈完全偏移</td>
          <td>跟 LoRA 結合使用</td>
      </tr>
      <tr>
          <td>Lower learning rate</td>
          <td>用較小 lr（如 5e-6 vs 1e-5）、減慢更新</td>
          <td>全參數 fine-tune 必選</td>
      </tr>
      <tr>
          <td>Fewer epochs</td>
          <td>訓 1-2 epoch 就停、不過度擬合</td>
          <td>同上</td>
      </tr>
      <tr>
          <td>Regularization（KL constraint）</td>
          <td>Loss 加「不能偏離 base 太遠」的約束</td>
          <td>RLHF / DPO 已內建</td>
      </tr>
      <tr>
          <td>EWC（Elastic Weight Consolidation）</td>
          <td>對重要權重加更強懲罰、防止它們被改</td>
          <td>研究用、實務罕見</td>
      </tr>
  </tbody>
</table>
<p>主流 fine-tuning 配置（避免 catastrophic forgetting）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">方法：QLoRA fine-tune
</span></span><span class="line"><span class="ln">2</span><span class="cl">參數：
</span></span><span class="line"><span class="ln">3</span><span class="cl">  - rank: 16-64（看資料量）
</span></span><span class="line"><span class="ln">4</span><span class="cl">  - alpha: 32（typical）
</span></span><span class="line"><span class="ln">5</span><span class="cl">  - lr: 1e-4 ~ 5e-4（LoRA 適合較大 lr）
</span></span><span class="line"><span class="ln">6</span><span class="cl">  - epochs: 1-3（不過度訓）
</span></span><span class="line"><span class="ln">7</span><span class="cl">  - 資料：80% in-domain + 20% 通用 instruction data（保留通用能力）</span></span></code></pre></div><h2 id="設計責任">設計責任</h2>
<p>讀 fine-tune paper / 報告看到「forgetting」「retention」「regression」就是這現象。寫 code 場景的判讀：</p>
<ol>
<li><strong>Fine-tune 前先建 baseline benchmark</strong>：把 base model 在通用 benchmark + 自己 domain 都跑一遍、fine-tune 後對比看 regression</li>
<li><strong>用 LoRA / QLoRA 是 default</strong>：除非有特殊理由要 full fine-tune、不然優先 LoRA</li>
<li><strong>不要把通用 chat 能力 fine-tune 掉</strong>：如果 fine-tune 後模型不會聊天、只會答自己 domain 問題、就是 forgetting 過頭</li>
<li><strong>Iterative fine-tune 風險疊加</strong>：在 fine-tuned 模型上再 fine-tune（如 SFT → DPO）、forgetting 風險加倍、要小心評估</li>
<li><strong>Reasoning 能力特別容易 forget</strong>：reasoning 是後期訓練的、fine-tune 一輪 SFT 容易破壞、reasoning model 不建議再 fine-tune</li>
</ol>
]]></content:encoded></item><item><title>Contrastive Learning</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/contrastive-learning/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/contrastive-learning/</guid><description>&lt;p>Contrastive learning（對比學習）的核心概念是「&lt;strong>訓練模型讓相關樣本的 embedding 在向量空間中靠近、無關樣本遠離&lt;/strong>」。是現代 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">embedding model&lt;/a> 的標準訓練 paradigm、跟 LLM pretrain 的 next-token prediction 完全不同的訓練目標。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Contrastive learning 的核心訓練形態：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">正向對（positive pair）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> (query, relevant_doc) — 應該在 embedding 空間靠近
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> 例：(&amp;#34;Python how to read file&amp;#34;, &amp;#34;Python file reading tutorial...&amp;#34;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">負向對（negative pair）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> (query, irrelevant_doc) — 應該在 embedding 空間遠離
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> 例：(&amp;#34;Python how to read file&amp;#34;, &amp;#34;CSS flexbox guide...&amp;#34;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">Loss（簡化的 InfoNCE loss）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> pull positive pair 靠近
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> push negative pair 遠離（多個 negative samples 對比）&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主流形式：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>形式&lt;/th>
 &lt;th>Loss 設計&lt;/th>
 &lt;th>代表模型&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Triplet loss&lt;/td>
 &lt;td>(anchor, positive, negative)、要求 anchor-positive 距離 &amp;lt; anchor-negative&lt;/td>
 &lt;td>早期 sentence-BERT&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>InfoNCE / NCE&lt;/td>
 &lt;td>Cross-entropy over batch、把 batch 內其他樣本當 hard negative&lt;/td>
 &lt;td>OpenAI ada-002、bge 系列&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>MultipleNegativesRankingLoss&lt;/td>
 &lt;td>上述變體、用 batch 內隨機其他樣本當 negative&lt;/td>
 &lt;td>Sentence-Transformers 主流&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>資料量需求大&lt;/strong>：contrastive learning 需要億級的正向對才能訓出好 embedding；資料來源是 query-doc click log、StackExchange QA pair、CC-paraphrase 等&lt;/li>
&lt;li>&lt;strong>Hard negative mining 是品質關鍵&lt;/strong>：隨機選 negative 容易（從 batch 取就行）、找「看似相關但實際無關」的 hard negative 更挑戰、是 embedding quality 提升的關鍵&lt;/li>
&lt;li>&lt;strong>不能直接拿 pretrained LLM 用&lt;/strong>：LLM 的 hidden state 不是「為 retrieval 優化」的、要再 fine-tune 一輪 contrastive learning 才能當 embedding model&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 embedding model paper / 訓練 code 看到「InfoNCE」「triplet」「hard negatives」「mining strategy」就是這 paradigm。寫 code 場景的判讀：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>挑 embedding model 看訓練資料 domain&lt;/strong>：通用 retrieval（如 bge-large、nomic-embed）vs code-specific（如 jina-embeddings-v2-code、CodeT5+）、訓練資料分佈影響大&lt;/li>
&lt;li>&lt;strong>不能拿任意 LLM 抽 hidden state 當 embedding&lt;/strong>：如「Llama 的 last hidden state 當 embedding」這類做法在 retrieval 上通常顯著輸給專門 contrastive-trained embedding model&lt;/li>
&lt;li>&lt;strong>Fine-tune embedding model 通常用 LoRA + contrastive loss&lt;/strong>：在自己 domain 資料上 fine-tune、提升 in-domain retrieval；標準 pipeline 是 sentence-transformers + LoRA&lt;/li>
&lt;/ol></description><content:encoded><![CDATA[<p>Contrastive learning（對比學習）的核心概念是「<strong>訓練模型讓相關樣本的 embedding 在向量空間中靠近、無關樣本遠離</strong>」。是現代 <a href="/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">embedding model</a> 的標準訓練 paradigm、跟 LLM pretrain 的 next-token prediction 完全不同的訓練目標。</p>
<h2 id="概念位置">概念位置</h2>
<p>Contrastive learning 的核心訓練形態：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">正向對（positive pair）：
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  (query, relevant_doc) — 應該在 embedding 空間靠近
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  例：(&#34;Python how to read file&#34;, &#34;Python file reading tutorial...&#34;)
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">負向對（negative pair）：
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  (query, irrelevant_doc) — 應該在 embedding 空間遠離
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  例：(&#34;Python how to read file&#34;, &#34;CSS flexbox guide...&#34;)
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">Loss（簡化的 InfoNCE loss）：
</span></span><span class="line"><span class="ln">10</span><span class="cl">  pull positive pair 靠近
</span></span><span class="line"><span class="ln">11</span><span class="cl">  push negative pair 遠離（多個 negative samples 對比）</span></span></code></pre></div><p>主流形式：</p>
<table>
  <thead>
      <tr>
          <th>形式</th>
          <th>Loss 設計</th>
          <th>代表模型</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Triplet loss</td>
          <td>(anchor, positive, negative)、要求 anchor-positive 距離 &lt; anchor-negative</td>
          <td>早期 sentence-BERT</td>
      </tr>
      <tr>
          <td>InfoNCE / NCE</td>
          <td>Cross-entropy over batch、把 batch 內其他樣本當 hard negative</td>
          <td>OpenAI ada-002、bge 系列</td>
      </tr>
      <tr>
          <td>MultipleNegativesRankingLoss</td>
          <td>上述變體、用 batch 內隨機其他樣本當 negative</td>
          <td>Sentence-Transformers 主流</td>
      </tr>
  </tbody>
</table>
<p>關鍵特性：</p>
<ol>
<li><strong>資料量需求大</strong>：contrastive learning 需要億級的正向對才能訓出好 embedding；資料來源是 query-doc click log、StackExchange QA pair、CC-paraphrase 等</li>
<li><strong>Hard negative mining 是品質關鍵</strong>：隨機選 negative 容易（從 batch 取就行）、找「看似相關但實際無關」的 hard negative 更挑戰、是 embedding quality 提升的關鍵</li>
<li><strong>不能直接拿 pretrained LLM 用</strong>：LLM 的 hidden state 不是「為 retrieval 優化」的、要再 fine-tune 一輪 contrastive learning 才能當 embedding model</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 embedding model paper / 訓練 code 看到「InfoNCE」「triplet」「hard negatives」「mining strategy」就是這 paradigm。寫 code 場景的判讀：</p>
<ol>
<li><strong>挑 embedding model 看訓練資料 domain</strong>：通用 retrieval（如 bge-large、nomic-embed）vs code-specific（如 jina-embeddings-v2-code、CodeT5+）、訓練資料分佈影響大</li>
<li><strong>不能拿任意 LLM 抽 hidden state 當 embedding</strong>：如「Llama 的 last hidden state 當 embedding」這類做法在 retrieval 上通常顯著輸給專門 contrastive-trained embedding model</li>
<li><strong>Fine-tune embedding model 通常用 LoRA + contrastive loss</strong>：在自己 domain 資料上 fine-tune、提升 in-domain retrieval；標準 pipeline 是 sentence-transformers + LoRA</li>
</ol>
]]></content:encoded></item><item><title>Cross-Entropy</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/</guid><description>&lt;p>Cross-entropy（交叉熵）的核心概念是「衡量兩個機率分佈的距離」。LLM 預訓練的標準 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function&lt;/a> 是 cross-entropy：對每個 token、把模型預測的 vocab 機率分佈跟「真實答案是 one-hot 分佈」做 cross-entropy、加總。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Cross-entropy 在 next-token prediction 訓練裡的具體計算：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">模型預測：p = softmax(logits) ← shape: (vocab_size,)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">真實答案：y = one-hot(true_token) ← shape: (vocab_size,)、只有真實 token 那位是 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">cross-entropy = -sum(y_i × log(p_i))
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> = -log(p_true_token) ← 因為 y 是 one-hot、只剩這項&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以實作上 cross-entropy 就退化成「真實 token 預測機率的負對數」、機率越接近 1、loss 越接近 0；機率越接近 0、loss 越接近 ∞。&lt;/p>
&lt;p>跟相關概念的關係：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>概念&lt;/th>
 &lt;th>跟 cross-entropy 的關係&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">Perplexity&lt;/a>&lt;/td>
 &lt;td>&lt;code>perplexity = exp(cross-entropy)&lt;/code>、cross-entropy 的指數形式、人類直覺較好讀&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kl-divergence/" data-link-title="KL Divergence" data-link-desc="衡量「兩個機率分佈差距」的非對稱指標、RLHF / DPO 等 alignment 訓練的關鍵約束">KL divergence&lt;/a>&lt;/td>
 &lt;td>Cross-entropy = entropy(真實) + KL(真實 ‖ 預測)、訓練時 entropy 是常數、所以 minimize cross-entropy 等於 minimize KL&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/softmax/" data-link-title="Softmax" data-link-desc="把任意實數向量正規化成「總和為 1、每個分量 ∈ [0,1]」的機率分佈">Softmax&lt;/a>&lt;/td>
 &lt;td>Cross-entropy 通常吃 softmax 的輸出當「預測機率」&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 LLM 訓練 / paper 時看到「training loss」幾乎都是 cross-entropy。實務判讀：cross-entropy 直接代表「模型對真實 token 的預測機率有多差」、loss = 2 大致對應「真實 token 被預測機率 ≈ 0.135」（exp(-2)）。模型在 pretrain 階段 cross-entropy 從約 11（純隨機）降到約 2-3（成熟模型）、SFT 階段再略降。&lt;/p></description><content:encoded><![CDATA[<p>Cross-entropy（交叉熵）的核心概念是「衡量兩個機率分佈的距離」。LLM 預訓練的標準 <a href="/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function</a> 是 cross-entropy：對每個 token、把模型預測的 vocab 機率分佈跟「真實答案是 one-hot 分佈」做 cross-entropy、加總。</p>
<h2 id="概念位置">概念位置</h2>
<p>Cross-entropy 在 next-token prediction 訓練裡的具體計算：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">模型預測：p = softmax(logits)  ← shape: (vocab_size,)
</span></span><span class="line"><span class="ln">2</span><span class="cl">真實答案：y = one-hot(true_token)  ← shape: (vocab_size,)、只有真實 token 那位是 1
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl">cross-entropy = -sum(y_i × log(p_i))
</span></span><span class="line"><span class="ln">5</span><span class="cl">              = -log(p_true_token)  ← 因為 y 是 one-hot、只剩這項</span></span></code></pre></div><p>所以實作上 cross-entropy 就退化成「真實 token 預測機率的負對數」、機率越接近 1、loss 越接近 0；機率越接近 0、loss 越接近 ∞。</p>
<p>跟相關概念的關係：</p>
<table>
  <thead>
      <tr>
          <th>概念</th>
          <th>跟 cross-entropy 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">Perplexity</a></td>
          <td><code>perplexity = exp(cross-entropy)</code>、cross-entropy 的指數形式、人類直覺較好讀</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/kl-divergence/" data-link-title="KL Divergence" data-link-desc="衡量「兩個機率分佈差距」的非對稱指標、RLHF / DPO 等 alignment 訓練的關鍵約束">KL divergence</a></td>
          <td>Cross-entropy = entropy(真實) + KL(真實 ‖ 預測)、訓練時 entropy 是常數、所以 minimize cross-entropy 等於 minimize KL</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/softmax/" data-link-title="Softmax" data-link-desc="把任意實數向量正規化成「總和為 1、每個分量 ∈ [0,1]」的機率分佈">Softmax</a></td>
          <td>Cross-entropy 通常吃 softmax 的輸出當「預測機率」</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>讀 LLM 訓練 / paper 時看到「training loss」幾乎都是 cross-entropy。實務判讀：cross-entropy 直接代表「模型對真實 token 的預測機率有多差」、loss = 2 大致對應「真實 token 被預測機率 ≈ 0.135」（exp(-2)）。模型在 pretrain 階段 cross-entropy 從約 11（純隨機）降到約 2-3（成熟模型）、SFT 階段再略降。</p>
]]></content:encoded></item><item><title>DPO（Direct Preference Optimization）</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/dpo/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/dpo/</guid><description>&lt;p>DPO（Direct Preference Optimization、直接偏好最佳化）的核心概念是「&lt;strong>用人類偏好資料直接 fine-tune LLM、不訓 reward model、不用 RL&lt;/strong>」。Rafailov et al. (2023) 提出、用數學變形把 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF&lt;/a> 的「reward model + PPO」兩階段合併成單一個 supervised loss、訓練流程大幅簡化。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>DPO vs RLHF 的對比：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>RLHF&lt;/th>
 &lt;th>DPO&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>需要 reward model&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>否&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練步驟&lt;/td>
 &lt;td>收偏好 → 訓 RM → PPO&lt;/td>
 &lt;td>收偏好 → 直接 DPO loss fine-tune&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練穩定性&lt;/td>
 &lt;td>PPO 對 hyperparameter 敏感、容易不穩&lt;/td>
 &lt;td>像 supervised learning、相對穩&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>記憶體&lt;/td>
 &lt;td>三個模型同時運作（policy / RM / reference）&lt;/td>
 &lt;td>兩個（policy / reference frozen）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>KL 約束&lt;/td>
 &lt;td>顯式加 β × KL term&lt;/td>
 &lt;td>內嵌在 loss 公式裡、不用顯式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>流行度（2026）&lt;/td>
 &lt;td>商業大廠（OpenAI / Anthropic）&lt;/td>
 &lt;td>開源社群（Llama / Qwen / Gemma 系列許多用 DPO）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>DPO 的 loss 形式（簡化）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">loss = -log σ( β · (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> └─ 偏好 response 在 policy 跟 ref 的 ratio ─┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> └─ 拒絕 response 的同樣 ratio ─┘&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>直覺：讓 policy 對偏好 response 的機率增加（相對 ref）、對拒絕 response 的機率降低（相對 ref）。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀開源 LLM 的 paper / model card 看到「DPO-tuned」「preference fine-tuning」就是這個流程。實務上 DPO 訓練成本只是 RLHF 的一小部分、許多 fine-tune 平台（如 Hugging Face TRL）內建支援。後續還有 IPO、KTO、ORPO 等變體、都是「直接用偏好 fine-tune、不訓 reward」這條路線的進一步演化。&lt;/p></description><content:encoded><![CDATA[<p>DPO（Direct Preference Optimization、直接偏好最佳化）的核心概念是「<strong>用人類偏好資料直接 fine-tune LLM、不訓 reward model、不用 RL</strong>」。Rafailov et al. (2023) 提出、用數學變形把 <a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> 的「reward model + PPO」兩階段合併成單一個 supervised loss、訓練流程大幅簡化。</p>
<h2 id="概念位置">概念位置</h2>
<p>DPO vs RLHF 的對比：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>RLHF</th>
          <th>DPO</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>需要 reward model</td>
          <td>是</td>
          <td>否</td>
      </tr>
      <tr>
          <td>訓練步驟</td>
          <td>收偏好 → 訓 RM → PPO</td>
          <td>收偏好 → 直接 DPO loss fine-tune</td>
      </tr>
      <tr>
          <td>訓練穩定性</td>
          <td>PPO 對 hyperparameter 敏感、容易不穩</td>
          <td>像 supervised learning、相對穩</td>
      </tr>
      <tr>
          <td>記憶體</td>
          <td>三個模型同時運作（policy / RM / reference）</td>
          <td>兩個（policy / reference frozen）</td>
      </tr>
      <tr>
          <td>KL 約束</td>
          <td>顯式加 β × KL term</td>
          <td>內嵌在 loss 公式裡、不用顯式</td>
      </tr>
      <tr>
          <td>流行度（2026）</td>
          <td>商業大廠（OpenAI / Anthropic）</td>
          <td>開源社群（Llama / Qwen / Gemma 系列許多用 DPO）</td>
      </tr>
  </tbody>
</table>
<p>DPO 的 loss 形式（簡化）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">loss = -log σ( β · (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)) )
</span></span><span class="line"><span class="ln">2</span><span class="cl">                └─ 偏好 response 在 policy 跟 ref 的 ratio ─┘
</span></span><span class="line"><span class="ln">3</span><span class="cl">                                                            └─ 拒絕 response 的同樣 ratio ─┘</span></span></code></pre></div><p>直覺：讓 policy 對偏好 response 的機率增加（相對 ref）、對拒絕 response 的機率降低（相對 ref）。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀開源 LLM 的 paper / model card 看到「DPO-tuned」「preference fine-tuning」就是這個流程。實務上 DPO 訓練成本只是 RLHF 的一小部分、許多 fine-tune 平台（如 Hugging Face TRL）內建支援。後續還有 IPO、KTO、ORPO 等變體、都是「直接用偏好 fine-tune、不訓 reward」這條路線的進一步演化。</p>
]]></content:encoded></item><item><title>Forward Pass</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/forward-pass/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/forward-pass/</guid><description>&lt;p>Forward pass（前向傳播）的核心概念是「input 從第一層算到最後一層、得到 output 的單向計算流程」。LLM 推論時生成一個 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token&lt;/a>、就是跑一次 forward pass；訓練時、每個 batch 也都先跑 forward pass 算出 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss&lt;/a>、再跑 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> 算 gradient。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 一次 forward pass 的大略流程：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">input token IDs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> ↓ embedding layer：整數 → 向量
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">sequence of vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> ↓ Transformer block 1（attention + FFN）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> ↓ Transformer block 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> ↓ ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> ↓ Transformer block N
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">final hidden state
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> ↓ output projection（hidden → vocab）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">logits（每個 vocab token 一個分數）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> ↓ softmax（推論時）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">probability distribution → 挑下一個 token&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>跟相關概念的對比：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>概念&lt;/th>
 &lt;th>跟 forward pass 的關係&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/prefill/" data-link-title="Prefill" data-link-desc="Prompt 首次處理時的計算階段：把整段輸入跑過模型、產生 KV cache">Prefill&lt;/a>&lt;/td>
 &lt;td>Prompt 階段的「一次性 forward pass」、所有 prompt token 並行&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Decode 階段&lt;/td>
 &lt;td>每生一個 token 跑一次 forward pass、序列化、慢&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">Speculative decoding&lt;/a>&lt;/td>
 &lt;td>一次 forward pass 同時驗證多個猜測 token&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">Backpropagation&lt;/a>&lt;/td>
 &lt;td>訓練時 forward pass 的反向延伸、推論不需要&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 forward pass 後可以判讀 LLM 的記憶體與速度：每次 forward pass 都要把整份模型權重從記憶體讀到處理器一次、所以 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth&lt;/a> 是推論瓶頸；&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache&lt;/a> 的存在是為了避免每次 forward pass 重算前面 token 的 K/V；MTP / speculative decoding 都是「一次 forward pass 攤平多個 token 成本」的優化路徑。&lt;/p></description><content:encoded><![CDATA[<p>Forward pass（前向傳播）的核心概念是「input 從第一層算到最後一層、得到 output 的單向計算流程」。LLM 推論時生成一個 <a href="/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token</a>、就是跑一次 forward pass；訓練時、每個 batch 也都先跑 forward pass 算出 <a href="/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss</a>、再跑 <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> 算 gradient。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 一次 forward pass 的大略流程：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">input token IDs
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  ↓ embedding layer：整數 → 向量
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">sequence of vectors
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  ↓ Transformer block 1（attention + FFN）
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  ↓ Transformer block 2
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  ↓ ...
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  ↓ Transformer block N
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">final hidden state
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  ↓ output projection（hidden → vocab）
</span></span><span class="line"><span class="ln">10</span><span class="cl">logits（每個 vocab token 一個分數）
</span></span><span class="line"><span class="ln">11</span><span class="cl">  ↓ softmax（推論時）
</span></span><span class="line"><span class="ln">12</span><span class="cl">probability distribution → 挑下一個 token</span></span></code></pre></div><p>跟相關概念的對比：</p>
<table>
  <thead>
      <tr>
          <th>概念</th>
          <th>跟 forward pass 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/prefill/" data-link-title="Prefill" data-link-desc="Prompt 首次處理時的計算階段：把整段輸入跑過模型、產生 KV cache">Prefill</a></td>
          <td>Prompt 階段的「一次性 forward pass」、所有 prompt token 並行</td>
      </tr>
      <tr>
          <td>Decode 階段</td>
          <td>每生一個 token 跑一次 forward pass、序列化、慢</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">Speculative decoding</a></td>
          <td>一次 forward pass 同時驗證多個猜測 token</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">Backpropagation</a></td>
          <td>訓練時 forward pass 的反向延伸、推論不需要</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>理解 forward pass 後可以判讀 LLM 的記憶體與速度：每次 forward pass 都要把整份模型權重從記憶體讀到處理器一次、所以 <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a> 是推論瓶頸；<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 的存在是為了避免每次 forward pass 重算前面 token 的 K/V；MTP / speculative decoding 都是「一次 forward pass 攤平多個 token 成本」的優化路徑。</p>
]]></content:encoded></item><item><title>Gradient</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/</guid><description>&lt;p>Gradient（梯度）的核心概念是「&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function&lt;/a> 對每個權重的偏微分組成的向量」。每個分量回答「這個權重往正方向動一單位、loss 會變多少」、整個 gradient 向量指向「loss 上升最快的方向」、所以訓練時往&lt;strong>反方向&lt;/strong>走、就是讓 loss 下降最快的方向。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Gradient 連接「loss」跟「該怎麼更新權重」兩件事、是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> 算出來的東西、也是 SGD / Adam 等 optimizer 消費的輸入：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">[forward pass] → 算出 loss
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">[backpropagation] → 算出 gradient（每個權重一個值）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">[optimizer] → 用 gradient 更新權重：w_new = w_old - lr × gradient&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Gradient 在 LLM 訓練中的兩個常見問題：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>問題&lt;/th>
 &lt;th>訊號&lt;/th>
 &lt;th>處理&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Gradient 爆炸&lt;/td>
 &lt;td>loss 突然變 NaN、梯度 norm &amp;gt; 1000&lt;/td>
 &lt;td>Gradient clipping（截斷 norm 上限）、降 learning rate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Gradient 消失&lt;/td>
 &lt;td>深層權重幾乎不更新、loss 停在某 plateau&lt;/td>
 &lt;td>Residual connection、Layer normalization、改 activation function&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>推論階段（拿訓練好的模型生 token）&lt;strong>不需要算 gradient&lt;/strong>、只有 forward pass；gradient 只在訓練 / fine-tuning 階段出現。所以本地跑 LLM 寫 code 的場景不會碰到 gradient、但讀懂訓練流程、理解「為什麼 SFT / RLHF 需要 GPU、推論不一定要」這類判讀就要先理解 gradient 的角色。&lt;/p></description><content:encoded><![CDATA[<p>Gradient（梯度）的核心概念是「<a href="/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function</a> 對每個權重的偏微分組成的向量」。每個分量回答「這個權重往正方向動一單位、loss 會變多少」、整個 gradient 向量指向「loss 上升最快的方向」、所以訓練時往<strong>反方向</strong>走、就是讓 loss 下降最快的方向。</p>
<h2 id="概念位置">概念位置</h2>
<p>Gradient 連接「loss」跟「該怎麼更新權重」兩件事、是 <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> 算出來的東西、也是 SGD / Adam 等 optimizer 消費的輸入：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">[forward pass] → 算出 loss
</span></span><span class="line"><span class="ln">2</span><span class="cl">                    ↓
</span></span><span class="line"><span class="ln">3</span><span class="cl">[backpropagation] → 算出 gradient（每個權重一個值）
</span></span><span class="line"><span class="ln">4</span><span class="cl">                    ↓
</span></span><span class="line"><span class="ln">5</span><span class="cl">[optimizer] → 用 gradient 更新權重：w_new = w_old - lr × gradient</span></span></code></pre></div><p>Gradient 在 LLM 訓練中的兩個常見問題：</p>
<table>
  <thead>
      <tr>
          <th>問題</th>
          <th>訊號</th>
          <th>處理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Gradient 爆炸</td>
          <td>loss 突然變 NaN、梯度 norm &gt; 1000</td>
          <td>Gradient clipping（截斷 norm 上限）、降 learning rate</td>
      </tr>
      <tr>
          <td>Gradient 消失</td>
          <td>深層權重幾乎不更新、loss 停在某 plateau</td>
          <td>Residual connection、Layer normalization、改 activation function</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>推論階段（拿訓練好的模型生 token）<strong>不需要算 gradient</strong>、只有 forward pass；gradient 只在訓練 / fine-tuning 階段出現。所以本地跑 LLM 寫 code 的場景不會碰到 gradient、但讀懂訓練流程、理解「為什麼 SFT / RLHF 需要 GPU、推論不一定要」這類判讀就要先理解 gradient 的角色。</p>
]]></content:encoded></item><item><title>Gradient Explosion / Vanishing</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/gradient-explosion-vanishing/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/gradient-explosion-vanishing/</guid><description>&lt;p>Gradient explosion（爆炸）跟 gradient vanishing（消失）的核心概念是「深層網路的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> 透過 chain rule 一層層相乘、若每層 gradient &amp;gt; 1、累乘到輸入層會指數爆炸；若每層 gradient &amp;lt; 1、累乘到輸入層會衰減到接近 0」。兩者是深層網路訓不起來的典型病因、現代 Transformer 用 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual connection&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">layer normalization&lt;/a> 解決。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>兩種失敗模式的訊號跟處理：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>模式&lt;/th>
 &lt;th>訊號&lt;/th>
 &lt;th>主要成因&lt;/th>
 &lt;th>處理&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Gradient explosion&lt;/td>
 &lt;td>loss 突然變 NaN、gradient norm &amp;gt; 1000+&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/learning-rate/" data-link-title="Learning Rate" data-link-desc="gradient descent 每步更新權重的幅度、訓練中最敏感的 hyperparameter">Learning rate&lt;/a> 太大、初始化不當、loss 函數有奇點&lt;/td>
 &lt;td>Gradient clipping（截斷 norm 上限、如 1.0）、降低 lr、檢查資料 outliers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Gradient vanishing&lt;/td>
 &lt;td>深層權重幾乎不更新、loss 卡 plateau&lt;/td>
 &lt;td>層數深、activation 飽和區（sigmoid、tanh）、缺 skip connection&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">Residual connection&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">layer norm&lt;/a> + 換 activation（ReLU / GELU / SwiGLU）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>數學直覺（簡化）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">深 N 層的 chain rule：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">∂loss/∂W_input = ∂loss/∂out × ∂out/∂h_N × ∂h_N/∂h_{N-1} × ... × ∂h_1/∂W_input
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> └──────────── N 個 factor 連乘 ──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">若每個 factor ≈ 0.5、N=100：累乘 ≈ 0.5^100 ≈ 0 → vanishing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">若每個 factor ≈ 1.5、N=100：累乘 ≈ 1.5^100 ≈ 4e17 → explosion&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">Residual connection&lt;/a> 讓 gradient 有「捷徑」可走、不全靠 chain rule 一層層乘、是深層 Transformer 訓得起來的核心結構之一。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀訓練 log 看到 &lt;code>loss: nan&lt;/code>、&lt;code>grad_norm: inf&lt;/code> 就是 explosion；看到 loss 平穩、幾個 epoch 都不降就是可能的 vanishing。寫 code 場景幾乎不會碰到（推論不算 gradient）、但自己 fine-tune 時要會判讀。LLM 用的 SwiGLU / GELU 都是 saturation 較不嚴重的 activation、加上 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">pre-norm&lt;/a>、現代 Transformer 訓 100+ 層相對穩定。&lt;/p></description><content:encoded><![CDATA[<p>Gradient explosion（爆炸）跟 gradient vanishing（消失）的核心概念是「深層網路的 <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> 透過 chain rule 一層層相乘、若每層 gradient &gt; 1、累乘到輸入層會指數爆炸；若每層 gradient &lt; 1、累乘到輸入層會衰減到接近 0」。兩者是深層網路訓不起來的典型病因、現代 Transformer 用 <a href="/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual connection</a> + <a href="/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">layer normalization</a> 解決。</p>
<h2 id="概念位置">概念位置</h2>
<p>兩種失敗模式的訊號跟處理：</p>
<table>
  <thead>
      <tr>
          <th>模式</th>
          <th>訊號</th>
          <th>主要成因</th>
          <th>處理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Gradient explosion</td>
          <td>loss 突然變 NaN、gradient norm &gt; 1000+</td>
          <td><a href="/blog/llm/knowledge-cards/learning-rate/" data-link-title="Learning Rate" data-link-desc="gradient descent 每步更新權重的幅度、訓練中最敏感的 hyperparameter">Learning rate</a> 太大、初始化不當、loss 函數有奇點</td>
          <td>Gradient clipping（截斷 norm 上限、如 1.0）、降低 lr、檢查資料 outliers</td>
      </tr>
      <tr>
          <td>Gradient vanishing</td>
          <td>深層權重幾乎不更新、loss 卡 plateau</td>
          <td>層數深、activation 飽和區（sigmoid、tanh）、缺 skip connection</td>
          <td><a href="/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">Residual connection</a> + <a href="/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">layer norm</a> + 換 activation（ReLU / GELU / SwiGLU）</td>
      </tr>
  </tbody>
</table>
<p>數學直覺（簡化）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">深 N 層的 chain rule：
</span></span><span class="line"><span class="ln">2</span><span class="cl">∂loss/∂W_input = ∂loss/∂out × ∂out/∂h_N × ∂h_N/∂h_{N-1} × ... × ∂h_1/∂W_input
</span></span><span class="line"><span class="ln">3</span><span class="cl">                                └──────────── N 個 factor 連乘 ──────────────┘
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl">若每個 factor ≈ 0.5、N=100：累乘 ≈ 0.5^100 ≈ 0       → vanishing
</span></span><span class="line"><span class="ln">6</span><span class="cl">若每個 factor ≈ 1.5、N=100：累乘 ≈ 1.5^100 ≈ 4e17    → explosion</span></span></code></pre></div><p><a href="/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">Residual connection</a> 讓 gradient 有「捷徑」可走、不全靠 chain rule 一層層乘、是深層 Transformer 訓得起來的核心結構之一。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀訓練 log 看到 <code>loss: nan</code>、<code>grad_norm: inf</code> 就是 explosion；看到 loss 平穩、幾個 epoch 都不降就是可能的 vanishing。寫 code 場景幾乎不會碰到（推論不算 gradient）、但自己 fine-tune 時要會判讀。LLM 用的 SwiGLU / GELU 都是 saturation 較不嚴重的 activation、加上 <a href="/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual</a> + <a href="/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">pre-norm</a>、現代 Transformer 訓 100+ 層相對穩定。</p>
]]></content:encoded></item><item><title>KL Divergence</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/kl-divergence/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/kl-divergence/</guid><description>&lt;p>KL divergence（Kullback-Leibler divergence、KL 散度）的核心概念是「衡量兩個機率分佈 P 跟 Q 的差距」：&lt;code>KL(P ‖ Q) = sum(P(x) × log(P(x) / Q(x)))&lt;/code>。它&lt;strong>不對稱&lt;/strong>（&lt;code>KL(P ‖ Q) ≠ KL(Q ‖ P)&lt;/code>）、所以不算「距離」、是「散度」。在 LLM 訓練中是 alignment 階段防止模型「為了 reward 偏離太遠」的關鍵約束。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>KL divergence 在 LLM 中的兩個主要角色：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy&lt;/a> 的關係&lt;/strong>：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">cross-entropy(P, Q) = entropy(P) + KL(P ‖ Q)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>訓練時 P（真實分佈）固定、entropy(P) 是常數、所以「minimize cross-entropy」等於「minimize KL」。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>RLHF / DPO 的「KL 約束」&lt;/strong>：&lt;/p>
&lt;p>alignment 階段不能只 maximize reward、否則模型會「為了 reward 把語言能力毀掉」。所以加 KL 約束：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">objective = E[reward] - β × KL(π_new ‖ π_ref)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> └─ 不讓新模型偏離 ref（通常是 SFT 後的 base）太遠 ─┘&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>β 控制「reward 追求」vs「不偏離原始模型」的平衡。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>跟相關概念的對比：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>指標&lt;/th>
 &lt;th>對稱？&lt;/th>
 &lt;th>主要用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Cross-entropy&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>訓練 loss、衡量預測機率分佈跟真實分佈&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>KL divergence&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>Alignment 訓練的偏離約束&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JS divergence&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>兩個分佈的對稱差距、研究比較多&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 alignment paper 看到 β、KL penalty、KL coefficient 等詞、知道這些是控制「模型在追 reward 時偏離 base 多遠的容忍度」。β 太小、模型容易 reward hacking（找 reward 高但實質爛的輸出）；β 太大、模型動不了、reward 升不上去。DPO 把 KL 約束內嵌進 loss、不像 RLHF 需要顯式 KL term、是 DPO 比 RLHF 簡單的原因之一。&lt;/p></description><content:encoded><![CDATA[<p>KL divergence（Kullback-Leibler divergence、KL 散度）的核心概念是「衡量兩個機率分佈 P 跟 Q 的差距」：<code>KL(P ‖ Q) = sum(P(x) × log(P(x) / Q(x)))</code>。它<strong>不對稱</strong>（<code>KL(P ‖ Q) ≠ KL(Q ‖ P)</code>）、所以不算「距離」、是「散度」。在 LLM 訓練中是 alignment 階段防止模型「為了 reward 偏離太遠」的關鍵約束。</p>
<h2 id="概念位置">概念位置</h2>
<p>KL divergence 在 LLM 中的兩個主要角色：</p>
<ol>
<li>
<p><strong>跟 <a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy</a> 的關係</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">cross-entropy(P, Q) = entropy(P) + KL(P ‖ Q)</span></span></code></pre></div><p>訓練時 P（真實分佈）固定、entropy(P) 是常數、所以「minimize cross-entropy」等於「minimize KL」。</p>
</li>
<li>
<p><strong>RLHF / DPO 的「KL 約束」</strong>：</p>
<p>alignment 階段不能只 maximize reward、否則模型會「為了 reward 把語言能力毀掉」。所以加 KL 約束：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">objective = E[reward] - β × KL(π_new ‖ π_ref)
</span></span><span class="line"><span class="ln">2</span><span class="cl">                         └─ 不讓新模型偏離 ref（通常是 SFT 後的 base）太遠 ─┘</span></span></code></pre></div><p>β 控制「reward 追求」vs「不偏離原始模型」的平衡。</p>
</li>
</ol>
<p>跟相關概念的對比：</p>
<table>
  <thead>
      <tr>
          <th>指標</th>
          <th>對稱？</th>
          <th>主要用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cross-entropy</td>
          <td>否</td>
          <td>訓練 loss、衡量預測機率分佈跟真實分佈</td>
      </tr>
      <tr>
          <td>KL divergence</td>
          <td>否</td>
          <td>Alignment 訓練的偏離約束</td>
      </tr>
      <tr>
          <td>JS divergence</td>
          <td>是</td>
          <td>兩個分佈的對稱差距、研究比較多</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>讀 alignment paper 看到 β、KL penalty、KL coefficient 等詞、知道這些是控制「模型在追 reward 時偏離 base 多遠的容忍度」。β 太小、模型容易 reward hacking（找 reward 高但實質爛的輸出）；β 太大、模型動不了、reward 升不上去。DPO 把 KL 約束內嵌進 loss、不像 RLHF 需要顯式 KL term、是 DPO 比 RLHF 簡單的原因之一。</p>
]]></content:encoded></item><item><title>Layer Normalization</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/</guid><description>&lt;p>Layer normalization（LayerNorm）的核心概念是「對單一 token 的 hidden state 向量做正規化」——把該向量的 mean 移到 0、std 縮到 1、再用兩個可學參數做仿射變換。它是 Transformer 穩定深層訓練的關鍵元件、跟 batch normalization 的差別是「正規化軸不同」、LayerNorm 對單個 sample 內部做、不依賴 batch 統計。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LayerNorm 在 Transformer block 內的位置（現代主流是 pre-norm）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">Transformer block（pre-norm 配置）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> ↓ LayerNorm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↓ Self-Attention
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> ↓ + 跟 x 做 residual connection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> ↓ LayerNorm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl"> ↓ FFN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl"> ↓ + 跟前一步輸出做 residual connection&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主流變體比較：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>變體&lt;/th>
 &lt;th>計算&lt;/th>
 &lt;th>出現在&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>LayerNorm&lt;/td>
 &lt;td>&lt;code>(x - mean) / std × γ + β&lt;/code>&lt;/td>
 &lt;td>早期 Transformer（GPT-2、BERT）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>RMSNorm&lt;/td>
 &lt;td>&lt;code>x / rms(x) × γ&lt;/code>（不減 mean、不加 β）&lt;/td>
 &lt;td>Llama、Gemma、Qwen 等主流&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>RMSNorm 比 LayerNorm 簡單、實測訓練穩定性接近、推論更快（少算 mean 跟加 β）、所以現代 LLM 多用 RMSNorm。讀 paper 看到「RMSNorm」就是 LayerNorm 的這個簡化變體。&lt;/p>
&lt;p>Pre-norm vs post-norm：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pre-norm&lt;/strong>（LayerNorm 在 attention / FFN 之前）：深度模型訓練較穩、現代主流。&lt;/li>
&lt;li>&lt;strong>Post-norm&lt;/strong>（LayerNorm 在 residual add 之後）：原始 Transformer paper 的設計、深層訓練不穩定。&lt;/li>
&lt;/ul>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 LayerNorm 後可以判讀「深層 LLM 為什麼訓得起來」的部分答案：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual connection&lt;/a> + LayerNorm 是讓梯度能穩定流過幾十層 Transformer 的兩根支柱。讀 model card 看到「RMSNorm」「pre-norm」等詞、知道對應的設計選擇跟訓練穩定性意涵。&lt;/p></description><content:encoded><![CDATA[<p>Layer normalization（LayerNorm）的核心概念是「對單一 token 的 hidden state 向量做正規化」——把該向量的 mean 移到 0、std 縮到 1、再用兩個可學參數做仿射變換。它是 Transformer 穩定深層訓練的關鍵元件、跟 batch normalization 的差別是「正規化軸不同」、LayerNorm 對單個 sample 內部做、不依賴 batch 統計。</p>
<h2 id="概念位置">概念位置</h2>
<p>LayerNorm 在 Transformer block 內的位置（現代主流是 pre-norm）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">Transformer block（pre-norm 配置）：
</span></span><span class="line"><span class="ln">2</span><span class="cl">  x
</span></span><span class="line"><span class="ln">3</span><span class="cl">  ↓ LayerNorm
</span></span><span class="line"><span class="ln">4</span><span class="cl">  ↓ Self-Attention
</span></span><span class="line"><span class="ln">5</span><span class="cl">  ↓ + 跟 x 做 residual connection
</span></span><span class="line"><span class="ln">6</span><span class="cl">  ↓ LayerNorm
</span></span><span class="line"><span class="ln">7</span><span class="cl">  ↓ FFN
</span></span><span class="line"><span class="ln">8</span><span class="cl">  ↓ + 跟前一步輸出做 residual connection</span></span></code></pre></div><p>主流變體比較：</p>
<table>
  <thead>
      <tr>
          <th>變體</th>
          <th>計算</th>
          <th>出現在</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>LayerNorm</td>
          <td><code>(x - mean) / std × γ + β</code></td>
          <td>早期 Transformer（GPT-2、BERT）</td>
      </tr>
      <tr>
          <td>RMSNorm</td>
          <td><code>x / rms(x) × γ</code>（不減 mean、不加 β）</td>
          <td>Llama、Gemma、Qwen 等主流</td>
      </tr>
  </tbody>
</table>
<p>RMSNorm 比 LayerNorm 簡單、實測訓練穩定性接近、推論更快（少算 mean 跟加 β）、所以現代 LLM 多用 RMSNorm。讀 paper 看到「RMSNorm」就是 LayerNorm 的這個簡化變體。</p>
<p>Pre-norm vs post-norm：</p>
<ul>
<li><strong>Pre-norm</strong>（LayerNorm 在 attention / FFN 之前）：深度模型訓練較穩、現代主流。</li>
<li><strong>Post-norm</strong>（LayerNorm 在 residual add 之後）：原始 Transformer paper 的設計、深層訓練不穩定。</li>
</ul>
<h2 id="設計責任">設計責任</h2>
<p>理解 LayerNorm 後可以判讀「深層 LLM 為什麼訓得起來」的部分答案：<a href="/blog/llm/knowledge-cards/residual-connection/" data-link-title="Residual Connection" data-link-desc="把 layer 的輸入直接加到輸出上的「跳接」、讓深層網路的梯度能穩定回流">residual connection</a> + LayerNorm 是讓梯度能穩定流過幾十層 Transformer 的兩根支柱。讀 model card 看到「RMSNorm」「pre-norm」等詞、知道對應的設計選擇跟訓練穩定性意涵。</p>
]]></content:encoded></item><item><title>Learning Rate</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/learning-rate/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/learning-rate/</guid><description>&lt;p>Learning rate（學習率、lr、α、η）的核心概念是「&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a> 每步更新權重時、被乘上的純量縮放因子」。更新公式 &lt;code>W_new = W_old - lr × gradient&lt;/code> 裡的 lr 就是它。是訓練最敏感的單一 hyperparameter — 太大會 diverge（loss 飛走）、太小會訓得超慢或卡 local minimum。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 訓練 learning rate 的常見模式：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>階段&lt;/th>
 &lt;th>典型 lr&lt;/th>
 &lt;th>理由&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">Pre-training&lt;/a>&lt;/td>
 &lt;td>1e-4 ~ 3e-4&lt;/td>
 &lt;td>訓 trillion token、需要溫和的 lr 避免 diverge&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT&lt;/a>&lt;/td>
 &lt;td>1e-5 ~ 5e-5&lt;/td>
 &lt;td>base model 已收斂、用小 lr 微調避免 overshoot&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO&lt;/a>&lt;/td>
 &lt;td>1e-7 ~ 1e-6&lt;/td>
 &lt;td>又比 SFT 更小、避免破壞 SFT 學到的對話能力&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA&lt;/a> fine-tune&lt;/td>
 &lt;td>1e-4 ~ 5e-4&lt;/td>
 &lt;td>只訓小 adapter、可用較大 lr&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Learning rate schedule（lr 隨訓練步數調整）的主流模式：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Warmup&lt;/strong>：訓練最初幾百 ~ 幾千 step、lr 從 0 線性升到目標值。避免初期 gradient 大、模型瞬間 diverge。&lt;/li>
&lt;li>&lt;strong>Cosine decay&lt;/strong>：warmup 後、lr 用 cosine 函數從目標值降到接近 0。訓練後期細調。&lt;/li>
&lt;li>&lt;strong>WSD（Warmup-Stable-Decay）&lt;/strong>：近期變體、中間維持高 lr 更久。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 training config 看到 &lt;code>learning_rate&lt;/code>、&lt;code>lr_scheduler_type: cosine&lt;/code>、&lt;code>warmup_steps: 1000&lt;/code> 等就是這組設定。Fine-tune 時 lr 設太大、模型會「忘記」pre-training 學到的能力（catastrophic forgetting）；太小則訓不進新資料、loss 不降。實務除錯：fine-tune 時 loss 第一個 epoch 就 NaN、十之八九是 lr 太大；loss 完全不降、十之八九是 lr 太小或 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a> 沒流到要訓的權重。&lt;/p></description><content:encoded><![CDATA[<p>Learning rate（學習率、lr、α、η）的核心概念是「<a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> 每步更新權重時、被乘上的純量縮放因子」。更新公式 <code>W_new = W_old - lr × gradient</code> 裡的 lr 就是它。是訓練最敏感的單一 hyperparameter — 太大會 diverge（loss 飛走）、太小會訓得超慢或卡 local minimum。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 訓練 learning rate 的常見模式：</p>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>典型 lr</th>
          <th>理由</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">Pre-training</a></td>
          <td>1e-4 ~ 3e-4</td>
          <td>訓 trillion token、需要溫和的 lr 避免 diverge</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT</a></td>
          <td>1e-5 ~ 5e-5</td>
          <td>base model 已收斂、用小 lr 微調避免 overshoot</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> / <a href="/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO</a></td>
          <td>1e-7 ~ 1e-6</td>
          <td>又比 SFT 更小、避免破壞 SFT 學到的對話能力</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> fine-tune</td>
          <td>1e-4 ~ 5e-4</td>
          <td>只訓小 adapter、可用較大 lr</td>
      </tr>
  </tbody>
</table>
<p>Learning rate schedule（lr 隨訓練步數調整）的主流模式：</p>
<ol>
<li><strong>Warmup</strong>：訓練最初幾百 ~ 幾千 step、lr 從 0 線性升到目標值。避免初期 gradient 大、模型瞬間 diverge。</li>
<li><strong>Cosine decay</strong>：warmup 後、lr 用 cosine 函數從目標值降到接近 0。訓練後期細調。</li>
<li><strong>WSD（Warmup-Stable-Decay）</strong>：近期變體、中間維持高 lr 更久。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 training config 看到 <code>learning_rate</code>、<code>lr_scheduler_type: cosine</code>、<code>warmup_steps: 1000</code> 等就是這組設定。Fine-tune 時 lr 設太大、模型會「忘記」pre-training 學到的能力（catastrophic forgetting）；太小則訓不進新資料、loss 不降。實務除錯：fine-tune 時 loss 第一個 epoch 就 NaN、十之八九是 lr 太大；loss 完全不降、十之八九是 lr 太小或 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> 沒流到要訓的權重。</p>
]]></content:encoded></item><item><title>LoRA</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/lora/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/lora/</guid><description>&lt;p>LoRA（Low-Rank Adaptation、低秩適配）的核心概念是「&lt;strong>凍住原模型所有權重、在指定 layer 旁邊掛兩個小矩陣 A、B（rank 很低、如 r=8）、只訓 A、B&lt;/strong>」。Hu et al. (2021) 提出、是現在 fine-tuning 的主流選擇、大幅降低訓練成本與記憶體需求。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LoRA 的數學形式：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">原 layer 輸出：y = W × x （W 凍住）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">加 LoRA 後： y = W × x + B × A × x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> └──┬──┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> LoRA update（rank r）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> A shape: (r, hidden_dim)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> B shape: (hidden_dim, r)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>關鍵特性：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>完整 fine-tuning&lt;/th>
 &lt;th>LoRA fine-tuning（r=16）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>可訓練參數&lt;/td>
 &lt;td>全部（如 7B、70B）&lt;/td>
 &lt;td>~0.1% ~ 1%（只 A、B）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GPU 記憶體&lt;/td>
 &lt;td>高（要存所有 gradient）&lt;/td>
 &lt;td>大幅降低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Adapter 檔案大小&lt;/td>
 &lt;td>跟原模型同大&lt;/td>
 &lt;td>幾 MB ~ 幾百 MB&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練成本&lt;/td>
 &lt;td>全模型 backprop&lt;/td>
 &lt;td>只算 A、B 的 gradient&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>部署&lt;/td>
 &lt;td>載入新模型&lt;/td>
 &lt;td>載入原模型 + adapter、推論時合併&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>多任務切換&lt;/td>
 &lt;td>載入不同模型&lt;/td>
 &lt;td>切換 adapter 即可（同個底）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>QLoRA（Dettmers et al., 2023）進一步把原模型量化到 4-bit、LoRA 訓在量化模型上、消費級 GPU 也能 fine-tune 大模型。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 fine-tuning 教學 / Hugging Face PEFT 看到 LoRA、QLoRA 是現在主流。寫 code 場景的判讀：LoRA 適合「在現有模型上加領域知識 / 風格」（如教模型用特定 codebase 慣例）、不適合「教模型新世界知識」（仍要 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">pre-training&lt;/a> 級資料）；adapter 形式讓「多客戶 / 多風格」場景可以共用 base model、只切換 adapter、節省 GPU 記憶體。&lt;/p></description><content:encoded><![CDATA[<p>LoRA（Low-Rank Adaptation、低秩適配）的核心概念是「<strong>凍住原模型所有權重、在指定 layer 旁邊掛兩個小矩陣 A、B（rank 很低、如 r=8）、只訓 A、B</strong>」。Hu et al. (2021) 提出、是現在 fine-tuning 的主流選擇、大幅降低訓練成本與記憶體需求。</p>
<h2 id="概念位置">概念位置</h2>
<p>LoRA 的數學形式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">原 layer 輸出：y = W × x       （W 凍住）
</span></span><span class="line"><span class="ln">2</span><span class="cl">加 LoRA 後：  y = W × x + B × A × x
</span></span><span class="line"><span class="ln">3</span><span class="cl">                          └──┬──┘
</span></span><span class="line"><span class="ln">4</span><span class="cl">                       LoRA update（rank r）
</span></span><span class="line"><span class="ln">5</span><span class="cl">                       A shape: (r, hidden_dim)
</span></span><span class="line"><span class="ln">6</span><span class="cl">                       B shape: (hidden_dim, r)</span></span></code></pre></div><p>關鍵特性：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>完整 fine-tuning</th>
          <th>LoRA fine-tuning（r=16）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>可訓練參數</td>
          <td>全部（如 7B、70B）</td>
          <td>~0.1% ~ 1%（只 A、B）</td>
      </tr>
      <tr>
          <td>GPU 記憶體</td>
          <td>高（要存所有 gradient）</td>
          <td>大幅降低</td>
      </tr>
      <tr>
          <td>Adapter 檔案大小</td>
          <td>跟原模型同大</td>
          <td>幾 MB ~ 幾百 MB</td>
      </tr>
      <tr>
          <td>訓練成本</td>
          <td>全模型 backprop</td>
          <td>只算 A、B 的 gradient</td>
      </tr>
      <tr>
          <td>部署</td>
          <td>載入新模型</td>
          <td>載入原模型 + adapter、推論時合併</td>
      </tr>
      <tr>
          <td>多任務切換</td>
          <td>載入不同模型</td>
          <td>切換 adapter 即可（同個底）</td>
      </tr>
  </tbody>
</table>
<p>QLoRA（Dettmers et al., 2023）進一步把原模型量化到 4-bit、LoRA 訓在量化模型上、消費級 GPU 也能 fine-tune 大模型。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀 fine-tuning 教學 / Hugging Face PEFT 看到 LoRA、QLoRA 是現在主流。寫 code 場景的判讀：LoRA 適合「在現有模型上加領域知識 / 風格」（如教模型用特定 codebase 慣例）、不適合「教模型新世界知識」（仍要 <a href="/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">pre-training</a> 級資料）；adapter 形式讓「多客戶 / 多風格」場景可以共用 base model、只切換 adapter、節省 GPU 記憶體。</p>
]]></content:encoded></item><item><title>Loss Function</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/</guid><description>&lt;p>Loss function（損失函數、目的函數）的核心概念是「把模型預測跟正確答案的差距、壓成一個純量數值」。訓練的整個目標就是「最小化這個數值」、所有 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> / optimizer step 都在做這件事。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 各訓練階段用不同的 loss function：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>階段&lt;/th>
 &lt;th>主要 loss&lt;/th>
 &lt;th>衡量的東西&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Pre-training&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">Cross-entropy&lt;/a>（next-token prediction）&lt;/td>
 &lt;td>模型預測的下個 token 機率跟真實答案的距離&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SFT&lt;/td>
 &lt;td>Cross-entropy（同上、但 only on assistant response）&lt;/td>
 &lt;td>模型回答跟人類示範回答的距離&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Reward model&lt;/td>
 &lt;td>Pairwise ranking loss&lt;/td>
 &lt;td>「人類偏好 A 大於 B」這個訊號的擬合度&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>RLHF / DPO&lt;/td>
 &lt;td>KL-constrained reward loss / DPO loss&lt;/td>
 &lt;td>reward 高 + 不偏離 base 模型太遠&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>評估時用的指標（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">perplexity&lt;/a>、accuracy、BLEU 等）跟訓練 loss 是不同概念：loss 是「訓練要 minimize 的東西」、指標是「給人看模型好不好的數字」、兩者不一定一致（loss 降但指標不一定升、反之亦然）。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>選 loss function 等於選「訓練要把模型推往哪個方向」。Cross-entropy 推「機率分佈接近真實 token」、reward model 推「人類偏好高的回應」、DPO 推「偏好回應 vs 拒絕回應的對比」— 每種 loss 對應的模型行為不同。讀 paper 看到「我們用 X loss」、要回問「這 loss 把模型推往哪個方向」、才能判斷模型訓練出來的特性是否符合預期。&lt;/p></description><content:encoded><![CDATA[<p>Loss function（損失函數、目的函數）的核心概念是「把模型預測跟正確答案的差距、壓成一個純量數值」。訓練的整個目標就是「最小化這個數值」、所有 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> / <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> / optimizer step 都在做這件事。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 各訓練階段用不同的 loss function：</p>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>主要 loss</th>
          <th>衡量的東西</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Pre-training</td>
          <td><a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">Cross-entropy</a>（next-token prediction）</td>
          <td>模型預測的下個 token 機率跟真實答案的距離</td>
      </tr>
      <tr>
          <td>SFT</td>
          <td>Cross-entropy（同上、但 only on assistant response）</td>
          <td>模型回答跟人類示範回答的距離</td>
      </tr>
      <tr>
          <td>Reward model</td>
          <td>Pairwise ranking loss</td>
          <td>「人類偏好 A 大於 B」這個訊號的擬合度</td>
      </tr>
      <tr>
          <td>RLHF / DPO</td>
          <td>KL-constrained reward loss / DPO loss</td>
          <td>reward 高 + 不偏離 base 模型太遠</td>
      </tr>
  </tbody>
</table>
<p>評估時用的指標（<a href="/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">perplexity</a>、accuracy、BLEU 等）跟訓練 loss 是不同概念：loss 是「訓練要 minimize 的東西」、指標是「給人看模型好不好的數字」、兩者不一定一致（loss 降但指標不一定升、反之亦然）。</p>
<h2 id="設計責任">設計責任</h2>
<p>選 loss function 等於選「訓練要把模型推往哪個方向」。Cross-entropy 推「機率分佈接近真實 token」、reward model 推「人類偏好高的回應」、DPO 推「偏好回應 vs 拒絕回應的對比」— 每種 loss 對應的模型行為不同。讀 paper 看到「我們用 X loss」、要回問「這 loss 把模型推往哪個方向」、才能判斷模型訓練出來的特性是否符合預期。</p>
]]></content:encoded></item><item><title>Pre-training</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/</guid><description>&lt;p>Pre-training（預訓練）的核心概念是「在大量未標註文字上、用 next-token prediction 當目標訓練一個語言模型」。產出的權重稱為 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model&lt;/a>、是後續 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF&lt;/a> 的起點。Pre-training 是 LLM 三階段訓練流程中&lt;strong>最貴、最耗時、最決定模型上限&lt;/strong>的階段。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Pre-training 在 LLM 訓練 pipeline 的位置：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">[網路文字 / 書籍 / code / 論文]（trillion token 級）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↓ Pre-training（next-token prediction、cross-entropy loss）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">[Base model]：會接龍但不會對話
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↓ SFT（指令-回答對資料）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">[Instruction-tuned model]：會跟指令走
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> ↓ RLHF / DPO（人類偏好資料）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">[Aligned model]：對話風格 / 安全性對齊&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Pre-training 的特性：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>典型數字（2026 年主流大模型）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>資料量&lt;/td>
 &lt;td>數兆 token（Common Crawl、RefinedWeb、The Pile、Stack 等）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GPU 用量&lt;/td>
 &lt;td>數百到數萬張 H100 / B200、並行訓練&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練時間&lt;/td>
 &lt;td>數週到數月&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>成本級別&lt;/td>
 &lt;td>數百萬到數億美元&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Loss&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">Cross-entropy&lt;/a> on next-token&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>結果&lt;/td>
 &lt;td>「會接龍」的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model&lt;/a>、可用 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">perplexity&lt;/a> 評估&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 pre-training 後可以判讀幾件事：模型的「世界知識」絕大部分在 pre-training 時就決定了、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF&lt;/a> 只是「教模型怎麼用這些知識回答」、不會大幅增加新知識；模型 cutoff date 就是 pre-training 資料的截止；想做新領域知識引入、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG&lt;/a> 比繼續 fine-tune 划算（pre-training 太貴、且 fine-tune 容易讓既有能力退化）。&lt;/p></description><content:encoded><![CDATA[<p>Pre-training（預訓練）的核心概念是「在大量未標註文字上、用 next-token prediction 當目標訓練一個語言模型」。產出的權重稱為 <a href="/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model</a>、是後續 <a href="/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT</a> / <a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> 的起點。Pre-training 是 LLM 三階段訓練流程中<strong>最貴、最耗時、最決定模型上限</strong>的階段。</p>
<h2 id="概念位置">概念位置</h2>
<p>Pre-training 在 LLM 訓練 pipeline 的位置：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">[網路文字 / 書籍 / code / 論文]（trillion token 級）
</span></span><span class="line"><span class="ln">2</span><span class="cl">   ↓ Pre-training（next-token prediction、cross-entropy loss）
</span></span><span class="line"><span class="ln">3</span><span class="cl">[Base model]：會接龍但不會對話
</span></span><span class="line"><span class="ln">4</span><span class="cl">   ↓ SFT（指令-回答對資料）
</span></span><span class="line"><span class="ln">5</span><span class="cl">[Instruction-tuned model]：會跟指令走
</span></span><span class="line"><span class="ln">6</span><span class="cl">   ↓ RLHF / DPO（人類偏好資料）
</span></span><span class="line"><span class="ln">7</span><span class="cl">[Aligned model]：對話風格 / 安全性對齊</span></span></code></pre></div><p>Pre-training 的特性：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>典型數字（2026 年主流大模型）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>資料量</td>
          <td>數兆 token（Common Crawl、RefinedWeb、The Pile、Stack 等）</td>
      </tr>
      <tr>
          <td>GPU 用量</td>
          <td>數百到數萬張 H100 / B200、並行訓練</td>
      </tr>
      <tr>
          <td>訓練時間</td>
          <td>數週到數月</td>
      </tr>
      <tr>
          <td>成本級別</td>
          <td>數百萬到數億美元</td>
      </tr>
      <tr>
          <td>Loss</td>
          <td><a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">Cross-entropy</a> on next-token</td>
      </tr>
      <tr>
          <td>結果</td>
          <td>「會接龍」的 <a href="/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model</a>、可用 <a href="/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">perplexity</a> 評估</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>理解 pre-training 後可以判讀幾件事：模型的「世界知識」絕大部分在 pre-training 時就決定了、<a href="/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT</a> / <a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> 只是「教模型怎麼用這些知識回答」、不會大幅增加新知識；模型 cutoff date 就是 pre-training 資料的截止；想做新領域知識引入、<a href="/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG</a> 比繼續 fine-tune 划算（pre-training 太貴、且 fine-tune 容易讓既有能力退化）。</p>
]]></content:encoded></item><item><title>Residual Connection</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/residual-connection/</guid><description>&lt;p>Residual connection（殘差連接、skip connection）的核心概念是「把 layer 的輸入直接加到輸出上」、形式是 &lt;code>output = layer(x) + x&lt;/code>。這個簡單加法解決了深層網路的訓練退化問題：沒有 residual、模型加深會反而變差（不是過擬合、是 gradient 在反向傳播中衰減太多）；有 residual、訓練幾十甚至上百層都穩。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Residual connection 在 Transformer block 中出現兩次：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">Transformer block：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> ├──────────────┐ ← skip connection（保留原始 x）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> LayerNorm │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> Self-Attention │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> +←─────────────┘ ← residual add：attention output + x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> ├──────────────┐ ← skip connection（保留 attention 後的值）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> LayerNorm │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl"> FFN │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl"> ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> +←─────────────┘ ← residual add：FFN output + previous
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> 進入下一個 block&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>關鍵性質：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Gradient 可以走捷徑&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">Backpropagation&lt;/a> 時、gradient 能透過 skip connection 直接傳回淺層、避免 chain rule 累積衰減。&lt;/li>
&lt;li>&lt;strong>Layer 學「殘差」而不是「完整轉換」&lt;/strong>：每層學「該怎麼微調輸入」、不用學「從零生成輸出」、優化更容易。&lt;/li>
&lt;li>&lt;strong>跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">LayerNorm&lt;/a> 配對&lt;/strong>：兩者一起是深層 Transformer 訓得起來的基礎。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 residual connection 後可以判讀 Transformer 能堆幾十層的根本原因（不是因為 attention、是因為 residual + LayerNorm 讓深層仍可訓練）；也能看懂 ResNet、ViT 等其他用 residual 架構的設計。LLM 推論時 residual 不算 bottleneck、但在訓練 / fine-tune 時、residual 是 gradient flow 健康度的關鍵。&lt;/p></description><content:encoded><![CDATA[<p>Residual connection（殘差連接、skip connection）的核心概念是「把 layer 的輸入直接加到輸出上」、形式是 <code>output = layer(x) + x</code>。這個簡單加法解決了深層網路的訓練退化問題：沒有 residual、模型加深會反而變差（不是過擬合、是 gradient 在反向傳播中衰減太多）；有 residual、訓練幾十甚至上百層都穩。</p>
<h2 id="概念位置">概念位置</h2>
<p>Residual connection 在 Transformer block 中出現兩次：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">Transformer block：
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  x
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  ├──────────────┐  ← skip connection（保留原始 x）
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  LayerNorm      │
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  Self-Attention │
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  +←─────────────┘  ← residual add：attention output + x
</span></span><span class="line"><span class="ln">10</span><span class="cl">  │
</span></span><span class="line"><span class="ln">11</span><span class="cl">  ├──────────────┐  ← skip connection（保留 attention 後的值）
</span></span><span class="line"><span class="ln">12</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln">13</span><span class="cl">  LayerNorm      │
</span></span><span class="line"><span class="ln">14</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln">15</span><span class="cl">  FFN            │
</span></span><span class="line"><span class="ln">16</span><span class="cl">  ↓              │
</span></span><span class="line"><span class="ln">17</span><span class="cl">  +←─────────────┘  ← residual add：FFN output + previous
</span></span><span class="line"><span class="ln">18</span><span class="cl">  ↓
</span></span><span class="line"><span class="ln">19</span><span class="cl">  進入下一個 block</span></span></code></pre></div><p>關鍵性質：</p>
<ol>
<li><strong>Gradient 可以走捷徑</strong>：<a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">Backpropagation</a> 時、gradient 能透過 skip connection 直接傳回淺層、避免 chain rule 累積衰減。</li>
<li><strong>Layer 學「殘差」而不是「完整轉換」</strong>：每層學「該怎麼微調輸入」、不用學「從零生成輸出」、優化更容易。</li>
<li><strong>跟 <a href="/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">LayerNorm</a> 配對</strong>：兩者一起是深層 Transformer 訓得起來的基礎。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>理解 residual connection 後可以判讀 Transformer 能堆幾十層的根本原因（不是因為 attention、是因為 residual + LayerNorm 讓深層仍可訓練）；也能看懂 ResNet、ViT 等其他用 residual 架構的設計。LLM 推論時 residual 不算 bottleneck、但在訓練 / fine-tune 時、residual 是 gradient flow 健康度的關鍵。</p>
]]></content:encoded></item><item><title>RLHF</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/</guid><description>&lt;p>RLHF（Reinforcement Learning from Human Feedback、人類反饋強化學習）的核心概念是「&lt;strong>讓人類比較兩個模型回答的好壞、訓一個 reward model 學會這個偏好、再用 RL 把 LLM 推往 reward model 給高分的方向&lt;/strong>」。RLHF 是 LLM 對話品質飛躍的關鍵（從 GPT-3 base 到 ChatGPT 的差別主要是 RLHF）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>RLHF 在訓練流程的位置與步驟：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">[SFT 後的模型]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">Step 1：收集人類偏好
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> 對同個 prompt 讓模型生 A、B 兩個 response、人類標「我較喜歡 A」
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">Step 2：訓 reward model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> 輸入 (prompt, response)、輸出一個分數
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> 目標：人類偏好的 response 分數高
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">Step 3：用 PPO 等 RL 演算法 fine-tune LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> 讓模型輸出讓 reward model 給高分的 response
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> 加 [KL constraint](/llm/knowledge-cards/kl-divergence/)：不能偏離 SFT model 太遠
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">[Aligned model]：回答更貼近人類偏好&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>關鍵特性與挑戰：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>三個模型同時運作&lt;/strong>：policy（LLM）、reward model、reference model（SFT 後 frozen 那份）、訓練時記憶體吃緊。&lt;/li>
&lt;li>&lt;strong>Reward hacking&lt;/strong>：模型可能找到 reward model 的弱點、生成「reward 高但實質爛」的輸出（如冗長 boilerplate）。&lt;/li>
&lt;li>&lt;strong>訓練不穩&lt;/strong>：PPO 對 hyperparameter 敏感、需要小心調 β（KL 約束強度）、learning rate 等。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>RLHF 是 ChatGPT / Claude / Gemini 等商業 LLM 對話品質的核心。讀 model card 看到「RLHF-tuned」「helpfulness fine-tuning」就是這個階段。&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO&lt;/a> 是 2023 年後出現的簡化替代方案、跳過 reward model、直接用偏好資料 fine-tune、訓練流程簡單很多、是現代許多開源模型的主流選擇。&lt;/p></description><content:encoded><![CDATA[<p>RLHF（Reinforcement Learning from Human Feedback、人類反饋強化學習）的核心概念是「<strong>讓人類比較兩個模型回答的好壞、訓一個 reward model 學會這個偏好、再用 RL 把 LLM 推往 reward model 給高分的方向</strong>」。RLHF 是 LLM 對話品質飛躍的關鍵（從 GPT-3 base 到 ChatGPT 的差別主要是 RLHF）。</p>
<h2 id="概念位置">概念位置</h2>
<p>RLHF 在訓練流程的位置與步驟：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">[SFT 後的模型]
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">   ↓
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">Step 1：收集人類偏好
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  對同個 prompt 讓模型生 A、B 兩個 response、人類標「我較喜歡 A」
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">   ↓
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">Step 2：訓 reward model
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  輸入 (prompt, response)、輸出一個分數
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  目標：人類偏好的 response 分數高
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">   ↓
</span></span><span class="line"><span class="ln">10</span><span class="cl">Step 3：用 PPO 等 RL 演算法 fine-tune LLM
</span></span><span class="line"><span class="ln">11</span><span class="cl">  讓模型輸出讓 reward model 給高分的 response
</span></span><span class="line"><span class="ln">12</span><span class="cl">  加 [KL constraint](/llm/knowledge-cards/kl-divergence/)：不能偏離 SFT model 太遠
</span></span><span class="line"><span class="ln">13</span><span class="cl">   ↓
</span></span><span class="line"><span class="ln">14</span><span class="cl">[Aligned model]：回答更貼近人類偏好</span></span></code></pre></div><p>關鍵特性與挑戰：</p>
<ol>
<li><strong>三個模型同時運作</strong>：policy（LLM）、reward model、reference model（SFT 後 frozen 那份）、訓練時記憶體吃緊。</li>
<li><strong>Reward hacking</strong>：模型可能找到 reward model 的弱點、生成「reward 高但實質爛」的輸出（如冗長 boilerplate）。</li>
<li><strong>訓練不穩</strong>：PPO 對 hyperparameter 敏感、需要小心調 β（KL 約束強度）、learning rate 等。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>RLHF 是 ChatGPT / Claude / Gemini 等商業 LLM 對話品質的核心。讀 model card 看到「RLHF-tuned」「helpfulness fine-tuning」就是這個階段。<a href="/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO</a> 是 2023 年後出現的簡化替代方案、跳過 reward model、直接用偏好資料 fine-tune、訓練流程簡單很多、是現代許多開源模型的主流選擇。</p>
]]></content:encoded></item><item><title>SFT（Supervised Fine-Tuning）</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/sft/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/sft/</guid><description>&lt;p>SFT（Supervised Fine-Tuning、指令微調）的核心概念是「在 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model&lt;/a> 上、用人類示範的『指令-回答』成對資料做監督式 fine-tune、讓模型從『接龍』變成『跟指令走』」。SFT 是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">pre-training&lt;/a> 跟 alignment（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO&lt;/a>）之間的橋。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>SFT 在訓練 pipeline 的位置與資料形態：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">資料格式（典型）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> {&amp;#34;instruction&amp;#34;: &amp;#34;寫一個 Python fibonacci&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> &amp;#34;response&amp;#34;: &amp;#34;def fib(n): ...&amp;#34;}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">訓練：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> 把 instruction + response 連起來、跑跟 pre-training 一樣的 next-token prediction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl"> 但 loss 只算 response token 上的 cross-entropy（instruction 部分不算）&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>SFT 後同一個模型行為大改：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>問同樣問題「寫一個 Python fibonacci」&lt;/th>
 &lt;th>Base model（pre-training 後）&lt;/th>
 &lt;th>Instruction-tuned model（SFT 後）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>行為&lt;/td>
 &lt;td>純文字接龍：「寫一個 Python fibonacci。寫一個 JavaScript fibonacci。寫一個 Rust&amp;hellip;」&lt;/td>
 &lt;td>直接給出 fibonacci 函式實作&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>資料量遠小於 pre-training&lt;/strong>：幾萬到幾百萬筆指令-回答對、相對 pre-training 的兆級 token 是小數字。&lt;/li>
&lt;li>&lt;strong>訓練成本相對低&lt;/strong>：通常幾百到幾千 GPU-hour、可在單機完成。&lt;/li>
&lt;li>&lt;strong>容易過擬合 / 災難遺忘&lt;/strong>：SFT 資料太少 / 太特化時、模型可能丟掉 pre-training 學到的能力、見 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA&lt;/a> 的設計動機。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 model card 看到「instruct」「chat」「-it」「sft」等 suffix、就是經過 SFT 的版本。寫 code 場景用的模型幾乎都是 SFT 後的（base model 對話能力差、實用度低）。Coding-tuned 模型（如 Qwen3-Coder）是 SFT 階段大量加入 code 對話資料的特化版本、跟通用 instruct 模型在 code 任務上有可觀差距。&lt;/p></description><content:encoded><![CDATA[<p>SFT（Supervised Fine-Tuning、指令微調）的核心概念是「在 <a href="/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model</a> 上、用人類示範的『指令-回答』成對資料做監督式 fine-tune、讓模型從『接龍』變成『跟指令走』」。SFT 是 <a href="/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">pre-training</a> 跟 alignment（<a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> / <a href="/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO</a>）之間的橋。</p>
<h2 id="概念位置">概念位置</h2>
<p>SFT 在訓練 pipeline 的位置與資料形態：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">資料格式（典型）：
</span></span><span class="line"><span class="ln">2</span><span class="cl">  {&#34;instruction&#34;: &#34;寫一個 Python fibonacci&#34;,
</span></span><span class="line"><span class="ln">3</span><span class="cl">   &#34;response&#34;:    &#34;def fib(n): ...&#34;}
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl">訓練：
</span></span><span class="line"><span class="ln">6</span><span class="cl">  把 instruction + response 連起來、跑跟 pre-training 一樣的 next-token prediction
</span></span><span class="line"><span class="ln">7</span><span class="cl">  但 loss 只算 response token 上的 cross-entropy（instruction 部分不算）</span></span></code></pre></div><p>SFT 後同一個模型行為大改：</p>
<table>
  <thead>
      <tr>
          <th>問同樣問題「寫一個 Python fibonacci」</th>
          <th>Base model（pre-training 後）</th>
          <th>Instruction-tuned model（SFT 後）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>行為</td>
          <td>純文字接龍：「寫一個 Python fibonacci。寫一個 JavaScript fibonacci。寫一個 Rust&hellip;」</td>
          <td>直接給出 fibonacci 函式實作</td>
      </tr>
  </tbody>
</table>
<p>關鍵特性：</p>
<ol>
<li><strong>資料量遠小於 pre-training</strong>：幾萬到幾百萬筆指令-回答對、相對 pre-training 的兆級 token 是小數字。</li>
<li><strong>訓練成本相對低</strong>：通常幾百到幾千 GPU-hour、可在單機完成。</li>
<li><strong>容易過擬合 / 災難遺忘</strong>：SFT 資料太少 / 太特化時、模型可能丟掉 pre-training 學到的能力、見 <a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> 的設計動機。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 model card 看到「instruct」「chat」「-it」「sft」等 suffix、就是經過 SFT 的版本。寫 code 場景用的模型幾乎都是 SFT 後的（base model 對話能力差、實用度低）。Coding-tuned 模型（如 Qwen3-Coder）是 SFT 階段大量加入 code 對話資料的特化版本、跟通用 instruct 模型在 code 任務上有可觀差距。</p>
]]></content:encoded></item><item><title>SGD</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/sgd/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/sgd/</guid><description>&lt;p>SGD（Stochastic Gradient Descent、隨機梯度下降）的核心概念是「每次只用一小批資料（mini-batch）算 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a>、更新權重」。對比的是 vanilla gradient descent（用全部資料算一次 gradient）：full-batch 在 trillion-token 級資料下完全不可行、SGD 用 mini-batch 把記憶體跟計算成本拉到可行範圍。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>SGD 的更新公式：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">W_new = W_old - learning_rate × gradient_of_loss_on_minibatch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>跟其他 optimizer 的對比：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Optimizer&lt;/th>
 &lt;th>更新規則&lt;/th>
 &lt;th>特性&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>SGD&lt;/td>
 &lt;td>&lt;code>W -= lr × g&lt;/code>&lt;/td>
 &lt;td>簡單、慢、容易卡 local minimum&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SGD + Momentum&lt;/td>
 &lt;td>加速度項：&lt;code>v = μv + g; W -= lr × v&lt;/code>&lt;/td>
 &lt;td>衝過 saddle point、收斂較穩&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/adam-adamw/" data-link-title="Adam / AdamW" data-link-desc="對每個參數自適應 learning rate 的 optimizer、LLM 訓練主流選擇">Adam / AdamW&lt;/a>&lt;/td>
 &lt;td>對每個參數自適應 lr、用 gradient 的 EMA 跟二階矩&lt;/td>
 &lt;td>對 lr 較不敏感、LLM 訓練主流&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>LLM 訓練幾乎都用 Adam / AdamW、不是純 SGD。但 SGD 仍出現在：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>小模型 / 簡單任務&lt;/strong>：fine-tune 小 vision 模型、SGD + momentum 仍是合理選擇。&lt;/li>
&lt;li>&lt;strong>理論分析 / 教學&lt;/strong>：SGD 是最簡單的 optimizer、用來解釋 gradient descent 概念。&lt;/li>
&lt;li>&lt;strong>某些 fine-tuning 場景&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA&lt;/a> 或 SFT 偶爾用 SGD（避免 Adam 改變 base model 太多）。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 paper / training script 看到 optimizer 選擇、SGD 是基線、其他 optimizer 通常是「對 SGD 的改進」。寫 code 場景的判讀：訓練自己的小模型可以從 SGD + momentum 開始；fine-tune 大 LLM 沒理由不用 AdamW。&lt;/p></description><content:encoded><![CDATA[<p>SGD（Stochastic Gradient Descent、隨機梯度下降）的核心概念是「每次只用一小批資料（mini-batch）算 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a>、更新權重」。對比的是 vanilla gradient descent（用全部資料算一次 gradient）：full-batch 在 trillion-token 級資料下完全不可行、SGD 用 mini-batch 把記憶體跟計算成本拉到可行範圍。</p>
<h2 id="概念位置">概念位置</h2>
<p>SGD 的更新公式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">W_new = W_old - learning_rate × gradient_of_loss_on_minibatch</span></span></code></pre></div><p>跟其他 optimizer 的對比：</p>
<table>
  <thead>
      <tr>
          <th>Optimizer</th>
          <th>更新規則</th>
          <th>特性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>SGD</td>
          <td><code>W -= lr × g</code></td>
          <td>簡單、慢、容易卡 local minimum</td>
      </tr>
      <tr>
          <td>SGD + Momentum</td>
          <td>加速度項：<code>v = μv + g; W -= lr × v</code></td>
          <td>衝過 saddle point、收斂較穩</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/adam-adamw/" data-link-title="Adam / AdamW" data-link-desc="對每個參數自適應 learning rate 的 optimizer、LLM 訓練主流選擇">Adam / AdamW</a></td>
          <td>對每個參數自適應 lr、用 gradient 的 EMA 跟二階矩</td>
          <td>對 lr 較不敏感、LLM 訓練主流</td>
      </tr>
  </tbody>
</table>
<p>LLM 訓練幾乎都用 Adam / AdamW、不是純 SGD。但 SGD 仍出現在：</p>
<ol>
<li><strong>小模型 / 簡單任務</strong>：fine-tune 小 vision 模型、SGD + momentum 仍是合理選擇。</li>
<li><strong>理論分析 / 教學</strong>：SGD 是最簡單的 optimizer、用來解釋 gradient descent 概念。</li>
<li><strong>某些 fine-tuning 場景</strong>：<a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> 或 SFT 偶爾用 SGD（避免 Adam 改變 base model 太多）。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 paper / training script 看到 optimizer 選擇、SGD 是基線、其他 optimizer 通常是「對 SGD 的改進」。寫 code 場景的判讀：訓練自己的小模型可以從 SGD + momentum 開始；fine-tune 大 LLM 沒理由不用 AdamW。</p>
]]></content:encoded></item><item><title>3.4 訓練流程：pre-train → SFT → RLHF</title><link>https://tarrragon.github.io/blog/llm/03-theoretical-foundations/training-pipeline/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/03-theoretical-foundations/training-pipeline/</guid><description>&lt;p>現代 LLM 的訓練分三個階段：&lt;strong>pre-training&lt;/strong>（預訓練）、&lt;strong>supervised fine-tuning（SFT、指令微調）&lt;/strong>、&lt;strong>alignment&lt;/strong>（傳統用 RLHF、近年也用 DPO 等替代方案）。每個階段目標不同、資料不同、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function&lt;/a> 不同。理解這條鏈、能解釋為什麼「Gemma 4 31B base」跟「Gemma 4 31B instruct」是兩個版本、為什麼 fine-tuning 需要慎重、為什麼 RLHF 對對話品質這麼關鍵。&lt;/p>
&lt;p>本章從預訓練的 next-token prediction 開始、進入 instruction tuning、最後展開 RLHF 與其替代方案。寫 code 場景的使用者通常不會自己跑這些訓練、但理解流程能解釋模型行為跟版本差異。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>解釋 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model&lt;/a> 跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/instruction-tuned/" data-link-title="Instruction-Tuned Model" data-link-desc="經過指令微調的模型：會跟著 prompt 走、回答使用者問題">instruction-tuned model&lt;/a> 的訓練差異。&lt;/li>
&lt;li>解釋 RLHF 為什麼影響 LLM 的對話風格。&lt;/li>
&lt;li>區分 SFT、RLHF、DPO、LoRA 在訓練流程中的位置。&lt;/li>
&lt;li>理解「fine-tuning 為什麼可能讓模型變差」。&lt;/li>
&lt;/ol>
&lt;h2 id="階段-1pre-training預訓練">階段 1：Pre-training（預訓練）&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">Pre-training&lt;/a> 的核心目標是「從大量未標註文字學語言模型」、用 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/autoregressive/" data-link-title="Autoregressive" data-link-desc="LLM 一次生成一個 token、把已生成內容作為下一次輸入的架構">next-token prediction&lt;/a> 當訓練 objective。&lt;/p>
&lt;h3 id="流程">流程&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>資料&lt;/strong>：trillion token 級別的網路文字、書籍、code、論文。常見資料集如 Common Crawl、RefinedWeb、The Pile、Stack、Wikipedia。&lt;/li>
&lt;li>&lt;strong>任務&lt;/strong>：「給前 N 個 token、預測第 N+1 個 token」。&lt;/li>
&lt;li>&lt;strong>Loss&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy&lt;/a> loss、衡量模型預測機率分佈跟實際下一個 token（one-hot）的差距、由 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation&lt;/a> 算出 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient&lt;/a> 更新權重。詳細展開見 &lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">2.1 機率與資訊論&lt;/a>。&lt;/li>
&lt;li>&lt;strong>訓練量&lt;/strong>：數十億 GPU-hour、數百到數萬個 GPU 並行、訓練數週到數月。&lt;/li>
&lt;li>&lt;strong>結果&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model&lt;/a>、會做文字接龍、但對話能力有限。&lt;/li>
&lt;/ol>
&lt;h3 id="為什麼-next-token-prediction-這麼有效">為什麼 next-token prediction 這麼有效&lt;/h3>
&lt;p>「給前文預測下一個 token」看起來是簡單任務、但要做好需要：&lt;/p>
&lt;ul>
&lt;li>理解語法、文法。&lt;/li>
&lt;li>理解語意、世界知識。&lt;/li>
&lt;li>理解 reasoning（推理鏈中的下一步是 token、模型要會推理才能準確預測）。&lt;/li>
&lt;li>理解 multi-step task（複雜程式碼跟複雜文章的下一個 token 也是 next-token problem）。&lt;/li>
&lt;/ul>
&lt;p>LLM 的「智能」很大程度是 next-token prediction 在大資料上的 emergent property（湧現特性）。&lt;/p>
&lt;h3 id="預訓練成本">預訓練成本&lt;/h3>
&lt;p>訓練前沿 LLM 的成本：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>模型&lt;/th>
 &lt;th>估計訓練成本（美元）&lt;/th>
 &lt;th>訓練資料量&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GPT-3 (2020)&lt;/td>
 &lt;td>~$5M&lt;/td>
 &lt;td>300B tokens&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Llama 3 70B&lt;/td>
 &lt;td>~$30M&lt;/td>
 &lt;td>15T tokens&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GPT-4 (估)&lt;/td>
 &lt;td>$100M+&lt;/td>
 &lt;td>不公開&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練前沿模型&lt;/td>
 &lt;td>數億美元&lt;/td>
 &lt;td>10T+ tokens&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>預訓練是 LLM 訓練成本的 95%+。後續 fine-tuning 跟 RLHF 的成本是預訓練的零頭。&lt;/p>
&lt;h2 id="階段-2supervised-fine-tuningsft指令微調">階段 2：Supervised Fine-Tuning（SFT、指令微調）&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT&lt;/a> 的核心目標是「在 base model 上、用「指令-回答」對資料微調、讓模型會跟著指令走」。&lt;/p></description><content:encoded><![CDATA[<p>現代 LLM 的訓練分三個階段：<strong>pre-training</strong>（預訓練）、<strong>supervised fine-tuning（SFT、指令微調）</strong>、<strong>alignment</strong>（傳統用 RLHF、近年也用 DPO 等替代方案）。每個階段目標不同、資料不同、<a href="/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function</a> 不同。理解這條鏈、能解釋為什麼「Gemma 4 31B base」跟「Gemma 4 31B instruct」是兩個版本、為什麼 fine-tuning 需要慎重、為什麼 RLHF 對對話品質這麼關鍵。</p>
<p>本章從預訓練的 next-token prediction 開始、進入 instruction tuning、最後展開 RLHF 與其替代方案。寫 code 場景的使用者通常不會自己跑這些訓練、但理解流程能解釋模型行為跟版本差異。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>解釋 <a href="/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model</a> 跟 <a href="/blog/llm/knowledge-cards/instruction-tuned/" data-link-title="Instruction-Tuned Model" data-link-desc="經過指令微調的模型：會跟著 prompt 走、回答使用者問題">instruction-tuned model</a> 的訓練差異。</li>
<li>解釋 RLHF 為什麼影響 LLM 的對話風格。</li>
<li>區分 SFT、RLHF、DPO、LoRA 在訓練流程中的位置。</li>
<li>理解「fine-tuning 為什麼可能讓模型變差」。</li>
</ol>
<h2 id="階段-1pre-training預訓練">階段 1：Pre-training（預訓練）</h2>
<p><a href="/blog/llm/knowledge-cards/pre-training/" data-link-title="Pre-training" data-link-desc="LLM 訓練的第一階段：用 trillion-token 級網路文字做 next-token prediction、得到 base model">Pre-training</a> 的核心目標是「從大量未標註文字學語言模型」、用 <a href="/blog/llm/knowledge-cards/autoregressive/" data-link-title="Autoregressive" data-link-desc="LLM 一次生成一個 token、把已生成內容作為下一次輸入的架構">next-token prediction</a> 當訓練 objective。</p>
<h3 id="流程">流程</h3>
<ol>
<li><strong>資料</strong>：trillion token 級別的網路文字、書籍、code、論文。常見資料集如 Common Crawl、RefinedWeb、The Pile、Stack、Wikipedia。</li>
<li><strong>任務</strong>：「給前 N 個 token、預測第 N+1 個 token」。</li>
<li><strong>Loss</strong>：<a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy</a> loss、衡量模型預測機率分佈跟實際下一個 token（one-hot）的差距、由 <a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a> 算出 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> 更新權重。詳細展開見 <a href="/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">2.1 機率與資訊論</a>。</li>
<li><strong>訓練量</strong>：數十億 GPU-hour、數百到數萬個 GPU 並行、訓練數週到數月。</li>
<li><strong>結果</strong>：<a href="/blog/llm/knowledge-cards/base-model/" data-link-title="Base Model" data-link-desc="未經指令微調的原始模型：擅長文字接龍、適合下游微調用途">base model</a>、會做文字接龍、但對話能力有限。</li>
</ol>
<h3 id="為什麼-next-token-prediction-這麼有效">為什麼 next-token prediction 這麼有效</h3>
<p>「給前文預測下一個 token」看起來是簡單任務、但要做好需要：</p>
<ul>
<li>理解語法、文法。</li>
<li>理解語意、世界知識。</li>
<li>理解 reasoning（推理鏈中的下一步是 token、模型要會推理才能準確預測）。</li>
<li>理解 multi-step task（複雜程式碼跟複雜文章的下一個 token 也是 next-token problem）。</li>
</ul>
<p>LLM 的「智能」很大程度是 next-token prediction 在大資料上的 emergent property（湧現特性）。</p>
<h3 id="預訓練成本">預訓練成本</h3>
<p>訓練前沿 LLM 的成本：</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>估計訓練成本（美元）</th>
          <th>訓練資料量</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPT-3 (2020)</td>
          <td>~$5M</td>
          <td>300B tokens</td>
      </tr>
      <tr>
          <td>Llama 3 70B</td>
          <td>~$30M</td>
          <td>15T tokens</td>
      </tr>
      <tr>
          <td>GPT-4 (估)</td>
          <td>$100M+</td>
          <td>不公開</td>
      </tr>
      <tr>
          <td>訓練前沿模型</td>
          <td>數億美元</td>
          <td>10T+ tokens</td>
      </tr>
  </tbody>
</table>
<p>預訓練是 LLM 訓練成本的 95%+。後續 fine-tuning 跟 RLHF 的成本是預訓練的零頭。</p>
<h2 id="階段-2supervised-fine-tuningsft指令微調">階段 2：Supervised Fine-Tuning（SFT、指令微調）</h2>
<p><a href="/blog/llm/knowledge-cards/sft/" data-link-title="SFT（Supervised Fine-Tuning）" data-link-desc="在 base model 上用「指令-回答」對資料微調、讓模型會跟著指令走">SFT</a> 的核心目標是「在 base model 上、用「指令-回答」對資料微調、讓模型會跟著指令走」。</p>
<h3 id="流程-1">流程</h3>
<ol>
<li><strong>資料</strong>：人類標註或 AI 生成的「prompt - response」對、數萬到數百萬個樣本。</li>
<li><strong>任務</strong>：跟 pre-training 同樣是 next-token prediction、但只對 response 部分算 loss（prompt 部分不算）。</li>
<li><strong>Loss</strong>：cross-entropy、只在 response token 上計算。</li>
<li><strong>訓練量</strong>：相對小、幾天到一週、單機可訓。</li>
<li><strong>結果</strong>：<a href="/blog/llm/knowledge-cards/instruction-tuned/" data-link-title="Instruction-Tuned Model" data-link-desc="經過指令微調的模型：會跟著 prompt 走、回答使用者問題">instruction-tuned model</a>、會跟著 prompt 走、回答使用者問題。</li>
</ol>
<h3 id="sft-的關鍵性">SFT 的關鍵性</h3>
<p>Base model 雖然有大量知識、但「問問題、給答案」的交互模式對它不自然。SFT 後同一個模型行為大改：</p>
<ul>
<li>Base model：問「寫一個 Python fibonacci」可能得到「寫一個 Python fibonacci。寫一個 JavaScript fibonacci。寫一個&hellip;」（純文字接龍）。</li>
<li>Instruction-tuned：問同樣問題、得到實際 function。</li>
</ul>
<p>寫 code 場景的所有模型都是 instruction-tuned 後的版本。Coding-tuned（如 Qwen3-Coder）是 SFT 階段大量加入 code 對話資料的特化版本。</p>
<h3 id="instruction-tuning-的資料來源">Instruction Tuning 的資料來源</h3>
<ul>
<li><strong>Human-annotated</strong>：人類寫 prompt + 回答、品質高但成本高。Anthropic、OpenAI、Meta 都有自己的標註團隊。</li>
<li><strong>AI-generated</strong>：用更強的 model（如 GPT-4）生成 prompt + 回答、品質依賴 source model。Alpaca、Vicuna 是早期例子。</li>
<li><strong>Synthetic</strong>：規則生成 + LLM 改寫。Magpie、Self-Instruct 等方法。</li>
</ul>
<p>主流模型多半混合上述三種來源。</p>
<h2 id="階段-3alignment對齊">階段 3：Alignment（對齊）</h2>
<p>Alignment 的核心目標是「進一步調整模型、讓回答符合「helpful、harmless、honest」三個維度」。SFT 後的模型可能說出有害內容、誇大事實、給平庸答案；alignment 階段解決這些問題。</p>
<h3 id="rlhfreinforcement-learning-from-human-feedback">RLHF：Reinforcement Learning from Human Feedback</h3>
<p><a href="/blog/llm/knowledge-cards/rlhf/" data-link-title="RLHF" data-link-desc="Reinforcement Learning from Human Feedback：用人類偏好訓練的 reward model 透過 RL 對齊 LLM">RLHF</a> 是 alignment 的經典方法（Ouyang et al., 2022、InstructGPT 論文）、三步驟：</p>
<h4 id="step-1reward-model">Step 1：Reward Model</h4>
<ol>
<li>收集 prompt、用模型生成多個 response。</li>
<li>人類對 response 做 pairwise 排序（「A 比 B 好」）。</li>
<li>訓練一個 reward model、輸入 (prompt, response)、輸出一個分數、最大化「人類偏好高的 response 拿高分」。</li>
</ol>
<h4 id="step-2用-ppo-最佳化模型">Step 2：用 PPO 最佳化模型</h4>
<ol>
<li>Policy = 當前的 LLM（在 RL 框架下、模型輸出的 token 分佈被視為「策略」、所以稱為 policy）。</li>
<li>用 RL（通常用 PPO 演算法、Proximal Policy Optimization、一種限制每步參數更新幅度的 RL 演算法、訓練比較穩）最佳化 policy、讓 reward model 給的分數最大化。</li>
<li>加 KL constraint：policy 不能偏離 base SFT model 太遠（用 <a href="/blog/llm/knowledge-cards/kl-divergence/" data-link-title="KL Divergence" data-link-desc="衡量「兩個機率分佈差距」的非對稱指標、RLHF / DPO 等 alignment 訓練的關鍵約束">KL divergence</a>、推導見 <a href="/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">2.1 機率與資訊論</a>）、避免 reward hacking。</li>
</ol>
<h4 id="step-3迭代">Step 3：迭代</h4>
<p>可以再收集人類反饋、再訓 reward model、再 RL；多輪迭代。</p>
<p>RLHF 後的模型在 helpfulness、harmlessness 上明顯提升、但流程複雜、訓練不穩、reward model 易被 hack。</p>
<h3 id="dpodirect-preference-optimization">DPO：Direct Preference Optimization</h3>
<p><a href="/blog/llm/knowledge-cards/dpo/" data-link-title="DPO（Direct Preference Optimization）" data-link-desc="RLHF 的簡化替代：跳過 reward model、直接從人類偏好資料 fine-tune LLM">DPO</a>（Rafailov et al., 2023）是 RLHF 的替代方案、跳過 reward model、直接用人類偏好資料 fine-tune policy：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">loss = -log(σ(β × (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x))))</span></span></code></pre></div><p>其中：</p>
<ul>
<li>y_w：人類偏好的 response。</li>
<li>y_l：人類較不喜歡的 response。</li>
<li>π：當前 policy。</li>
<li>π_ref：reference model（通常 SFT model）。</li>
</ul>
<p>公式的直觀解讀：對每對 (好回答, 差回答)、拉高 π 給好回答的相對機率（比 π_ref 高）、壓低 π 給差回答的相對機率（比 π_ref 低）、β 控制偏離 π_ref 的力度。σ 是 sigmoid、把整體 score 壓到 (0, 1) 區間。</p>
<p>DPO 比 RLHF 簡單、不用訓 reward model、不用 RL 演算法、訓練穩定、在「離線偏好資料量充足 + 偏好相對穩定」的場景是 2024 ~ 2026 主流選擇。Llama 3、Gemma 4 等都用 DPO 或變體。</p>
<h3 id="其他替代方案">其他替代方案</h3>
<table>
  <thead>
      <tr>
          <th>方法</th>
          <th>特性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RLAIF</td>
          <td>把 RLHF 中的「human feedback」換成「AI feedback」、由更強 model 評分</td>
      </tr>
      <tr>
          <td>ORPO</td>
          <td>把 SFT 跟 alignment 合併成一步、簡化流程</td>
      </tr>
      <tr>
          <td>KTO</td>
          <td>用 binary preference（好 / 不好）而非 pairwise</td>
      </tr>
      <tr>
          <td>RPO</td>
          <td>RLHF + DPO 混合方案</td>
      </tr>
  </tbody>
</table>
<p>主流前沿 LLM 用 SFT + DPO（或變體）的組合；資料量足夠 + 偏好穩定時 DPO 較佳、需要 online 人類反饋或 reward shaping（複雜環境互動、多輪偏好調整）的場景下 PPO 仍有實際空間、特別是 reasoning model（DeepSeek-R1 等）的後訓練階段。</p>
<h2 id="fine-tuning在-instruction-tuned-model-上做特化">Fine-tuning：在 instruction-tuned model 上做特化</h2>
<p>「Fine-tuning」這個詞在 LLM 社群有兩層意思：</p>
<ol>
<li><strong>SFT 階段</strong>（前面提的）：base model → instruction-tuned model。</li>
<li><strong>下游 fine-tuning</strong>：使用者在 instruction-tuned model 上、用自己的資料再 fine-tune、做特定領域特化。</li>
</ol>
<p>下游 fine-tuning 的常見方法：</p>
<h3 id="full-fine-tuning">Full Fine-tuning</h3>
<p>更新模型所有參數。需要大量 GPU、Gemma 4 31B 全參數 fine-tune 要 8 × H100 起。品質好、但成本高、容易過擬合小資料。</p>
<h3 id="loralow-rank-adaptation">LoRA（Low-Rank Adaptation）</h3>
<p><a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a>（Hu et al., 2021）的核心想法是「凍結 base model 權重、只訓練一組小的 adapter 矩陣」：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">W_new = W_frozen + α × A @ B</span></span></code></pre></div><p>其中 A、B 是低秩矩陣（rank=4 ~ 64）、總參數遠少於 full fine-tune。</p>
<p>優點：</p>
<ul>
<li>記憶體佔用 1/10 ~ 1/100。</li>
<li>訓練快得多。</li>
<li>多個 LoRA adapter 可以共用同一個 base model、推論時切換。</li>
<li>不會破壞 base model（凍結）。</li>
</ul>
<p>LoRA 是 consumer 級硬體做 fine-tuning 的主流選擇。32GB Mac + MLX 可以跑 7B / 14B 模型的 LoRA fine-tuning。</p>
<p>LoRA 何時不適用 / 必須走 full fine-tune：</p>
<ul>
<li><strong>大幅行為改變</strong>：要把模型從通用 chat 轉成完全不同的人設 / 風格 / 領域。LoRA rank 容量有限（rank=4 ~ 64 對應幾百萬 ~ 幾千萬參數）、裝不下整體行為的大幅改寫；rank 拉到 256+ 後 LoRA 的記憶體優勢消失。</li>
<li><strong>跨 domain transfer</strong>：base model 是 general English、想 fine-tune 到醫學 / 法律等需要重學 vocab 跟結構的 domain。LoRA 只調整現有 layer 的偏移、難以從零學新 domain；通常要先做 continued pre-training（full fine-tune）再 LoRA。</li>
<li><strong>跟量化推論的相容性</strong>：base model 用 Q4 推論時、要先 dequantize 才能加上 LoRA delta、會導致 latency / memory 增加；production 場景常用 QLoRA + 在推論時 merge 回 base、避免每次推論都拆兩段。</li>
</ul>
<h3 id="qlora">QLoRA</h3>
<p><a href="/blog/llm/knowledge-cards/qlora/" data-link-title="QLoRA" data-link-desc="把 base model 量化到 4-bit &#43; LoRA fine-tune 的組合、消費級 GPU 也能 fine-tune 大模型">QLoRA</a> = Quantized LoRA、把 base model 量化到 4-bit、再做 LoRA。記憶體進一步降低、犧牲少量品質。</p>
<h3 id="為什麼-fine-tuning-可能讓模型變差">為什麼 fine-tuning 可能讓模型變差</h3>
<p>下游 fine-tuning 對寫 code 場景的多數使用者價值有限、原因：</p>
<ol>
<li><strong>過擬合</strong>：fine-tune 資料量小、模型可能學到 spurious pattern、在 fine-tune 領域外能力下降。</li>
<li><strong>Catastrophic forgetting</strong>：學新資料時忘記舊知識、原本會的東西變差。</li>
<li><strong>資料品質決定上限</strong>：fine-tune 資料品質低、模型學到低品質回答。</li>
<li><strong>Alignment 退化</strong>：fine-tune 可能破壞 RLHF / DPO 階段建立的「helpful、harmless」性質。</li>
</ol>
<p>寫 code 場景優先用 instruction-tuned 通用模型（Gemma 4、Qwen3-Coder 等）、需要特化再評估 <a href="/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG</a> 或 prompt engineering、最後才考慮 fine-tuning。三條路的取捨判讀見 <a href="/blog/llm/04-applications/rag-principles/" data-link-title="4.1 RAG 原理：retrieval &#43; augmentation 模式" data-link-desc="為什麼模型需要外掛知識、語意相似 vs 字面相似、chunking 的本質取捨、retrieval 失敗的根本原因">4.1 RAG 原理</a>。</p>
<h2 id="in-context-learningfine-tuning-的替代品">In-Context Learning：fine-tuning 的替代品</h2>
<p>In-context learning（ICL）的核心想法是「不更新模型權重、只在 prompt 中給範例、讓模型 generalize」。</p>
<ul>
<li><strong>Zero-shot</strong>：直接給任務描述、不給範例。</li>
<li><strong>Few-shot</strong>：給幾個 input-output 範例、再給新 input。</li>
<li><strong>Chain-of-thought</strong>：要求模型把推理過程寫出來、再給答案。</li>
</ul>
<p>GPT-3 paper 顯示大模型有強 ICL 能力、不用 fine-tune 就能做新任務。現代 LLM 進一步強化 ICL、加上 long context、<a href="/blog/llm/knowledge-cards/agent/" data-link-title="LLM Agent" data-link-desc="把控制流交給 LLM 的應用模式：自主決策、跨多步呼叫工具、人類角色從主導變監督">agent</a> loop、<a href="/blog/llm/knowledge-cards/function-calling/" data-link-title="Function Calling" data-link-desc="模型訓練階段建立的「呼叫工具」能力：知道何時該呼叫、傳什麼參數">function calling</a> 等技術、覆蓋大部分原本需要 fine-tune 的場景。</p>
<p>實務啟示：「想做新任務、先試 prompt engineering、不夠再試 RAG、最後才考慮 fine-tuning」。fine-tuning 是最重的投資、適合放在最後驗證、prompt engineering 跟 RAG 跑完仍不夠才動。</p>
<h2 id="訓練資料污染data-contamination">訓練資料污染（Data Contamination）</h2>
<p>訓練資料污染指「benchmark 的測試集出現在預訓練資料中」、模型「記住答案」而非真正能解問題。</p>
<p>問題：</p>
<ul>
<li>公開 benchmark（SWE-bench、MMLU 等）的測試題常出現在 GitHub / 論壇、進入預訓練資料。</li>
<li>模型在這些 benchmark 上分數可能高估真實能力。</li>
</ul>
<p>解決：</p>
<ul>
<li><strong>SWE-bench Verified</strong>：OpenAI 篩選過、相對乾淨的子集。</li>
<li><strong>HELM</strong>：Stanford 的 holistic 評估、含污染檢測。</li>
<li><strong>新 benchmark</strong>：每隔一段時間出新 benchmark、用尚未被 LLM「看過」的資料。</li>
<li><strong>自己跑 benchmark</strong>：用自己工作流的真實任務評估、繞過所有污染問題。</li>
</ul>
<p>詳見 <a href="/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench 卡片</a> 跟 <a href="/blog/llm/00-foundations/info-judgment-frames/" data-link-title="0.6 判讀本地 LLM 資訊的五個框架" data-link-desc="本地 LLM 資訊更新快，學會用版本、層級、變數、能力、資料流五個框架評估文章與宣稱">模組零 0.6 判讀框架</a> 的框架二（量化宣稱三變數）。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/03-theoretical-foundations/sampling-and-decoding/" data-link-title="3.5 Sampling 與 Decoding 策略" data-link-desc="Greedy、beam search、top-k、top-p、temperature、min-p：模型輸出後怎麼挑下一個 token">3.5 sampling 與 decoding 策略</a>、模型輸出後怎麼挑下一個 token。</p>
]]></content:encoded></item></channel></rss>