<?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>Math on Tarragon</title><link>https://tarrragon.github.io/blog/tags/math/</link><description>Recent content in Math on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/math/index.xml" rel="self" type="application/rss+xml"/><item><title>Activation Function</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/activation-function/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/activation-function/</guid><description>&lt;p>Activation function（激活函數）的核心概念是「在 linear layer（矩陣乘法）之間插入的非線性函數」。沒有 activation function、整個多層神經網路會塌縮成單一個線性變換、表達能力跟單層 linear 一樣弱。activation function 讓深度網路真的「深」起來。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 中 activation function 主要出現在 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/ffn/" data-link-title="FFN（Feed-Forward Network）" data-link-desc="Transformer block 內部的兩層 linear &amp;#43; activation、佔模型參數量的多數">FFN&lt;/a> 內、夾在兩個矩陣乘法之間：&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">FFN: input → W_up (linear) → activation → W_down (linear) → output
&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"> 這裡是 activation function&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主流 LLM 用的 activation function 演化：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Activation&lt;/th>
 &lt;th>公式（簡化）&lt;/th>
 &lt;th>出現在&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>ReLU&lt;/td>
 &lt;td>&lt;code>max(0, x)&lt;/code>&lt;/td>
 &lt;td>早期 Transformer（如 BERT）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GELU&lt;/td>
 &lt;td>&lt;code>x · Φ(x)&lt;/code>（Φ 是 Gaussian CDF）&lt;/td>
 &lt;td>GPT-2 / 3、BERT 後期&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SwiGLU&lt;/td>
 &lt;td>&lt;code>Swish(xW) ⊙ (xV)&lt;/code>&lt;/td>
 &lt;td>Llama、Gemma、Qwen 等主流&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GeGLU&lt;/td>
 &lt;td>&lt;code>GELU(xW) ⊙ (xV)&lt;/code>&lt;/td>
 &lt;td>部分 Google 系列模型&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>SwiGLU / GeGLU 是「gated」變體、用兩條線性投影相乘、表達能力比單一 activation 強、是現代 LLM 主流。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 paper / model card 看到 SwiGLU、ReLU、GELU 等詞、知道它們是 FFN 內部的選擇、影響模型表達能力跟訓練穩定性、不影響「模型怎麼用 / 怎麼 inference」這類使用者面議題。寫 code 場景的判讀：模型用什麼 activation 由模型作者決定、使用者通常不用調；但若要 fine-tune 或自己訓模型、activation 選擇是設計決策之一。&lt;/p></description><content:encoded><![CDATA[<p>Activation function（激活函數）的核心概念是「在 linear layer（矩陣乘法）之間插入的非線性函數」。沒有 activation function、整個多層神經網路會塌縮成單一個線性變換、表達能力跟單層 linear 一樣弱。activation function 讓深度網路真的「深」起來。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 中 activation function 主要出現在 <a href="/blog/llm/knowledge-cards/ffn/" data-link-title="FFN（Feed-Forward Network）" data-link-desc="Transformer block 內部的兩層 linear &#43; activation、佔模型參數量的多數">FFN</a> 內、夾在兩個矩陣乘法之間：</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">FFN: input → W_up (linear) → activation → W_down (linear) → output
</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">                       這裡是 activation function</span></span></code></pre></div><p>主流 LLM 用的 activation function 演化：</p>
<table>
  <thead>
      <tr>
          <th>Activation</th>
          <th>公式（簡化）</th>
          <th>出現在</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>ReLU</td>
          <td><code>max(0, x)</code></td>
          <td>早期 Transformer（如 BERT）</td>
      </tr>
      <tr>
          <td>GELU</td>
          <td><code>x · Φ(x)</code>（Φ 是 Gaussian CDF）</td>
          <td>GPT-2 / 3、BERT 後期</td>
      </tr>
      <tr>
          <td>SwiGLU</td>
          <td><code>Swish(xW) ⊙ (xV)</code></td>
          <td>Llama、Gemma、Qwen 等主流</td>
      </tr>
      <tr>
          <td>GeGLU</td>
          <td><code>GELU(xW) ⊙ (xV)</code></td>
          <td>部分 Google 系列模型</td>
      </tr>
  </tbody>
</table>
<p>SwiGLU / GeGLU 是「gated」變體、用兩條線性投影相乘、表達能力比單一 activation 強、是現代 LLM 主流。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀 paper / model card 看到 SwiGLU、ReLU、GELU 等詞、知道它們是 FFN 內部的選擇、影響模型表達能力跟訓練穩定性、不影響「模型怎麼用 / 怎麼 inference」這類使用者面議題。寫 code 場景的判讀：模型用什麼 activation 由模型作者決定、使用者通常不用調；但若要 fine-tune 或自己訓模型、activation 選擇是設計決策之一。</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>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>Dot Product</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/dot-product/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/dot-product/</guid><description>&lt;p>Dot product（內積、inner product）的核心概念是「&lt;strong>兩個向量對應位置相乘再加總&lt;/strong>」：&lt;code>a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ&lt;/code>。幾何意義是「a 在 b 方向上的投影長度 × b 的長度」。Dot product 是 LLM 中&lt;strong>最頻繁出現的運算之一&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention&lt;/a> 的核心是 dot product、cosine similarity 的本體也是 dot product。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Dot product 在 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>Attention score&lt;/td>
 &lt;td>&lt;code>Q · K^T&lt;/code>&lt;/td>
 &lt;td>算「該 token 跟其他 token 的相關性」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cosine similarity&lt;/td>
 &lt;td>&lt;code>dot(a, b) / (norm(a) × norm(b))&lt;/code>&lt;/td>
 &lt;td>&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> / semantic search&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>L2-normalized similarity&lt;/td>
 &lt;td>normalize 後直接用 &lt;code>a · b&lt;/code>&lt;/td>
 &lt;td>Vector database 高效檢索&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Logits → token 機率&lt;/td>
 &lt;td>output_projection 本質是「最後 hidden state · token embedding」&lt;/td>
 &lt;td>算每個 vocab token 的「匹配度」&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">兩個向量方向接近時：dot product 大（正值大）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">兩個向量垂直時： dot product = 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">兩個向量方向相反時：dot product 大負值
&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">a · b = |a| × |b| × cos(θ)
&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"> θ 是兩向量夾角&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 推論性能上、dot product 是「&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/matrix-multiplication/" data-link-title="Matrix Multiplication" data-link-desc="LLM 推論最頻繁的單一運算、forward pass 每層的核心、memory bandwidth 瓶頸的根源">matrix multiplication&lt;/a> 的基本單元」、整個 forward pass 可以看成大量 dot product 的批次運算；這是為什麼 GPU / Apple Silicon Neural Engine 都針對 dot product 做硬體優化。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 attention / RAG 相關內容看到「inner product」「dot product」「QK^T」就是這個運算。寫 code 場景的判讀：用 vector database 時、選 distance metric 看：cosine 適合未 normalized 的 embedding、dot product 適合 L2-normalized 的 embedding（兩者結果同、後者較快）；attention 的 KV cache 量化（K=Q8 / V=Q4）對品質的不對稱影響、根本原因是 K 用於 dot product（誤差累積快）、V 用於加權平均（誤差被平均化）。&lt;/p></description><content:encoded><![CDATA[<p>Dot product（內積、inner product）的核心概念是「<strong>兩個向量對應位置相乘再加總</strong>」：<code>a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ</code>。幾何意義是「a 在 b 方向上的投影長度 × b 的長度」。Dot product 是 LLM 中<strong>最頻繁出現的運算之一</strong>：<a href="/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention</a> 的核心是 dot product、cosine similarity 的本體也是 dot product。</p>
<h2 id="概念位置">概念位置</h2>
<p>Dot product 在 LLM 中的核心應用：</p>
<table>
  <thead>
      <tr>
          <th>應用</th>
          <th>公式 / 機制</th>
          <th>角色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Attention score</td>
          <td><code>Q · K^T</code></td>
          <td>算「該 token 跟其他 token 的相關性」</td>
      </tr>
      <tr>
          <td>Cosine similarity</td>
          <td><code>dot(a, b) / (norm(a) × norm(b))</code></td>
          <td><a href="/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG</a> / semantic search</td>
      </tr>
      <tr>
          <td>L2-normalized similarity</td>
          <td>normalize 後直接用 <code>a · b</code></td>
          <td>Vector database 高效檢索</td>
      </tr>
      <tr>
          <td>Logits → token 機率</td>
          <td>output_projection 本質是「最後 hidden state · token embedding」</td>
          <td>算每個 vocab token 的「匹配度」</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">兩個向量方向接近時：dot product 大（正值大）
</span></span><span class="line"><span class="ln">2</span><span class="cl">兩個向量垂直時：    dot product = 0
</span></span><span class="line"><span class="ln">3</span><span class="cl">兩個向量方向相反時：dot product 大負值
</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">a · b = |a| × |b| × cos(θ)
</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">                  θ 是兩向量夾角</span></span></code></pre></div><p>LLM 推論性能上、dot product 是「<a href="/blog/llm/knowledge-cards/matrix-multiplication/" data-link-title="Matrix Multiplication" data-link-desc="LLM 推論最頻繁的單一運算、forward pass 每層的核心、memory bandwidth 瓶頸的根源">matrix multiplication</a> 的基本單元」、整個 forward pass 可以看成大量 dot product 的批次運算；這是為什麼 GPU / Apple Silicon Neural Engine 都針對 dot product 做硬體優化。</p>
<h2 id="設計責任">設計責任</h2>
<p>讀 attention / RAG 相關內容看到「inner product」「dot product」「QK^T」就是這個運算。寫 code 場景的判讀：用 vector database 時、選 distance metric 看：cosine 適合未 normalized 的 embedding、dot product 適合 L2-normalized 的 embedding（兩者結果同、後者較快）；attention 的 KV cache 量化（K=Q8 / V=Q4）對品質的不對稱影響、根本原因是 K 用於 dot product（誤差累積快）、V 用於加權平均（誤差被平均化）。</p>
]]></content:encoded></item><item><title>Entropy</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/entropy/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/entropy/</guid><description>&lt;p>Entropy（熵）的核心概念是「衡量一個機率分佈的不確定性」。Shannon entropy 公式：&lt;code>H(P) = -sum(P(x) × log P(x))&lt;/code>。直覺：分佈越「平」、entropy 越大（任何結果都可能）；分佈越「尖」、entropy 越小（結果很確定）。Entropy 是 &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;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;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Entropy 跟 LLM 相關概念的關係：&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">Entropy(P) = -sum P log P ← 一個分佈自身的不確定性
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">Cross-entropy(P, Q) = -sum P log Q ← 用分佈 Q 編碼 P 的成本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">KL(P ‖ Q) = Cross-entropy(P, Q) - Entropy(P) ← 兩個分佈的差距&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Entropy 在 LLM 中的具體意義：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>場景&lt;/th>
 &lt;th>Entropy 大&lt;/th>
 &lt;th>Entropy 小&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>模型 next-token 預測分佈&lt;/td>
 &lt;td>「不確定下個字、可能 N 種選項」&lt;/td>
 &lt;td>「強烈傾向某幾個 token」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sampling temperature 高&lt;/td>
 &lt;td>Entropy 高、輸出多樣&lt;/td>
 &lt;td>Entropy 低、輸出確定&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>訓練未收斂&lt;/td>
 &lt;td>分佈接近 uniform、entropy 接近 log(vocab)&lt;/td>
 &lt;td>分佈集中、entropy 降低&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>範例：vocab = 128K、uniform 分佈的 entropy = log(128K) ≈ 11.76（接近 12）；成熟模型在文本上的平均 entropy 約 2-3。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Entropy 本身在 LLM 訓練 / 推論很少直接出現、但理解它能解釋一些現象：&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> = exp(cross-entropy) 是模型平均不確定性的指數形式；temperature 控制 sampling entropy（高 T → 高 entropy → 多樣輸出）；某些評估方法（如 entropy-based uncertainty estimation）會看模型輸出分佈的 entropy 來判讀「模型有多確定」。&lt;/p></description><content:encoded><![CDATA[<p>Entropy（熵）的核心概念是「衡量一個機率分佈的不確定性」。Shannon entropy 公式：<code>H(P) = -sum(P(x) × log P(x))</code>。直覺：分佈越「平」、entropy 越大（任何結果都可能）；分佈越「尖」、entropy 越小（結果很確定）。Entropy 是 <a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy</a>、<a href="/blog/llm/knowledge-cards/kl-divergence/" data-link-title="KL Divergence" data-link-desc="衡量「兩個機率分佈差距」的非對稱指標、RLHF / DPO 等 alignment 訓練的關鍵約束">KL divergence</a>、資訊壓縮等概念的基底。</p>
<h2 id="概念位置">概念位置</h2>
<p>Entropy 跟 LLM 相關概念的關係：</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">Entropy(P) = -sum P log P                  ← 一個分佈自身的不確定性
</span></span><span class="line"><span class="ln">2</span><span class="cl">Cross-entropy(P, Q) = -sum P log Q         ← 用分佈 Q 編碼 P 的成本
</span></span><span class="line"><span class="ln">3</span><span class="cl">KL(P ‖ Q) = Cross-entropy(P, Q) - Entropy(P) ← 兩個分佈的差距</span></span></code></pre></div><p>Entropy 在 LLM 中的具體意義：</p>
<table>
  <thead>
      <tr>
          <th>場景</th>
          <th>Entropy 大</th>
          <th>Entropy 小</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>模型 next-token 預測分佈</td>
          <td>「不確定下個字、可能 N 種選項」</td>
          <td>「強烈傾向某幾個 token」</td>
      </tr>
      <tr>
          <td>Sampling temperature 高</td>
          <td>Entropy 高、輸出多樣</td>
          <td>Entropy 低、輸出確定</td>
      </tr>
      <tr>
          <td>訓練未收斂</td>
          <td>分佈接近 uniform、entropy 接近 log(vocab)</td>
          <td>分佈集中、entropy 降低</td>
      </tr>
  </tbody>
</table>
<p>範例：vocab = 128K、uniform 分佈的 entropy = log(128K) ≈ 11.76（接近 12）；成熟模型在文本上的平均 entropy 約 2-3。</p>
<h2 id="設計責任">設計責任</h2>
<p>Entropy 本身在 LLM 訓練 / 推論很少直接出現、但理解它能解釋一些現象：<a href="/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">perplexity</a> = exp(cross-entropy) 是模型平均不確定性的指數形式；temperature 控制 sampling entropy（高 T → 高 entropy → 多樣輸出）；某些評估方法（如 entropy-based uncertainty estimation）會看模型輸出分佈的 entropy 來判讀「模型有多確定」。</p>
]]></content:encoded></item><item><title>Floating Point（FP32 / FP16 / BF16）</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/floating-point/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/floating-point/</guid><description>&lt;p>Floating point（浮點數）的核心概念是「&lt;strong>用「符號位 + 指數位 + 尾數位」表示實數的二進制格式&lt;/strong>」。LLM 訓練跟推論用的精度（fp32 / bf16 / fp16）就是不同的位元分配方案。理解這些差異能解釋為什麼 bf16 是訓練主流、為什麼 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 對品質的影響不是「越多 bit 越好」這麼簡單。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>主流浮點格式的位元分配：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>格式&lt;/th>
 &lt;th>總 bit&lt;/th>
 &lt;th>符號位&lt;/th>
 &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>FP32&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>23&lt;/td>
 &lt;td>±10^38&lt;/td>
 &lt;td>7 位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>FP16&lt;/td>
 &lt;td>16&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>10&lt;/td>
 &lt;td>±65504（容易 overflow）&lt;/td>
 &lt;td>4 位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>BF16&lt;/td>
 &lt;td>16&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>7&lt;/td>
 &lt;td>±10^38（同 fp32）&lt;/td>
 &lt;td>3 位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>FP8 (E4M3 / E5M2)&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>4 / 5&lt;/td>
 &lt;td>3 / 2&lt;/td>
 &lt;td>視變體&lt;/td>
 &lt;td>1-2 位&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵 trade-off：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>FP16 精度好、範圍窄&lt;/strong>：尾數多、表達小範圍內細節準；但指數少、容易 overflow（gradient 爆炸時）/ underflow（gradient 接近 0 時）。&lt;/li>
&lt;li>&lt;strong>BF16 範圍跟 fp32 一樣大、精度差&lt;/strong>：指數位跟 fp32 同（8 位）、訓練時的 dynamic range 跟 fp32 接近、不會 overflow；但尾數少、精度差。實測對訓練影響小、所以是現代 LLM 訓練主流。&lt;/li>
&lt;li>&lt;strong>FP8 是新興格式&lt;/strong>：H100 / B200 等新 GPU 原生支援、訓練 / 推論都能加速、但精度損失需要 careful loss scaling。&lt;/li>
&lt;/ol>
&lt;p>LLM 工作流的精度選擇：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>場景&lt;/th>
 &lt;th>主流精度&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Pre-training（大模型）&lt;/td>
 &lt;td>BF16 + 部分 FP32（如 optimizer state）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fine-tuning&lt;/td>
 &lt;td>BF16 + 可選 FP8 / Q4（QLoRA）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>推論（雲端 high-end）&lt;/td>
 &lt;td>FP16 / BF16&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>推論（消費級本機）&lt;/td>
 &lt;td>Q4_K_M 等量化、見 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">quantization&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 paper / config 看到 &lt;code>mixed_precision: bf16&lt;/code>、&lt;code>torch_dtype: bfloat16&lt;/code> 就是 BF16 訓練。寫 code 場景的判讀：本機跑 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF&lt;/a> Q4_K_M 模型、內部運算的 activation 仍是 fp16 / bf16、只有權重儲存是 4-bit；&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> 預設也是 fp16、量化 KV cache 是進階優化（K=Q8 / V=Q4）。&lt;/p></description><content:encoded><![CDATA[<p>Floating point（浮點數）的核心概念是「<strong>用「符號位 + 指數位 + 尾數位」表示實數的二進制格式</strong>」。LLM 訓練跟推論用的精度（fp32 / bf16 / fp16）就是不同的位元分配方案。理解這些差異能解釋為什麼 bf16 是訓練主流、為什麼 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 對品質的影響不是「越多 bit 越好」這麼簡單。</p>
<h2 id="概念位置">概念位置</h2>
<p>主流浮點格式的位元分配：</p>
<table>
  <thead>
      <tr>
          <th>格式</th>
          <th>總 bit</th>
          <th>符號位</th>
          <th>指數位</th>
          <th>尾數位</th>
          <th>動態範圍</th>
          <th>精度（有效位數）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>FP32</td>
          <td>32</td>
          <td>1</td>
          <td>8</td>
          <td>23</td>
          <td>±10^38</td>
          <td>7 位</td>
      </tr>
      <tr>
          <td>FP16</td>
          <td>16</td>
          <td>1</td>
          <td>5</td>
          <td>10</td>
          <td>±65504（容易 overflow）</td>
          <td>4 位</td>
      </tr>
      <tr>
          <td>BF16</td>
          <td>16</td>
          <td>1</td>
          <td>8</td>
          <td>7</td>
          <td>±10^38（同 fp32）</td>
          <td>3 位</td>
      </tr>
      <tr>
          <td>FP8 (E4M3 / E5M2)</td>
          <td>8</td>
          <td>1</td>
          <td>4 / 5</td>
          <td>3 / 2</td>
          <td>視變體</td>
          <td>1-2 位</td>
      </tr>
  </tbody>
</table>
<p>關鍵 trade-off：</p>
<ol>
<li><strong>FP16 精度好、範圍窄</strong>：尾數多、表達小範圍內細節準；但指數少、容易 overflow（gradient 爆炸時）/ underflow（gradient 接近 0 時）。</li>
<li><strong>BF16 範圍跟 fp32 一樣大、精度差</strong>：指數位跟 fp32 同（8 位）、訓練時的 dynamic range 跟 fp32 接近、不會 overflow；但尾數少、精度差。實測對訓練影響小、所以是現代 LLM 訓練主流。</li>
<li><strong>FP8 是新興格式</strong>：H100 / B200 等新 GPU 原生支援、訓練 / 推論都能加速、但精度損失需要 careful loss scaling。</li>
</ol>
<p>LLM 工作流的精度選擇：</p>
<table>
  <thead>
      <tr>
          <th>場景</th>
          <th>主流精度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Pre-training（大模型）</td>
          <td>BF16 + 部分 FP32（如 optimizer state）</td>
      </tr>
      <tr>
          <td>Fine-tuning</td>
          <td>BF16 + 可選 FP8 / Q4（QLoRA）</td>
      </tr>
      <tr>
          <td>推論（雲端 high-end）</td>
          <td>FP16 / BF16</td>
      </tr>
      <tr>
          <td>推論（消費級本機）</td>
          <td>Q4_K_M 等量化、見 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">quantization</a></td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>讀 paper / config 看到 <code>mixed_precision: bf16</code>、<code>torch_dtype: bfloat16</code> 就是 BF16 訓練。寫 code 場景的判讀：本機跑 <a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF</a> Q4_K_M 模型、內部運算的 activation 仍是 fp16 / bf16、只有權重儲存是 4-bit；<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 預設也是 fp16、量化 KV cache 是進階優化（K=Q8 / V=Q4）。</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>Logit</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/logit/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/logit/</guid><description>&lt;p>Logit 的核心概念是「&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> 之前的原始分數」。LLM 每次 forward pass 的最後一步、會輸出長度為 vocab size 的實數向量（例如 vocab size = 128K、輸出就是 128K 個浮點數）、這個向量就是 logits。Logit 可正可負、無上下界、要經過 softmax 才變成機率分佈。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Logit 在 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">最後一層 Transformer 輸出 hidden state
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↓ output projection（linear layer）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">logits（shape: vocab_size、實數、可正可負）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↓ logit warping / masking（可選、用於控制輸出）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> ↓ /temperature
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> ↓ softmax
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">probability distribution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl"> ↓ sampling（greedy / top-k / top-p）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">next token&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>操作 logit 的常見技巧：&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>Temperature&lt;/td>
 &lt;td>logit / T&lt;/td>
 &lt;td>控制輸出隨機度、T 越大越平&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Logit bias&lt;/td>
 &lt;td>對特定 token 的 logit 加 / 減 offset&lt;/td>
 &lt;td>強制 / 抑制特定 token（如禁用特定詞）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Grammar masking&lt;/td>
 &lt;td>把不合法 token 的 logit 設成 -∞&lt;/td>
 &lt;td>Structured output、確保輸出符合 grammar&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Repetition penalty&lt;/td>
 &lt;td>對最近出現過的 token logit 扣分&lt;/td>
 &lt;td>避免重複、改善生成多樣性&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 logit 後可以判讀 sampling 階段的控制粒度：所有「不重訓模型、影響輸出」的技巧（temperature、structured output、constrained generation、logit bias）本質上都是「在 softmax 前後動 logit」、不是動模型權重。這也是為什麼同一個模型用不同 sampling 設定能產生差很多的輸出。&lt;/p></description><content:encoded><![CDATA[<p>Logit 的核心概念是「<a href="/blog/llm/knowledge-cards/softmax/" data-link-title="Softmax" data-link-desc="把任意實數向量正規化成「總和為 1、每個分量 ∈ [0,1]」的機率分佈">softmax</a> 之前的原始分數」。LLM 每次 forward pass 的最後一步、會輸出長度為 vocab size 的實數向量（例如 vocab size = 128K、輸出就是 128K 個浮點數）、這個向量就是 logits。Logit 可正可負、無上下界、要經過 softmax 才變成機率分佈。</p>
<h2 id="概念位置">概念位置</h2>
<p>Logit 在 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">最後一層 Transformer 輸出 hidden state
</span></span><span class="line"><span class="ln">2</span><span class="cl">   ↓ output projection（linear layer）
</span></span><span class="line"><span class="ln">3</span><span class="cl">logits（shape: vocab_size、實數、可正可負）
</span></span><span class="line"><span class="ln">4</span><span class="cl">   ↓ logit warping / masking（可選、用於控制輸出）
</span></span><span class="line"><span class="ln">5</span><span class="cl">   ↓ /temperature
</span></span><span class="line"><span class="ln">6</span><span class="cl">   ↓ softmax
</span></span><span class="line"><span class="ln">7</span><span class="cl">probability distribution
</span></span><span class="line"><span class="ln">8</span><span class="cl">   ↓ sampling（greedy / top-k / top-p）
</span></span><span class="line"><span class="ln">9</span><span class="cl">next token</span></span></code></pre></div><p>操作 logit 的常見技巧：</p>
<table>
  <thead>
      <tr>
          <th>技巧</th>
          <th>做法</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Temperature</td>
          <td>logit / T</td>
          <td>控制輸出隨機度、T 越大越平</td>
      </tr>
      <tr>
          <td>Logit bias</td>
          <td>對特定 token 的 logit 加 / 減 offset</td>
          <td>強制 / 抑制特定 token（如禁用特定詞）</td>
      </tr>
      <tr>
          <td>Grammar masking</td>
          <td>把不合法 token 的 logit 設成 -∞</td>
          <td>Structured output、確保輸出符合 grammar</td>
      </tr>
      <tr>
          <td>Repetition penalty</td>
          <td>對最近出現過的 token logit 扣分</td>
          <td>避免重複、改善生成多樣性</td>
      </tr>
  </tbody>
</table>
<h2 id="設計責任">設計責任</h2>
<p>理解 logit 後可以判讀 sampling 階段的控制粒度：所有「不重訓模型、影響輸出」的技巧（temperature、structured output、constrained generation、logit bias）本質上都是「在 softmax 前後動 logit」、不是動模型權重。這也是為什麼同一個模型用不同 sampling 設定能產生差很多的輸出。</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>Matrix Multiplication</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/matrix-multiplication/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/matrix-multiplication/</guid><description>&lt;p>Matrix multiplication（矩陣乘法、matmul、&lt;code>@&lt;/code>）的核心概念是「&lt;strong>左矩陣的每個 row 跟右矩陣的每個 column 做 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">dot product&lt;/a>、結果填進新矩陣&lt;/strong>」。對 &lt;code>A (m × k)&lt;/code> 跟 &lt;code>B (k × n)&lt;/code>、結果 &lt;code>C (m × n)&lt;/code>、其中 &lt;code>C[i][j] = A 第 i row · B 第 j column&lt;/code>。Matmul 是 LLM 推論最頻繁的運算、整個 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/forward-pass/" data-link-title="Forward Pass" data-link-desc="input 經過所有 layer 的計算、得到 output 的單向流程；推論跟訓練都會跑、訓練多一個反向階段">forward pass&lt;/a> 可以看成幾百次 matmul 串起來。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 中 matmul 出現的關鍵位置：&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>Embedding lookup&lt;/td>
 &lt;td>&lt;code>(seq_len, vocab) @ (vocab, hidden)&lt;/code> ≡ 查表&lt;/td>
 &lt;td>Token ID → embedding&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Q/K/V 投影&lt;/td>
 &lt;td>&lt;code>(seq_len, hidden) @ (hidden, hidden)&lt;/code>&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/self-attention/" data-link-title="Self-Attention" data-link-desc="Q / K / V 都從同一個 sequence 投影出來的 attention、Transformer 的標誌性設計">Self-attention&lt;/a> 第一步&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Attention score&lt;/td>
 &lt;td>&lt;code>(seq_len, head_dim) @ (head_dim, seq_len)&lt;/code>&lt;/td>
 &lt;td>Q · K^T、O(n²)、long context 痛點&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Attention output&lt;/td>
 &lt;td>&lt;code>(seq_len, seq_len) @ (seq_len, head_dim)&lt;/code>&lt;/td>
 &lt;td>attention weight · V&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/ffn/" data-link-title="FFN（Feed-Forward Network）" data-link-desc="Transformer block 內部的兩層 linear &amp;#43; activation、佔模型參數量的多數">FFN&lt;/a> up&lt;/td>
 &lt;td>&lt;code>(seq_len, hidden) @ (hidden, 4×hidden)&lt;/code>&lt;/td>
 &lt;td>FFN 升維、參數大頭&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>FFN down&lt;/td>
 &lt;td>&lt;code>(seq_len, 4×hidden) @ (4×hidden, hidden)&lt;/code>&lt;/td>
 &lt;td>FFN 降維&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Output projection&lt;/td>
 &lt;td>&lt;code>(seq_len, hidden) @ (hidden, vocab)&lt;/code>&lt;/td>
 &lt;td>Hidden → logits&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵尺寸規則：&lt;strong>左矩陣 column 數 = 右矩陣 row 數&lt;/strong>、即 &lt;code>(m × k) @ (k × n) = (m × n)&lt;/code>。Dimension mismatch 是訓練 / 推論最常見的 PyTorch 報錯之一。&lt;/p>
&lt;h2 id="為什麼-matmul-是-memory-bandwidth-bound">為什麼 matmul 是 &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> bound&lt;/h2>
&lt;p>LLM 推論每生一個 token、要把整份模型權重從記憶體讀到處理器一次（每個權重在當輪 forward pass 的某個 matmul 都用得到）；現代 GPU / Apple Silicon 的算力遠超頻寬、所以「讀權重要多久」變主要瓶頸。這就是為什麼：&lt;/p>
&lt;ul>
&lt;li>31B 模型 Q4_K_M 約 18GB、M4 Max 頻寬 546 GB/s、理論上限 ≈ 30 tok/s&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 加速主要是「權重變小、每秒能讀過更多次完整模型」&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/batching/" data-link-title="Batching" data-link-desc="多 request 一起跑、攤平 model load 成本：production LLM inference 的核心優化、決定 throughput vs latency 取捨">Batching&lt;/a> / &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> 加速主要是「一次讀權重、攤平到多個 token」&lt;/li>
&lt;/ul>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 paper / model card 看到模型參數量、可以反推總 matmul 工作量；看到 inference benchmark 看到 tok/s、可以用「模型大小 / memory bandwidth」算理論上限對照。寫 code 場景無需直接寫 matmul、但理解這個運算的成本結構、能看懂量化 / batching / speculative decoding 等加速技巧為什麼有效。&lt;/p></description><content:encoded><![CDATA[<p>Matrix multiplication（矩陣乘法、matmul、<code>@</code>）的核心概念是「<strong>左矩陣的每個 row 跟右矩陣的每個 column 做 <a href="/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">dot product</a>、結果填進新矩陣</strong>」。對 <code>A (m × k)</code> 跟 <code>B (k × n)</code>、結果 <code>C (m × n)</code>、其中 <code>C[i][j] = A 第 i row · B 第 j column</code>。Matmul 是 LLM 推論最頻繁的運算、整個 <a href="/blog/llm/knowledge-cards/forward-pass/" data-link-title="Forward Pass" data-link-desc="input 經過所有 layer 的計算、得到 output 的單向流程；推論跟訓練都會跑、訓練多一個反向階段">forward pass</a> 可以看成幾百次 matmul 串起來。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 中 matmul 出現的關鍵位置：</p>
<table>
  <thead>
      <tr>
          <th>位置</th>
          <th>形狀（簡化）</th>
          <th>角色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Embedding lookup</td>
          <td><code>(seq_len, vocab) @ (vocab, hidden)</code> ≡ 查表</td>
          <td>Token ID → embedding</td>
      </tr>
      <tr>
          <td>Q/K/V 投影</td>
          <td><code>(seq_len, hidden) @ (hidden, hidden)</code></td>
          <td><a href="/blog/llm/knowledge-cards/self-attention/" data-link-title="Self-Attention" data-link-desc="Q / K / V 都從同一個 sequence 投影出來的 attention、Transformer 的標誌性設計">Self-attention</a> 第一步</td>
      </tr>
      <tr>
          <td>Attention score</td>
          <td><code>(seq_len, head_dim) @ (head_dim, seq_len)</code></td>
          <td>Q · K^T、O(n²)、long context 痛點</td>
      </tr>
      <tr>
          <td>Attention output</td>
          <td><code>(seq_len, seq_len) @ (seq_len, head_dim)</code></td>
          <td>attention weight · V</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/ffn/" data-link-title="FFN（Feed-Forward Network）" data-link-desc="Transformer block 內部的兩層 linear &#43; activation、佔模型參數量的多數">FFN</a> up</td>
          <td><code>(seq_len, hidden) @ (hidden, 4×hidden)</code></td>
          <td>FFN 升維、參數大頭</td>
      </tr>
      <tr>
          <td>FFN down</td>
          <td><code>(seq_len, 4×hidden) @ (4×hidden, hidden)</code></td>
          <td>FFN 降維</td>
      </tr>
      <tr>
          <td>Output projection</td>
          <td><code>(seq_len, hidden) @ (hidden, vocab)</code></td>
          <td>Hidden → logits</td>
      </tr>
  </tbody>
</table>
<p>關鍵尺寸規則：<strong>左矩陣 column 數 = 右矩陣 row 數</strong>、即 <code>(m × k) @ (k × n) = (m × n)</code>。Dimension mismatch 是訓練 / 推論最常見的 PyTorch 報錯之一。</p>
<h2 id="為什麼-matmul-是-memory-bandwidth-bound">為什麼 matmul 是 <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a> bound</h2>
<p>LLM 推論每生一個 token、要把整份模型權重從記憶體讀到處理器一次（每個權重在當輪 forward pass 的某個 matmul 都用得到）；現代 GPU / Apple Silicon 的算力遠超頻寬、所以「讀權重要多久」變主要瓶頸。這就是為什麼：</p>
<ul>
<li>31B 模型 Q4_K_M 約 18GB、M4 Max 頻寬 546 GB/s、理論上限 ≈ 30 tok/s</li>
<li><a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 加速主要是「權重變小、每秒能讀過更多次完整模型」</li>
<li><a href="/blog/llm/knowledge-cards/batching/" data-link-title="Batching" data-link-desc="多 request 一起跑、攤平 model load 成本：production LLM inference 的核心優化、決定 throughput vs latency 取捨">Batching</a> / <a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a> 加速主要是「一次讀權重、攤平到多個 token」</li>
</ul>
<h2 id="設計責任">設計責任</h2>
<p>讀 paper / model card 看到模型參數量、可以反推總 matmul 工作量；看到 inference benchmark 看到 tok/s、可以用「模型大小 / memory bandwidth」算理論上限對照。寫 code 場景無需直接寫 matmul、但理解這個運算的成本結構、能看懂量化 / batching / speculative decoding 等加速技巧為什麼有效。</p>
]]></content:encoded></item><item><title>Perplexity</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/perplexity/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/perplexity/</guid><description>&lt;p>Perplexity（困惑度）的核心概念是「&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;code>perplexity = exp(cross-entropy)&lt;/code>。直覺意義是「模型在每個位置平均覺得下個 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token&lt;/a> 有多少種候選」。perplexity = 1 表示模型完美預測；perplexity = vocab_size 表示模型純猜（vocab 上的 uniform 分佈）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Perplexity 跟 cross-entropy 的關係：&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;code>-mean(log p_true)&lt;/code>、底通常是 e&lt;/td>
 &lt;td>loss 數字、訓練拿來最佳化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Perplexity&lt;/td>
 &lt;td>&lt;code>exp(cross-entropy)&lt;/code>&lt;/td>
 &lt;td>「平均看到幾種候選」、好讀&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>換算範例（base e）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Cross-entropy&lt;/th>
 &lt;th>Perplexity&lt;/th>
 &lt;th>意義（極粗略直覺）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>11&lt;/td>
 &lt;td>~60K&lt;/td>
 &lt;td>純隨機（vocab ≈ 128K 時）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5&lt;/td>
 &lt;td>~148&lt;/td>
 &lt;td>早期訓練&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3&lt;/td>
 &lt;td>~20&lt;/td>
 &lt;td>中等訓練模型&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2&lt;/td>
 &lt;td>~7.4&lt;/td>
 &lt;td>接近現代成熟 LLM 在文本上的表現&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>0&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>完美預測（不可能達到）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Perplexity 主要用於：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>預訓練評估&lt;/strong>：在 held-out 語料上算 perplexity、衡量基礎建模能力。&lt;/li>
&lt;li>&lt;strong>量化品質衡量&lt;/strong>：fp16 vs Q4 vs Q3 模型的 perplexity 差異、看量化造成多少品質損失。&lt;/li>
&lt;li>&lt;strong>領域 benchmark&lt;/strong>：在特定領域語料（code、math、医學文獻）上算 perplexity、評估模型對該領域的熟悉度。&lt;/li>
&lt;/ul>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Perplexity 是 base model 評估標準、但對 instruction-tuned / chat 模型用處有限（chat 模型輸出風格已偏離 raw text、perplexity 不一定降）。對寫 code 場景的判讀：看到 paper 報 perplexity 是評估 pretrain 品質的訊號、實際聊天 / coding 能力要看 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench&lt;/a>、MMLU、HumanEval 等任務式 benchmark。&lt;/p></description><content:encoded><![CDATA[<p>Perplexity（困惑度）的核心概念是「<a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy</a> 的指數形式」：<code>perplexity = exp(cross-entropy)</code>。直覺意義是「模型在每個位置平均覺得下個 <a href="/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token</a> 有多少種候選」。perplexity = 1 表示模型完美預測；perplexity = vocab_size 表示模型純猜（vocab 上的 uniform 分佈）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Perplexity 跟 cross-entropy 的關係：</p>
<table>
  <thead>
      <tr>
          <th>指標</th>
          <th>公式 / 定義</th>
          <th>人類直覺</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cross-entropy</td>
          <td><code>-mean(log p_true)</code>、底通常是 e</td>
          <td>loss 數字、訓練拿來最佳化</td>
      </tr>
      <tr>
          <td>Perplexity</td>
          <td><code>exp(cross-entropy)</code></td>
          <td>「平均看到幾種候選」、好讀</td>
      </tr>
  </tbody>
</table>
<p>換算範例（base e）：</p>
<table>
  <thead>
      <tr>
          <th>Cross-entropy</th>
          <th>Perplexity</th>
          <th>意義（極粗略直覺）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>11</td>
          <td>~60K</td>
          <td>純隨機（vocab ≈ 128K 時）</td>
      </tr>
      <tr>
          <td>5</td>
          <td>~148</td>
          <td>早期訓練</td>
      </tr>
      <tr>
          <td>3</td>
          <td>~20</td>
          <td>中等訓練模型</td>
      </tr>
      <tr>
          <td>2</td>
          <td>~7.4</td>
          <td>接近現代成熟 LLM 在文本上的表現</td>
      </tr>
      <tr>
          <td>0</td>
          <td>1</td>
          <td>完美預測（不可能達到）</td>
      </tr>
  </tbody>
</table>
<p>Perplexity 主要用於：</p>
<ul>
<li><strong>預訓練評估</strong>：在 held-out 語料上算 perplexity、衡量基礎建模能力。</li>
<li><strong>量化品質衡量</strong>：fp16 vs Q4 vs Q3 模型的 perplexity 差異、看量化造成多少品質損失。</li>
<li><strong>領域 benchmark</strong>：在特定領域語料（code、math、医學文獻）上算 perplexity、評估模型對該領域的熟悉度。</li>
</ul>
<h2 id="設計責任">設計責任</h2>
<p>Perplexity 是 base model 評估標準、但對 instruction-tuned / chat 模型用處有限（chat 模型輸出風格已偏離 raw text、perplexity 不一定降）。對寫 code 場景的判讀：看到 paper 報 perplexity 是評估 pretrain 品質的訊號、實際聊天 / coding 能力要看 <a href="/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench</a>、MMLU、HumanEval 等任務式 benchmark。</p>
]]></content:encoded></item><item><title>Softmax</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/softmax/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/softmax/</guid><description>&lt;p>Softmax 的核心概念是「把一串實數轉成機率分佈」。公式是 &lt;code>softmax(x_i) = exp(x_i) / sum(exp(x_j))&lt;/code>、輸出總和為 1、每個值 ∈ [0, 1]。它是 LLM 兩個關鍵環節的常駐元件：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention&lt;/a> 的權重計算、跟 sampling 階段把 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit&lt;/a> 轉成「下個 token 的機率分佈」。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 中 softmax 出現的兩個位置：&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">位置 1：Attention 內部
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> Q · K^T → 一堆 score
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> softmax(scores) → attention weight（總和 1）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> weight · V → output
&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">位置 2：每次 token 生成的最後一步
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl"> 最後一層 hidden → logit（每個 vocab token 一個實數分數）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl"> softmax(logits / temperature) → 機率分佈
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl"> 從這個分佈 sample 出下一個 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>softmax 的作用&lt;/th>
 &lt;th>影響&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Attention&lt;/td>
 &lt;td>把 attention score 正規化成「該關注多少」&lt;/td>
 &lt;td>影響模型怎麼整合 context 資訊&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sampling 端&lt;/td>
 &lt;td>把 logit 變機率、配合 temperature 調分佈陡度&lt;/td>
 &lt;td>影響輸出的多樣性 / 確定性&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Temperature 在 sampling 端跟 softmax 結合：&lt;code>softmax(logits / T)&lt;/code>、T 越小分佈越尖（接近 greedy）、T 越大分佈越平（接近隨機）。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 softmax 後可以判讀幾件事：temperature 為什麼影響輸出多樣性（改的是 softmax 前的縮放）、為什麼 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit&lt;/a> bias / logit warping 等技巧能控制輸出（直接動 softmax 的輸入）、為什麼 &lt;a href="https://tarrragon.github.io/blog/llm/04-applications/tool-use-principles/" data-link-title="4.3 Tool use 原理：LLM 跟外部世界互動" data-link-desc="Structured output 是 LLM 跨入工程系統的橋、function calling 取捨、為什麼本地小模型 tool use 表現崩潰">structured output&lt;/a> 的 grammar-constrained sampling 是「把不合法 token 的機率歸零」（在 softmax 後或前做 masking）。&lt;/p></description><content:encoded><![CDATA[<p>Softmax 的核心概念是「把一串實數轉成機率分佈」。公式是 <code>softmax(x_i) = exp(x_i) / sum(exp(x_j))</code>、輸出總和為 1、每個值 ∈ [0, 1]。它是 LLM 兩個關鍵環節的常駐元件：<a href="/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention</a> 的權重計算、跟 sampling 階段把 <a href="/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit</a> 轉成「下個 token 的機率分佈」。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 中 softmax 出現的兩個位置：</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">位置 1：Attention 內部
</span></span><span class="line"><span class="ln">2</span><span class="cl">  Q · K^T → 一堆 score
</span></span><span class="line"><span class="ln">3</span><span class="cl">  softmax(scores) → attention weight（總和 1）
</span></span><span class="line"><span class="ln">4</span><span class="cl">  weight · V → output
</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">位置 2：每次 token 生成的最後一步
</span></span><span class="line"><span class="ln">7</span><span class="cl">  最後一層 hidden → logit（每個 vocab token 一個實數分數）
</span></span><span class="line"><span class="ln">8</span><span class="cl">  softmax(logits / temperature) → 機率分佈
</span></span><span class="line"><span class="ln">9</span><span class="cl">  從這個分佈 sample 出下一個 token</span></span></code></pre></div><p>兩個位置的關鍵差異：</p>
<table>
  <thead>
      <tr>
          <th>位置</th>
          <th>softmax 的作用</th>
          <th>影響</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Attention</td>
          <td>把 attention score 正規化成「該關注多少」</td>
          <td>影響模型怎麼整合 context 資訊</td>
      </tr>
      <tr>
          <td>Sampling 端</td>
          <td>把 logit 變機率、配合 temperature 調分佈陡度</td>
          <td>影響輸出的多樣性 / 確定性</td>
      </tr>
  </tbody>
</table>
<p>Temperature 在 sampling 端跟 softmax 結合：<code>softmax(logits / T)</code>、T 越小分佈越尖（接近 greedy）、T 越大分佈越平（接近隨機）。</p>
<h2 id="設計責任">設計責任</h2>
<p>理解 softmax 後可以判讀幾件事：temperature 為什麼影響輸出多樣性（改的是 softmax 前的縮放）、為什麼 <a href="/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit</a> bias / logit warping 等技巧能控制輸出（直接動 softmax 的輸入）、為什麼 <a href="/blog/llm/04-applications/tool-use-principles/" data-link-title="4.3 Tool use 原理：LLM 跟外部世界互動" data-link-desc="Structured output 是 LLM 跨入工程系統的橋、function calling 取捨、為什麼本地小模型 tool use 表現崩潰">structured output</a> 的 grammar-constrained sampling 是「把不合法 token 的機率歸零」（在 softmax 後或前做 masking）。</p>
]]></content:encoded></item><item><title>Tensor</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/tensor/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/tensor/</guid><description>&lt;p>Tensor（張量）的核心概念是「&lt;strong>N 維陣列&lt;/strong>」。Scalar 是 0D tensor、vector 是 1D、matrix 是 2D、再往上加維度就是 3D、4D。PyTorch、MLX、JAX、TensorFlow 等所有深度學習 framework 的核心型別都叫 Tensor、所有 LLM 內部運算（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/matrix-multiplication/" data-link-title="Matrix Multiplication" data-link-desc="LLM 推論最頻繁的單一運算、forward pass 每層的核心、memory bandwidth 瓶頸的根源">matrix multiplication&lt;/a>、&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;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> 等）都對 tensor 做。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>LLM 中常見的 tensor 維度：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>shape&lt;/th>
 &lt;th>意義&lt;/th>
 &lt;th>出現在&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>1D&lt;/td>
 &lt;td>&lt;code>(vocab_size,)&lt;/code>&lt;/td>
 &lt;td>一個 token 位置的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit&lt;/a> 向量&lt;/td>
 &lt;td>Output layer 輸出&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2D&lt;/td>
 &lt;td>&lt;code>(seq_len, hidden_dim)&lt;/code>&lt;/td>
 &lt;td>一個 sequence 的 hidden state&lt;/td>
 &lt;td>每個 Transformer block 內部&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3D&lt;/td>
 &lt;td>&lt;code>(batch_size, seq_len, hidden_dim)&lt;/code>&lt;/td>
 &lt;td>一個 batch 的多個 sequence&lt;/td>
 &lt;td>Batched 推論 / 訓練&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>4D&lt;/td>
 &lt;td>&lt;code>(batch_size, num_heads, seq_len, head_dim)&lt;/code>&lt;/td>
 &lt;td>Multi-head attention 的並行結構&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/self-attention/" data-link-title="Self-Attention" data-link-desc="Q / K / V 都從同一個 sequence 投影出來的 attention、Transformer 的標誌性設計">Self-attention&lt;/a> 內部&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5D+&lt;/td>
 &lt;td>&lt;code>(batch, heads, seq, head_dim, ...)&lt;/code>&lt;/td>
 &lt;td>罕見、特殊架構&lt;/td>
 &lt;td>MoE expert dispatch、特殊 attention&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵運算：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Reshape&lt;/strong>：改 shape 但不變資料總量、如 &lt;code>(batch, seq, hidden) → (batch * seq, hidden)&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Transpose / permute&lt;/strong>：交換維度順序、attention 計算前後常用。&lt;/li>
&lt;li>&lt;strong>Broadcasting&lt;/strong>：不同 shape 的 tensor 自動擴展配對、如 &lt;code>(seq, hidden) + (hidden,)&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Indexing / slicing&lt;/strong>：抽出子 tensor、如 &lt;code>tensor[:, -1, :]&lt;/code> 取最後一個 token 的 hidden。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 PyTorch / MLX 推論 / 訓練 code 看到 &lt;code>torch.Tensor&lt;/code>、&lt;code>mx.array&lt;/code>、&lt;code>tf.Tensor&lt;/code> 等就是這個型別、所有 LLM 運算都建在它上面。寫 code 場景的判讀：報錯訊息看到 &lt;code>shape mismatch&lt;/code> / &lt;code>size of dimension X&lt;/code> 通常是 tensor 維度配錯；&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> 內部存的就是 4D tensor &lt;code>(num_layers, 2, batch, num_kv_heads, seq, head_dim)&lt;/code> 之類的結構、量化 KV cache 就是改這個 tensor 的 dtype。&lt;/p></description><content:encoded><![CDATA[<p>Tensor（張量）的核心概念是「<strong>N 維陣列</strong>」。Scalar 是 0D tensor、vector 是 1D、matrix 是 2D、再往上加維度就是 3D、4D。PyTorch、MLX、JAX、TensorFlow 等所有深度學習 framework 的核心型別都叫 Tensor、所有 LLM 內部運算（<a href="/blog/llm/knowledge-cards/matrix-multiplication/" data-link-title="Matrix Multiplication" data-link-desc="LLM 推論最頻繁的單一運算、forward pass 每層的核心、memory bandwidth 瓶頸的根源">matrix multiplication</a>、<a href="/blog/llm/knowledge-cards/softmax/" data-link-title="Softmax" data-link-desc="把任意實數向量正規化成「總和為 1、每個分量 ∈ [0,1]」的機率分佈">softmax</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> 等）都對 tensor 做。</p>
<h2 id="概念位置">概念位置</h2>
<p>LLM 中常見的 tensor 維度：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>shape</th>
          <th>意義</th>
          <th>出現在</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1D</td>
          <td><code>(vocab_size,)</code></td>
          <td>一個 token 位置的 <a href="/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit</a> 向量</td>
          <td>Output layer 輸出</td>
      </tr>
      <tr>
          <td>2D</td>
          <td><code>(seq_len, hidden_dim)</code></td>
          <td>一個 sequence 的 hidden state</td>
          <td>每個 Transformer block 內部</td>
      </tr>
      <tr>
          <td>3D</td>
          <td><code>(batch_size, seq_len, hidden_dim)</code></td>
          <td>一個 batch 的多個 sequence</td>
          <td>Batched 推論 / 訓練</td>
      </tr>
      <tr>
          <td>4D</td>
          <td><code>(batch_size, num_heads, seq_len, head_dim)</code></td>
          <td>Multi-head attention 的並行結構</td>
          <td><a href="/blog/llm/knowledge-cards/self-attention/" data-link-title="Self-Attention" data-link-desc="Q / K / V 都從同一個 sequence 投影出來的 attention、Transformer 的標誌性設計">Self-attention</a> 內部</td>
      </tr>
      <tr>
          <td>5D+</td>
          <td><code>(batch, heads, seq, head_dim, ...)</code></td>
          <td>罕見、特殊架構</td>
          <td>MoE expert dispatch、特殊 attention</td>
      </tr>
  </tbody>
</table>
<p>關鍵運算：</p>
<ol>
<li><strong>Reshape</strong>：改 shape 但不變資料總量、如 <code>(batch, seq, hidden) → (batch * seq, hidden)</code>。</li>
<li><strong>Transpose / permute</strong>：交換維度順序、attention 計算前後常用。</li>
<li><strong>Broadcasting</strong>：不同 shape 的 tensor 自動擴展配對、如 <code>(seq, hidden) + (hidden,)</code>。</li>
<li><strong>Indexing / slicing</strong>：抽出子 tensor、如 <code>tensor[:, -1, :]</code> 取最後一個 token 的 hidden。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 PyTorch / MLX 推論 / 訓練 code 看到 <code>torch.Tensor</code>、<code>mx.array</code>、<code>tf.Tensor</code> 等就是這個型別、所有 LLM 運算都建在它上面。寫 code 場景的判讀：報錯訊息看到 <code>shape mismatch</code> / <code>size of dimension X</code> 通常是 tensor 維度配錯；<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 內部存的就是 4D tensor <code>(num_layers, 2, batch, num_kv_heads, seq, head_dim)</code> 之類的結構、量化 KV cache 就是改這個 tensor 的 dtype。</p>
]]></content:encoded></item><item><title>Vector Norm</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/vector-norm/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/vector-norm/</guid><description>&lt;p>Vector norm（向量範數）的核心概念是「&lt;strong>衡量向量「大小」的純量值&lt;/strong>」。最常用的 L2 norm（歐式長度）= 把每個分量平方加總再開根號；但 L1、L∞ 等其他 norm 也在不同場景出現。Norm 在 LLM 中支撐 cosine similarity、layer normalization、gradient clipping 等核心機制。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>主流 norm 的定義與用途：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Norm&lt;/th>
 &lt;th>定義&lt;/th>
 &lt;th>LLM 中的用途&lt;/th>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>L1（Manhattan）&lt;/td>
 &lt;td>`sum(&lt;/td>
 &lt;td>v_i&lt;/td>
 &lt;td>)`&lt;/td>
 &lt;td>L1 regularization、稀疏化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>L2（Euclidean）&lt;/strong>&lt;/td>
 &lt;td>&lt;code>sqrt(sum(v_i²))&lt;/code>&lt;/td>
 &lt;td>預設「向量長度」、cosine similarity 的分母&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>L∞（max）&lt;/td>
 &lt;td>`max(&lt;/td>
 &lt;td>v_i&lt;/td>
 &lt;td>)`&lt;/td>
 &lt;td>Gradient clipping by max value、某些 attention scaling&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>L2 norm 在 LLM 中的關鍵應用：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Cosine similarity&lt;/strong>：&lt;code>cos(a, b) = (a · b) / (||a||₂ × ||b||₂)&lt;/code>、衡量兩個向量的方向相似度、是 &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> / semantic search 的核心指標。&lt;/li>
&lt;li>&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> 正規化&lt;/strong>：通常把 embedding 正規化到 L2 norm = 1、之後 cosine similarity 退化成單純內積（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">dot product&lt;/a>）、計算更快。&lt;/li>
&lt;li>&lt;strong>Gradient clipping&lt;/strong>：訓練時若 &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> 的 L2 norm 超過閾值（如 1.0）、整體縮放回去、避免 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gradient-explosion-vanishing/" data-link-title="Gradient Explosion / Vanishing" data-link-desc="深層網路訓練中 gradient 透過 chain rule 累乘、容易爆炸或衰減到 0 的兩種失敗模式">explosion&lt;/a>。&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）、穩定深層網路訓練">Layer normalization&lt;/a>&lt;/strong>：RMSNorm 用 L2 norm（root mean square）做正規化。&lt;/li>
&lt;/ol>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>讀 RAG / embedding 教學看到「normalize embeddings」「cosine similarity」就是 L2 相關運算。寫 code 場景的判讀：用 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/vector-database/" data-link-title="Vector Database" data-link-desc="為高維向量 (embedding) 設計的儲存 &amp;#43; 近似最近鄰 (ANN) 檢索系統：RAG 從 prototype 跨到 production 的關鍵元件">vector database&lt;/a> 時、若 embedding 已 L2-normalized、距離指標選 dot product 比 cosine 快（結果相同）；訓練 / fine-tune 自己 model 時、&lt;code>gradient_clip: 1.0&lt;/code> 是常見預設、防止 gradient 偶發爆炸。&lt;/p></description><content:encoded><![CDATA[<p>Vector norm（向量範數）的核心概念是「<strong>衡量向量「大小」的純量值</strong>」。最常用的 L2 norm（歐式長度）= 把每個分量平方加總再開根號；但 L1、L∞ 等其他 norm 也在不同場景出現。Norm 在 LLM 中支撐 cosine similarity、layer normalization、gradient clipping 等核心機制。</p>
<h2 id="概念位置">概念位置</h2>
<p>主流 norm 的定義與用途：</p>
<table>
  <thead>
      <tr>
          <th>Norm</th>
          <th>定義</th>
          <th>LLM 中的用途</th>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>L1（Manhattan）</td>
          <td>`sum(</td>
          <td>v_i</td>
          <td>)`</td>
          <td>L1 regularization、稀疏化</td>
      </tr>
      <tr>
          <td><strong>L2（Euclidean）</strong></td>
          <td><code>sqrt(sum(v_i²))</code></td>
          <td>預設「向量長度」、cosine similarity 的分母</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>L∞（max）</td>
          <td>`max(</td>
          <td>v_i</td>
          <td>)`</td>
          <td>Gradient clipping by max value、某些 attention scaling</td>
      </tr>
  </tbody>
</table>
<p>L2 norm 在 LLM 中的關鍵應用：</p>
<ol>
<li><strong>Cosine similarity</strong>：<code>cos(a, b) = (a · b) / (||a||₂ × ||b||₂)</code>、衡量兩個向量的方向相似度、是 <a href="/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG</a> / semantic search 的核心指標。</li>
<li><strong><a href="/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">Embedding model</a> 正規化</strong>：通常把 embedding 正規化到 L2 norm = 1、之後 cosine similarity 退化成單純內積（<a href="/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">dot product</a>）、計算更快。</li>
<li><strong>Gradient clipping</strong>：訓練時若 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a> 的 L2 norm 超過閾值（如 1.0）、整體縮放回去、避免 <a href="/blog/llm/knowledge-cards/gradient-explosion-vanishing/" data-link-title="Gradient Explosion / Vanishing" data-link-desc="深層網路訓練中 gradient 透過 chain rule 累乘、容易爆炸或衰減到 0 的兩種失敗模式">explosion</a>。</li>
<li><strong><a href="/blog/llm/knowledge-cards/layer-normalization/" data-link-title="Layer Normalization" data-link-desc="在每個 token 的 hidden state 上做正規化（減 mean、除 std）、穩定深層網路訓練">Layer normalization</a></strong>：RMSNorm 用 L2 norm（root mean square）做正規化。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 RAG / embedding 教學看到「normalize embeddings」「cosine similarity」就是 L2 相關運算。寫 code 場景的判讀：用 <a href="/blog/llm/knowledge-cards/vector-database/" data-link-title="Vector Database" data-link-desc="為高維向量 (embedding) 設計的儲存 &#43; 近似最近鄰 (ANN) 檢索系統：RAG 從 prototype 跨到 production 的關鍵元件">vector database</a> 時、若 embedding 已 L2-normalized、距離指標選 dot product 比 cosine 快（結果相同）；訓練 / fine-tune 自己 model 時、<code>gradient_clip: 1.0</code> 是常見預設、防止 gradient 偶發爆炸。</p>
]]></content:encoded></item><item><title>2.1 機率與資訊論</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/probability-and-information/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/02-math-foundations/probability-and-information/</guid><description>&lt;p>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 結束後、會對詞彙表中每個 token 給出一個分數（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit&lt;/a>）；&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> 把分數轉成合法的機率分佈、之後用各種 sampling 策略挑下一個 token。訓練時用 cross-entropy loss 衡量「模型預測的機率分佈跟真實答案差多少」、最佳化方向就是讓兩者盡量靠近。&lt;/p>
&lt;p>本章整理這條鏈上的核心概念。每個概念給出定義、在 LLM 中的位置、實務上會在哪裡遇到。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>解釋 LLM 輸出層為什麼用 softmax、不用其他正規化方式。&lt;/li>
&lt;li>看到 &lt;code>temperature=0.2&lt;/code> 設定時、知道它在調機率分佈的什麼。&lt;/li>
&lt;li>看到 benchmark 報告 perplexity 數字時、知道它衡量什麼。&lt;/li>
&lt;li>理解 cross-entropy 為什麼是 LLM 訓練的標準 loss function。&lt;/li>
&lt;/ol>
&lt;h2 id="機率分佈把可能性量化">機率分佈：把可能性量化&lt;/h2>
&lt;p>機率分佈（probability distribution）的核心定義是「對所有可能事件指派一個機率值、總和為 1、每個值在 0 到 1 之間」。LLM 中的核心場景：對詞彙表中每個 token 指派一個機率、總和為 1。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/vocabulary-size/" data-link-title="Vocabulary Size" data-link-desc="tokenizer 詞彙表的 token 總數、影響 embedding 大小、tokenization 粒度、多語言友善度">詞彙表大小&lt;/a>（vocabulary size）通常幾萬到十幾萬：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>模型&lt;/th>
 &lt;th>Vocab Size&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Llama 3 系列&lt;/td>
 &lt;td>128,256&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Gemma 4 系列&lt;/td>
 &lt;td>256,000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GPT-4o&lt;/td>
 &lt;td>~200,000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Qwen3 系列&lt;/td>
 &lt;td>152,064&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>模型最後一層的輸出是「對這 N 個 token 的機率分佈」、N 是 vocab size。每生一個新 token、就 sample 一次這個分佈。&lt;/p>
&lt;h2 id="logitsoftmax-之前的原始分數">Logit：softmax 之前的原始分數&lt;/h2>
&lt;p>Logit 的核心定義是「模型最後一層輸出的原始分數、還沒正規化成機率」。每個 token 對應一個 logit、可以是任意實數（包括負數）。&lt;/p>
&lt;p>Logits 的形狀是 &lt;code>(vocab_size,)&lt;/code>、例如 Gemma 4 的 logits 是長度 256,000 的向量。直接看 logits 沒意義、需要轉成機率分佈才能 sample。&lt;/p>
&lt;h2 id="softmax把-logits-轉成機率分佈">Softmax：把 logits 轉成機率分佈&lt;/h2>
&lt;p>Softmax 的核心定義是「把任意實數向量轉成合法的機率分佈」的函式：&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">softmax(x)ᵢ = exp(xᵢ) / Σⱼ exp(xⱼ)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>幾何意義：先用 &lt;code>exp&lt;/code> 把所有 logit 變成正數（強化大值、壓抑負值）、再除以總和讓總和為 1。結果是合法的機率分佈：每個值在 (0, 1) 之間、總和為 1。&lt;/p>
&lt;p>為什麼用 softmax 而非其他正規化（如 &lt;code>xᵢ / Σ xⱼ&lt;/code>）：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>處理負數&lt;/strong>：直接歸一化遇到負 logit 會壞掉；exp 把所有值變正。&lt;/li>
&lt;li>&lt;strong>強化對比&lt;/strong>：exp 放大差距、讓「最有可能的 token」拿到更大的機率比例。&lt;/li>
&lt;li>&lt;strong>數學性質好&lt;/strong>：softmax 的導數形式漂亮、方便 backprop 計算 gradient。&lt;/li>
&lt;/ol>
&lt;p>實務上會在這幾個地方遇到 softmax：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>輸出層&lt;/strong>：把 logits 轉成「下個 token 的機率分佈」。&lt;/li>
&lt;li>&lt;strong>Attention&lt;/strong>：把 attention scores（內積結果）轉成「注意力權重分佈」。詳見 &lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2 attention 機制&lt;/a>。&lt;/li>
&lt;/ul>
&lt;h2 id="temperature調整分佈的尖銳度">Temperature：調整分佈的尖銳度&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/sampling-constraint/" data-link-title="Sampling Constraint" data-link-desc="推論時限制下一個 token 候選集合的控制手段，用來把模型生成導向合法格式或特定選項">Temperature&lt;/a>（溫度）的核心定義是「softmax 之前先除以一個正數、調整輸出分佈的尖銳度」：&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">softmax_with_temperature(x, T)ᵢ = exp(xᵢ / T) / Σⱼ exp(xⱼ / T)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>T 對分佈的影響：&lt;/p></description><content:encoded><![CDATA[<p>LLM 輸出的本質是「下一個 <a href="/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token</a> 的機率分佈」。模型 forward pass 結束後、會對詞彙表中每個 token 給出一個分數（<a href="/blog/llm/knowledge-cards/logit/" data-link-title="Logit" data-link-desc="softmax 之前的原始實數分數、每個 vocab token 一個值、可正可負">logit</a>）；<a href="/blog/llm/knowledge-cards/softmax/" data-link-title="Softmax" data-link-desc="把任意實數向量正規化成「總和為 1、每個分量 ∈ [0,1]」的機率分佈">softmax</a> 把分數轉成合法的機率分佈、之後用各種 sampling 策略挑下一個 token。訓練時用 cross-entropy loss 衡量「模型預測的機率分佈跟真實答案差多少」、最佳化方向就是讓兩者盡量靠近。</p>
<p>本章整理這條鏈上的核心概念。每個概念給出定義、在 LLM 中的位置、實務上會在哪裡遇到。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>解釋 LLM 輸出層為什麼用 softmax、不用其他正規化方式。</li>
<li>看到 <code>temperature=0.2</code> 設定時、知道它在調機率分佈的什麼。</li>
<li>看到 benchmark 報告 perplexity 數字時、知道它衡量什麼。</li>
<li>理解 cross-entropy 為什麼是 LLM 訓練的標準 loss function。</li>
</ol>
<h2 id="機率分佈把可能性量化">機率分佈：把可能性量化</h2>
<p>機率分佈（probability distribution）的核心定義是「對所有可能事件指派一個機率值、總和為 1、每個值在 0 到 1 之間」。LLM 中的核心場景：對詞彙表中每個 token 指派一個機率、總和為 1。</p>
<p><a href="/blog/llm/knowledge-cards/vocabulary-size/" data-link-title="Vocabulary Size" data-link-desc="tokenizer 詞彙表的 token 總數、影響 embedding 大小、tokenization 粒度、多語言友善度">詞彙表大小</a>（vocabulary size）通常幾萬到十幾萬：</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>Vocab Size</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Llama 3 系列</td>
          <td>128,256</td>
      </tr>
      <tr>
          <td>Gemma 4 系列</td>
          <td>256,000</td>
      </tr>
      <tr>
          <td>GPT-4o</td>
          <td>~200,000</td>
      </tr>
      <tr>
          <td>Qwen3 系列</td>
          <td>152,064</td>
      </tr>
  </tbody>
</table>
<p>模型最後一層的輸出是「對這 N 個 token 的機率分佈」、N 是 vocab size。每生一個新 token、就 sample 一次這個分佈。</p>
<h2 id="logitsoftmax-之前的原始分數">Logit：softmax 之前的原始分數</h2>
<p>Logit 的核心定義是「模型最後一層輸出的原始分數、還沒正規化成機率」。每個 token 對應一個 logit、可以是任意實數（包括負數）。</p>
<p>Logits 的形狀是 <code>(vocab_size,)</code>、例如 Gemma 4 的 logits 是長度 256,000 的向量。直接看 logits 沒意義、需要轉成機率分佈才能 sample。</p>
<h2 id="softmax把-logits-轉成機率分佈">Softmax：把 logits 轉成機率分佈</h2>
<p>Softmax 的核心定義是「把任意實數向量轉成合法的機率分佈」的函式：</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">softmax(x)ᵢ = exp(xᵢ) / Σⱼ exp(xⱼ)</span></span></code></pre></div><p>幾何意義：先用 <code>exp</code> 把所有 logit 變成正數（強化大值、壓抑負值）、再除以總和讓總和為 1。結果是合法的機率分佈：每個值在 (0, 1) 之間、總和為 1。</p>
<p>為什麼用 softmax 而非其他正規化（如 <code>xᵢ / Σ xⱼ</code>）：</p>
<ol>
<li><strong>處理負數</strong>：直接歸一化遇到負 logit 會壞掉；exp 把所有值變正。</li>
<li><strong>強化對比</strong>：exp 放大差距、讓「最有可能的 token」拿到更大的機率比例。</li>
<li><strong>數學性質好</strong>：softmax 的導數形式漂亮、方便 backprop 計算 gradient。</li>
</ol>
<p>實務上會在這幾個地方遇到 softmax：</p>
<ul>
<li><strong>輸出層</strong>：把 logits 轉成「下個 token 的機率分佈」。</li>
<li><strong>Attention</strong>：把 attention scores（內積結果）轉成「注意力權重分佈」。詳見 <a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2 attention 機制</a>。</li>
</ul>
<h2 id="temperature調整分佈的尖銳度">Temperature：調整分佈的尖銳度</h2>
<p><a href="/blog/llm/knowledge-cards/sampling-constraint/" data-link-title="Sampling Constraint" data-link-desc="推論時限制下一個 token 候選集合的控制手段，用來把模型生成導向合法格式或特定選項">Temperature</a>（溫度）的核心定義是「softmax 之前先除以一個正數、調整輸出分佈的尖銳度」：</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">softmax_with_temperature(x, T)ᵢ = exp(xᵢ / T) / Σⱼ exp(xⱼ / T)</span></span></code></pre></div><p>T 對分佈的影響：</p>
<table>
  <thead>
      <tr>
          <th>Temperature</th>
          <th>效果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>T → 0</td>
          <td>分佈接近 one-hot、永遠選機率最大的 token（greedy）</td>
      </tr>
      <tr>
          <td>T = 1</td>
          <td>原始 softmax 分佈</td>
      </tr>
      <tr>
          <td>T → ∞</td>
          <td>分佈接近 uniform、每個 token 機率接近相等</td>
      </tr>
  </tbody>
</table>
<p>實務經驗：</p>
<ul>
<li>寫 code 場景用 T = 0.2 ~ 0.4、讓回答穩定、減少 hallucination。</li>
<li>創意寫作用 T = 0.7 ~ 1.0、保留多樣性。</li>
<li>確定性場景（測試、reproducible 評估）用 T = 0（實作上 T=0 是除以零、伺服器退化為 argmax / greedy）。</li>
</ul>
<p>實務常見的 temperature 邊界：</p>
<ul>
<li><strong>T 跟 top-p 同用</strong>：兩者相乘的效果非線性、高 T + 低 top-p 反而讓「機率被攤平但只挑前幾名」、出現語義跳動。多數設定固定其中一個、調另一個。</li>
<li><strong>Reasoning model 上 T 反效果</strong>：o1 / DeepSeek-R1 等內建 chain-of-thought 的模型、官方建議 T = 0 或 1.0、調 T 會破壞 reasoning trace 的連貫性。</li>
<li><strong>過低 T（&lt; 0.1）的副作用</strong>：模型容易掉進 repetition loop（連續重複同一句）、要搭配 repetition penalty 才穩。</li>
</ul>
<p>LM Studio 跟其他推論伺服器的 temperature 設定背後就是這個公式。</p>
<h2 id="top-k-與-top-p-sampling">Top-K 與 Top-P sampling</h2>
<p>Sampling 策略決定「從機率分佈挑下一個 token」的具體方法。主流選擇：</p>
<table>
  <thead>
      <tr>
          <th>策略</th>
          <th>機制</th>
          <th>適合場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Greedy</td>
          <td>永遠選機率最大的</td>
          <td>確定性、reproducible 評估</td>
      </tr>
      <tr>
          <td>Beam search</td>
          <td>同時保留 K 個候選序列、選累積機率最大的</td>
          <td>翻譯、摘要等需要全局最佳的場景</td>
      </tr>
      <tr>
          <td>Top-K</td>
          <td>只考慮機率最大的 K 個 token、其餘設 0</td>
          <td>控制多樣性下界</td>
      </tr>
      <tr>
          <td>Top-P (nucleus)</td>
          <td>只考慮機率累積 ≤ P 的 token 子集</td>
          <td>動態調整候選數、目前最常見</td>
      </tr>
  </tbody>
</table>
<p><a href="/blog/llm/knowledge-cards/top-p-sampling/" data-link-title="Top-K / Top-P / Min-P Sampling" data-link-desc="從機率分佈取樣前先過濾低機率 token 的三種策略、現代 LLM 推論主流">Top-P sampling</a> 的細節：先依機率排序、累加直到超過閾值 P（如 0.9）、只 sample 這些 token、其他丟掉。Token 多樣性自動依分佈尖銳度調整、比固定 K 彈性。完整 sampling 策略（含 repetition penalty、min-p、frequency penalty 等）見 <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 策略</a>。</p>
<h2 id="cross-entropy訓練-llm-的-loss-function">Cross-Entropy：訓練 LLM 的 loss function</h2>
<p>Cross-entropy（交叉熵）的核心定義是「衡量兩個機率分佈的差距」。形式：</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">H(p, q) = -Σᵢ p(xᵢ) log q(xᵢ)</span></span></code></pre></div><p>p 是真實分佈、q 是模型預測分佈。LLM 預訓練 / 一般 SFT 場景下 p 是 one-hot（正確 token 機率 1、其他 0）、q 是模型 softmax 輸出；label smoothing / distillation / soft target 等場景 p 是平滑分佈、cross-entropy 仍適用、形式上需保留完整 sum。LLM 訓練的 one-hot 場景下 cross-entropy 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(q(正確 token))</span></span></code></pre></div><p>幾何意義：模型給正確 token 的機率越高、loss 越低。完美預測時 loss → 0、完全錯時 loss → ∞。</p>
<p>為什麼用 cross-entropy 而非其他 loss：</p>
<ol>
<li><strong>跟 softmax 配合好</strong>：兩者組合的 gradient 形式漂亮、訓練穩定。</li>
<li><strong>直接最佳化機率</strong>：跟模型輸出的本質一致、不用引入額外轉換。</li>
<li><strong>資訊論依據</strong>：cross-entropy 等於「假設真實分佈是 p、用 q 編碼平均要多少 bits」。</li>
</ol>
<h2 id="perplexity模型品質的標準指標">Perplexity：模型品質的標準指標</h2>
<p><a href="/blog/llm/knowledge-cards/perplexity/" data-link-title="Perplexity" data-link-desc="cross-entropy 的指數形式、直覺意義為「模型平均覺得下個 token 有多少種可能」">Perplexity</a>（困惑度）的核心定義是「e 的 cross-entropy 次方」、衡量模型預測下一個 token 的不確定性：</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">perplexity = exp(cross-entropy)</span></span></code></pre></div><p>幾何意義：「平均來說、模型猶豫在幾個 token 之間」。</p>
<ul>
<li>Perplexity = 10：模型平均要在 10 個 token 中挑、不確定性中等。</li>
<li>Perplexity = 2：模型很有信心、平均在 2 個 token 中挑。</li>
<li>Perplexity = vocab_size：模型完全沒學到、隨機猜。</li>
</ul>
<p>實務上 perplexity 是預訓練模型品質的標準評估指標。GPT-3 paper 報告各種任務的 perplexity；本地模型對比常引用 WikiText / C4 等 benchmark 上的 perplexity 數字。</p>
<p>Perplexity 跟 <a href="/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench</a> 等任務 benchmark 是兩個維度：前者衡量「模型預測下一個 token 的不確定性」、後者衡量「實際解問題的能力」。能力強的模型 perplexity 通常較低、但不是線性關係。</p>
<p>Perplexity 的三個常見判讀陷阱：</p>
<ul>
<li><strong>跨 tokenizer 不可比</strong>：兩個模型 vocab 不同、平均 token 長度不同、perplexity 數值不在同一座標。判讀訊號：比較數字前先確認 tokenizer 是否相同；不同就改用 byte-level perplexity 或實際任務 benchmark。</li>
<li><strong>Domain mismatch</strong>：在 WikiText 上 perplexity 低、不代表 coding 任務也強。Perplexity 反映「訓練 / 評估資料分佈」的擬合度、跨 domain 引用需附 corpus 名稱。</li>
<li><strong>Context 長度影響</strong>：較長 context 通常 perplexity 較低（前文越多越好預測下一字）、引用數字時要附 context window 設定。</li>
</ul>
<h2 id="kl-divergence兩個分佈的距離">KL Divergence：兩個分佈的距離</h2>
<p><a href="/blog/llm/knowledge-cards/kl-divergence/" data-link-title="KL Divergence" data-link-desc="衡量「兩個機率分佈差距」的非對稱指標、RLHF / DPO 等 alignment 訓練的關鍵約束">KL divergence</a>（Kullback-Leibler divergence、KL 散度）的核心定義是「衡量分佈 q 偏離分佈 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">KL(p || q) = Σᵢ p(xᵢ) log(p(xᵢ) / q(xᵢ))</span></span></code></pre></div><p>性質：</p>
<ul>
<li>KL(p || q) ≥ 0、等號成立當且僅當 p = q。</li>
<li><strong>不對稱</strong>：KL(p || q) ≠ KL(q || p) 一般而言。</li>
<li>跟 cross-entropy 關係：<code>H(p, q) = H(p) + KL(p || q)</code>、其中 H(p) 是 p 自身的 entropy。</li>
</ul>
<p>LLM 中 KL divergence 的用途：</p>
<ul>
<li><strong>RLHF</strong>：把 fine-tune 後的模型機率分佈跟原 pre-trained 模型對齊、避免 fine-tune 過頭偏離原模型太多。</li>
<li><strong>Knowledge distillation</strong>：把大模型的分佈傳給小模型、小模型最小化 KL(大模型 || 小模型)。</li>
<li><strong>DPO / 各種 alignment 方法</strong>：用 KL constraint 控制 policy 偏移量。</li>
</ul>
<h2 id="entropy分佈的不確定性"><a href="/blog/llm/knowledge-cards/entropy/" data-link-title="Entropy" data-link-desc="資訊論衡量「分佈的不確定性」的指標、cross-entropy / KL divergence 的基底">Entropy</a>：分佈的不確定性</h2>
<p>Entropy（熵）的核心定義是「機率分佈本身的不確定性」：</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">H(p) = -Σᵢ p(xᵢ) log p(xᵢ)</span></span></code></pre></div><p>幾何意義：「平均來說、用 p 編碼一個 sample 要多少 bits」。</p>
<ul>
<li>確定分佈（one-hot）：entropy = 0、沒有不確定性。</li>
<li>Uniform 分佈：entropy = log(N)、最大不確定性。</li>
</ul>
<p>Entropy、cross-entropy、KL divergence 三者關係：</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">H(p, q) = H(p) + KL(p || q)</span></span></code></pre></div><p>Cross-entropy 等於「真實分佈的 entropy」加上「模型預測偏離真實的 KL distance」。訓練 LLM 是最小化 H(p, q)、等同於最小化 KL(p || q)、因為 H(p) 是常數（資料本身的不確定性）。</p>
<h2 id="下一章">下一章</h2>
<p>想看完整資訊論推導（Shannon&rsquo;s coding theorem、mutual information 等）、見 <a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">2.4 公開課推薦</a> 的 MIT 6.050J / Stanford EE376A 等資源。</p>
<p>下一章：<a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2 微積分與最佳化</a>。</p>
]]></content:encoded></item><item><title>2.2 微積分與最佳化</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/calculus-and-optimization/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/02-math-foundations/calculus-and-optimization/</guid><description>&lt;p>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>（預訓練用 &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;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>）、找一組權重讓 loss 最小。微積分提供工具回答「往哪個方向調權重能讓 loss 變小」、最佳化演算法回答「具體怎麼一步一步調」。&lt;/p>
&lt;p>寫 code 場景的使用者通常無需親自訓練、但理解這條鏈能解釋「為什麼 fine-tuning 要這麼多 GPU」「為什麼 learning rate 是關鍵 hyperparameter」「為什麼 gradient explosion 是常見問題」。本章整理核心概念、不展開完整推導。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>解釋 gradient 在訓練中扮演的角色。&lt;/li>
&lt;li>看到「learning rate = 1e-4」設定時、知道它控制什麼。&lt;/li>
&lt;li>區分 SGD、Adam、AdamW 在訓練 LLM 時的取捨。&lt;/li>
&lt;li>看到 gradient explosion / vanishing 報告時、知道發生在哪一層。&lt;/li>
&lt;/ol>
&lt;h2 id="偏導數與-gradient往哪個方向走-loss-變小">偏導數與 &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>：往哪個方向走 loss 變小&lt;/h2>
&lt;p>偏導數（partial derivative）的核心定義是「對多變數函式中的一個變數微分、其他變數視為常數」。記號 &lt;code>∂f / ∂xᵢ&lt;/code>。&lt;/p>
&lt;p>Gradient（梯度）的核心定義是「所有偏導數打包成的向量」：&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">∇f = (∂f/∂x₁, ∂f/∂x₂, ..., ∂f/∂xₙ)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>幾何意義：gradient 指向「函式增加最快的方向」、長度等於該方向的變化率。要讓函式變小、就往 gradient 的反方向走。&lt;/p>
&lt;p>LLM 訓練的核心步驟：&lt;/p>
&lt;ol>
&lt;li>把訓練資料丟進模型、跑 forward pass、得到預測。&lt;/li>
&lt;li>算 loss（預測跟真實答案的差距）。&lt;/li>
&lt;li>對所有權重算 gradient：&lt;code>∇_W loss&lt;/code>。&lt;/li>
&lt;li>更新權重：&lt;code>W ← W - α · ∇_W loss&lt;/code>（α 是 learning rate）。&lt;/li>
&lt;li>回到第 1 步、重複數百萬次。&lt;/li>
&lt;/ol>
&lt;p>第 4 步的更新公式就是 gradient descent。整個流程的關鍵在 gradient 怎麼算出來。&lt;/p>
&lt;h2 id="chain-rule把-gradient-從輸出傳到所有權重">Chain rule：把 gradient 從輸出傳到所有權重&lt;/h2>
&lt;p>Chain rule（連鎖律）的核心定義是「複合函式的導數等於各層導數的乘積」。一變數情況：&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">若 z = f(g(x))、則 dz/dx = (df/dg) × (dg/dx)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>多變數情況推廣到 chain rule 的矩陣形式（Jacobian）。&lt;/p>
&lt;p>LLM 有數十億參數、每個參數都要算 gradient。Chain rule 讓「從 loss 倒推每個權重的 gradient」變成可計算的問題：&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
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↑ ∂loss/∂output
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">output (last layer)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↑ ∂output/∂layer_N_input × chain rule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">layer N
&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">layer 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl"> ↑ ∂layer_1_input/∂W₁
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">weights W₁&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每層算「local gradient」（output 對 input 的導數）、chain rule 把它們乘起來、最終得到 loss 對每個權重的 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>&lt;/strong>（反向傳播）。&lt;/p>
&lt;p>詳細展開見 &lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">3.0 神經網路基礎&lt;/a>。&lt;/p>
&lt;h2 id="learning-rate每步走多遠">&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>：每步走多遠&lt;/h2>
&lt;p>Learning rate（學習率）的核心定義是「gradient descent 每步更新的幅度」、記號 α 或 η。權重更新：&lt;/p></description><content:encoded><![CDATA[<p>LLM 訓練的本質是「最佳化問題」：給定 <a href="/blog/llm/knowledge-cards/loss-function/" data-link-title="Loss Function" data-link-desc="把「模型預測」跟「正確答案」的差距量化成一個純量、訓練的最佳化目標">loss function</a>（預訓練用 <a href="/blog/llm/knowledge-cards/cross-entropy/" data-link-title="Cross-Entropy" data-link-desc="衡量「預測機率分佈」跟「真實分佈」距離的指標、LLM 預訓練的主要 loss">cross-entropy</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>）、找一組權重讓 loss 最小。微積分提供工具回答「往哪個方向調權重能讓 loss 變小」、最佳化演算法回答「具體怎麼一步一步調」。</p>
<p>寫 code 場景的使用者通常無需親自訓練、但理解這條鏈能解釋「為什麼 fine-tuning 要這麼多 GPU」「為什麼 learning rate 是關鍵 hyperparameter」「為什麼 gradient explosion 是常見問題」。本章整理核心概念、不展開完整推導。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>解釋 gradient 在訓練中扮演的角色。</li>
<li>看到「learning rate = 1e-4」設定時、知道它控制什麼。</li>
<li>區分 SGD、Adam、AdamW 在訓練 LLM 時的取捨。</li>
<li>看到 gradient explosion / vanishing 報告時、知道發生在哪一層。</li>
</ol>
<h2 id="偏導數與-gradient往哪個方向走-loss-變小">偏導數與 <a href="/blog/llm/knowledge-cards/gradient/" data-link-title="Gradient" data-link-desc="loss function 對權重的偏微分向量、指出「該往哪個方向調權重才能讓 loss 下降最快」">gradient</a>：往哪個方向走 loss 變小</h2>
<p>偏導數（partial derivative）的核心定義是「對多變數函式中的一個變數微分、其他變數視為常數」。記號 <code>∂f / ∂xᵢ</code>。</p>
<p>Gradient（梯度）的核心定義是「所有偏導數打包成的向量」：</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">∇f = (∂f/∂x₁, ∂f/∂x₂, ..., ∂f/∂xₙ)</span></span></code></pre></div><p>幾何意義：gradient 指向「函式增加最快的方向」、長度等於該方向的變化率。要讓函式變小、就往 gradient 的反方向走。</p>
<p>LLM 訓練的核心步驟：</p>
<ol>
<li>把訓練資料丟進模型、跑 forward pass、得到預測。</li>
<li>算 loss（預測跟真實答案的差距）。</li>
<li>對所有權重算 gradient：<code>∇_W loss</code>。</li>
<li>更新權重：<code>W ← W - α · ∇_W loss</code>（α 是 learning rate）。</li>
<li>回到第 1 步、重複數百萬次。</li>
</ol>
<p>第 4 步的更新公式就是 gradient descent。整個流程的關鍵在 gradient 怎麼算出來。</p>
<h2 id="chain-rule把-gradient-從輸出傳到所有權重">Chain rule：把 gradient 從輸出傳到所有權重</h2>
<p>Chain rule（連鎖律）的核心定義是「複合函式的導數等於各層導數的乘積」。一變數情況：</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">若 z = f(g(x))、則 dz/dx = (df/dg) × (dg/dx)</span></span></code></pre></div><p>多變數情況推廣到 chain rule 的矩陣形式（Jacobian）。</p>
<p>LLM 有數十億參數、每個參數都要算 gradient。Chain rule 讓「從 loss 倒推每個權重的 gradient」變成可計算的問題：</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
</span></span><span class="line"><span class="ln">2</span><span class="cl"> ↑ ∂loss/∂output
</span></span><span class="line"><span class="ln">3</span><span class="cl">output (last layer)
</span></span><span class="line"><span class="ln">4</span><span class="cl"> ↑ ∂output/∂layer_N_input × chain rule
</span></span><span class="line"><span class="ln">5</span><span class="cl">layer N
</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">layer 1
</span></span><span class="line"><span class="ln">8</span><span class="cl"> ↑ ∂layer_1_input/∂W₁
</span></span><span class="line"><span class="ln">9</span><span class="cl">weights W₁</span></span></code></pre></div><p>每層算「local gradient」（output 對 input 的導數）、chain rule 把它們乘起來、最終得到 loss 對每個權重的 gradient。這個流程叫 <strong><a href="/blog/llm/knowledge-cards/backpropagation/" data-link-title="Backpropagation" data-link-desc="從 output loss 反向遞推、用 chain rule 算出每個權重的 gradient 的演算法">backpropagation</a></strong>（反向傳播）。</p>
<p>詳細展開見 <a href="/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">3.0 神經網路基礎</a>。</p>
<h2 id="learning-rate每步走多遠"><a href="/blog/llm/knowledge-cards/learning-rate/" data-link-title="Learning Rate" data-link-desc="gradient descent 每步更新權重的幅度、訓練中最敏感的 hyperparameter">Learning Rate</a>：每步走多遠</h2>
<p>Learning rate（學習率）的核心定義是「gradient descent 每步更新的幅度」、記號 α 或 η。權重更新：</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</span></span></code></pre></div><p>Learning rate 的影響：</p>
<table>
  <thead>
      <tr>
          <th>Learning rate</th>
          <th>效果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>太大</td>
          <td>跨過最佳解、loss 震盪不收斂、甚至發散</td>
      </tr>
      <tr>
          <td>適中</td>
          <td>穩定下降、合理時間內收斂</td>
      </tr>
      <tr>
          <td>太小</td>
          <td>收斂太慢、訓練時間爆增、可能卡在 local minimum</td>
      </tr>
  </tbody>
</table>
<p>LLM 訓練常用 learning rate：</p>
<ul>
<li>預訓練（pre-training）：1e-4 ~ 3e-4、有 warmup 後線性衰減</li>
<li>Fine-tuning：1e-5 ~ 5e-5、較小避免破壞 pre-trained 權重</li>
<li>LoRA：1e-4 ~ 1e-3、只更新少量參數可較大</li>
</ul>
<p>Learning rate 是訓練 LLM 最關鍵的 hyperparameter、設錯時整個訓練容易失敗、實務上極難救回。實務上常用 learning rate scheduler 動態調整：warmup + cosine decay 是最主流的組合。</p>
<h2 id="sgd最基本的最佳化演算法"><a href="/blog/llm/knowledge-cards/sgd/" data-link-title="SGD" data-link-desc="Stochastic Gradient Descent：每次用 mini-batch 算 gradient 更新權重的基礎 optimizer">SGD</a>：最基本的最佳化演算法</h2>
<p>SGD（Stochastic Gradient Descent、隨機梯度下降）的核心定義是「每次只用一小批資料（mini-batch）算 gradient、更新權重」。對應 vanilla gradient descent（用全部資料算一次）的計算成本問題：</p>
<ul>
<li><strong>Batch GD</strong>：每步用全部訓練資料、gradient 準但每步成本高、適合小資料集</li>
<li><strong>SGD（mini-batch）</strong>：每步用 32 ~ 256 筆、gradient 有 noise 但平均下來方向對、適合大資料集</li>
</ul>
<p>LLM 預訓練資料動輒 TB 級、每步只能用 mini-batch；每個 token 算一次 forward + backward、跑數兆 token、總更新數十萬到數百萬步。</p>
<p>Vanilla SGD 在 LLM 場景的缺點：</p>
<ol>
<li>對 learning rate 敏感、不同 layer / 不同參數可能需要不同 learning rate。</li>
<li>在「狹長 loss surface」上震盪、收斂慢。</li>
<li>不利用過去 gradient 資訊。</li>
</ol>
<p>SGD-with-momentum 在 vanilla SGD 上補了「過去 gradient 累積成 velocity」、處理震盪問題、在 vision（ResNet、ImageNet 訓練）跟小規模 fine-tune 仍是合理選擇；Adam / AdamW 在 LLM 預訓練成主流的原因是「自適應 learning rate + per-parameter scale」更能對付 Transformer 的高維、稀疏 gradient 結構、大規模 transformer 預訓練幾乎全部用 AdamW。</p>
<h2 id="adam-與-adamw適應性最佳化"><a href="/blog/llm/knowledge-cards/adam-adamw/" data-link-title="Adam / AdamW" data-link-desc="對每個參數自適應 learning rate 的 optimizer、LLM 訓練主流選擇">Adam 與 AdamW</a>：適應性最佳化</h2>
<p>Adam（Adaptive Moment Estimation）的核心定義是「每個參數有自己的有效 learning rate、根據過去 gradient 的一階矩跟二階矩自動調整」。簡化版本：</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 - β₁) × gradient   ← 一階矩（gradient 的指數移動平均）
</span></span><span class="line"><span class="ln">2</span><span class="cl">v_t = β₂ × v_{t-1} + (1 - β₂) × gradient²  ← 二階矩（gradient 平方的指數移動平均）
</span></span><span class="line"><span class="ln">3</span><span class="cl">update = learning_rate × m_t / (sqrt(v_t) + ε)</span></span></code></pre></div><p>直覺：</p>
<ul>
<li>一階矩 m：類似動量、讓更新方向有慣性、減少震盪。</li>
<li>二階矩 v：估計 gradient 大小、把更新除以 sqrt(v)、自動調整每個參數的有效步幅。</li>
<li>結果：高 gradient 的參數步小、低 gradient 的參數步大、整體穩定收斂。</li>
</ul>
<p>AdamW 是 Adam 的改進版、把 weight decay（L2 正則化）跟 gradient update 解耦。大規模 transformer 預訓練幾乎都用 AdamW、vanilla Adam 已退出 LLM 主流（SGD-with-momentum 在 vision 跟小規模 fine-tune 仍適用）。</p>
<p>代價：Adam / AdamW 需要為每個參數額外存 m（一階矩、gradient 的指數移動平均）跟 v（二階矩、gradient 平方的指數移動平均）、記憶體成本是 SGD 的 3 倍。31B 模型用 AdamW 訓練的 optimizer state 約佔 200GB+ 記憶體、拆解如下（mixed-precision training、batch=1024 / 不含 activation checkpoint 的典型配置）：</p>
<ul>
<li>fp32 master weights：31B × 4 bytes ≈ 124 GB</li>
<li>m（一階矩）：31B × 4 bytes ≈ 124 GB</li>
<li>v（二階矩）：31B × 4 bytes ≈ 124 GB</li>
<li>總計約 372 GB optimizer state、加上 activation 與 gradient buffer 後實際需求更高</li>
</ul>
<p>對比推論時 Gemma 4 31B Q4 量化版約 18GB（含 KV cache、見 <a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">0.5 Apple Silicon 記憶體預算</a>）、訓練需求是推論的 20 倍以上。這就是為什麼訓練 LLM 需要大量 GPU、推論可以在個人 Mac 上跑。</p>
<h2 id="gradient-explosion-與-vanishing"><a href="/blog/llm/knowledge-cards/gradient-explosion-vanishing/" data-link-title="Gradient Explosion / Vanishing" data-link-desc="深層網路訓練中 gradient 透過 chain rule 累乘、容易爆炸或衰減到 0 的兩種失敗模式">Gradient Explosion 與 Vanishing</a></h2>
<p>Gradient explosion（梯度爆炸）的核心問題是「gradient 經過多層 chain rule 累積、變成天文數字、權重更新後完全爆掉」。常見於深度網路、特別是 RNN。</p>
<p>Gradient vanishing（梯度消失）的反面問題是「gradient 經過多層後變得幾乎為 0、深層 layer 學不到東西」。常見於用 sigmoid / tanh activation 的深度網路。</p>
<p>Transformer 為什麼能訓練深層網路：</p>
<ol>
<li><strong>Residual connection</strong>：跨層加上 <code>x + f(x)</code>、給 gradient 一條短路、避免 vanishing。</li>
<li><strong>Layer normalization</strong>：每層 activation 重新正規化、避免數值爆炸。</li>
<li><strong>適當的權重初始化</strong>：Xavier / Kaiming 初始化讓初始 forward pass 不爆。</li>
<li><strong>Gradient clipping</strong>：訓練時把 gradient 的 norm 截斷在閾值內、避免 explosion。</li>
</ol>
<p>詳細展開見 <a href="/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">3.3 Transformer 架構</a>。</p>
<h2 id="backpropagationchain-rule-在多層網路上的演算法名">Backpropagation：chain rule 在多層網路上的演算法名</h2>
<p>Backpropagation（反向傳播）就是前面 <a href="#chain-rule%e6%8a%8a-gradient-%e5%be%9e%e8%bc%b8%e5%87%ba%e5%82%b3%e5%88%b0%e6%89%80%e6%9c%89%e6%ac%8a%e9%87%8d">chain rule</a> 段講的「∂loss/∂W 倒推流程」在實作上的演算法名稱、不是另一個獨立概念。整體流程：forward pass 算 output 與 loss、backward pass 用 chain rule 從 loss 逐層倒推每個權重的 gradient、framework（PyTorch / MLX）的 autograd 自動完成 backward、開發者只需寫 forward。Autograd 跟 chain rule / backprop 是同個概念在不同抽象層級的展開。</p>
<h2 id="為什麼推論不需要-backprop">為什麼推論不需要 backprop</h2>
<p>寫 code 場景用 LLM 是「推論」而非「訓練」。推論只跑 forward pass、不算 gradient、不更新權重。所以：</p>
<ol>
<li><strong>記憶體需求低得多</strong>：推論不用存中間 activation（forward pass 結束就可丟）、不用存 optimizer state。Gemma 4 31B 推論約 18GB、訓練同個模型可能要 200GB+。</li>
<li><strong>算力需求低得多</strong>：推論一個 token 要 1 次 forward pass、訓練一個 token 要 forward + backward = 約 3 次 forward 的成本。</li>
<li><strong>沒有 learning rate / optimizer 等 hyperparameter</strong>：推論只有 temperature、top-p 等 sampling 參數。</li>
</ol>
<p>這就是為什麼 32GB Mac 可以推論 31B 模型、訓練同個模型要動用整個 H100 cluster。</p>
<h2 id="下一章">下一章</h2>
<p>想看完整最佳化理論（凸最佳化、二階方法、Hessian、Newton&rsquo;s method 等）、見 <a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">2.4 公開課推薦</a> 的 Stanford EE364 / CS229 等課程。</p>
<p>下一章：<a href="/blog/llm/02-math-foundations/numerical-precision/" data-link-title="2.3 數值精度與量化的數學依據" data-link-desc="fp32 / bf16 / fp16 / int8 / int4 的差別、量化能省哪些 bits、品質衰減從哪裡來">2.3 數值精度與量化的數學依據</a>。</p>
]]></content:encoded></item><item><title>2.3 數值精度與量化的數學依據</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/numerical-precision/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/02-math-foundations/numerical-precision/</guid><description>&lt;p>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 是讓 30B+ LLM 跑在 consumer 等級硬體上的關鍵技術。直覺說法是「用較少 bits 表示權重」、但這背後有完整的數值精度數學依據：浮點數怎麼編碼、不同 format 的取捨在哪、量化在哪一步損失資訊、Q4 vs Q5 的品質差距是怎麼算出來的。&lt;/p>
&lt;p>本章拆開「浮點數的位元結構」、「不同 format 的取捨」、「量化的數學流程」三件事、讓 Q4_K_M、bf16、fp16、int8 等術語從口號變成可推導的工程選擇。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>解釋 fp32、bf16、fp16 三者的位元結構差異。&lt;/li>
&lt;li>看到「Q4 量化」時、知道是把每個權重壓成 4 bits。&lt;/li>
&lt;li>推算 31B 模型用不同精度的記憶體佔用。&lt;/li>
&lt;li>解釋為什麼 Q3 衰減品質遠大於 Q4 → Q5。&lt;/li>
&lt;/ol>
&lt;h2 id="浮點數的位元結構">&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/floating-point/" data-link-title="Floating Point（FP32 / FP16 / BF16）" data-link-desc="fp32 / fp16 / bf16 浮點格式的位元結構與 LLM 訓練 / 推論的精度取捨">浮點數&lt;/a>的位元結構&lt;/h2>
&lt;p>浮點數（floating point）的核心定義是「用「符號 + 指數 + 尾數」三段位元表示實數」。IEEE 754 標準：&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">value = (-1)^sign × 1.mantissa × 2^(exponent - bias)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>各 format 的位元分配：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Format&lt;/th>
 &lt;th>總 bits&lt;/th>
 &lt;th>Sign&lt;/th>
 &lt;th>Exponent&lt;/th>
 &lt;th>Mantissa&lt;/th>
 &lt;th>表示範圍&lt;/th>
 &lt;th>精度&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>fp32&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>23&lt;/td>
 &lt;td>±10^38&lt;/td>
 &lt;td>約 7 位十進位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>fp16&lt;/td>
 &lt;td>16&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>10&lt;/td>
 &lt;td>±65,504&lt;/td>
 &lt;td>約 3 位十進位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>bf16&lt;/td>
 &lt;td>16&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>7&lt;/td>
 &lt;td>±10^38（跟 fp32 同範圍）&lt;/td>
 &lt;td>約 2 位十進位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>fp8&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>4-5&lt;/td>
 &lt;td>2-3&lt;/td>
 &lt;td>視變體&lt;/td>
 &lt;td>約 1 位十進位&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵觀察：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>fp32 vs bf16 vs fp16&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>fp32 是基準、訓練最穩、推論最浪費。&lt;/li>
&lt;li>bf16 跟 fp32 同 exponent 範圍、不會 overflow、但 mantissa 較少、精度低。&lt;/li>
&lt;li>fp16 範圍小（±65,504）、訓練容易 overflow、需要 loss scaling。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>訓練主流選 bf16&lt;/strong>：保留 fp32 的範圍、用 fp16 的位元數、避免 overflow / underflow 問題。Apple Silicon、NVIDIA Ampere+ 都原生支援 bf16。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>推論常見更低精度&lt;/strong>：fp16、int8、int4 在推論時夠用；訓練多數情境精度不足、需要更高 format 或特殊技巧（loss scaling、mixed precision）。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="bf16-為什麼比-fp16-更適合-llm-訓練">bf16 為什麼比 fp16 更適合 LLM 訓練&lt;/h2>
&lt;p>bf16（brain float 16、Google Brain 提出）跟 fp16 都是 16 bits、但結構不同：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>fp16&lt;/strong>：sign 1 + exponent 5 + mantissa 10&lt;/li>
&lt;li>&lt;strong>bf16&lt;/strong>：sign 1 + exponent 8 + mantissa 7&lt;/li>
&lt;/ul>
&lt;p>fp16 的 exponent 只有 5 bits、能表達的最大值 65,504、最小正值約 6e-5。LLM 訓練中的 gradient 經常超出這個範圍：&lt;/p></description><content:encoded><![CDATA[<p><a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 是讓 30B+ LLM 跑在 consumer 等級硬體上的關鍵技術。直覺說法是「用較少 bits 表示權重」、但這背後有完整的數值精度數學依據：浮點數怎麼編碼、不同 format 的取捨在哪、量化在哪一步損失資訊、Q4 vs Q5 的品質差距是怎麼算出來的。</p>
<p>本章拆開「浮點數的位元結構」、「不同 format 的取捨」、「量化的數學流程」三件事、讓 Q4_K_M、bf16、fp16、int8 等術語從口號變成可推導的工程選擇。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>解釋 fp32、bf16、fp16 三者的位元結構差異。</li>
<li>看到「Q4 量化」時、知道是把每個權重壓成 4 bits。</li>
<li>推算 31B 模型用不同精度的記憶體佔用。</li>
<li>解釋為什麼 Q3 衰減品質遠大於 Q4 → Q5。</li>
</ol>
<h2 id="浮點數的位元結構"><a href="/blog/llm/knowledge-cards/floating-point/" data-link-title="Floating Point（FP32 / FP16 / BF16）" data-link-desc="fp32 / fp16 / bf16 浮點格式的位元結構與 LLM 訓練 / 推論的精度取捨">浮點數</a>的位元結構</h2>
<p>浮點數（floating point）的核心定義是「用「符號 + 指數 + 尾數」三段位元表示實數」。IEEE 754 標準：</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">value = (-1)^sign × 1.mantissa × 2^(exponent - bias)</span></span></code></pre></div><p>各 format 的位元分配：</p>
<table>
  <thead>
      <tr>
          <th>Format</th>
          <th>總 bits</th>
          <th>Sign</th>
          <th>Exponent</th>
          <th>Mantissa</th>
          <th>表示範圍</th>
          <th>精度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>fp32</td>
          <td>32</td>
          <td>1</td>
          <td>8</td>
          <td>23</td>
          <td>±10^38</td>
          <td>約 7 位十進位</td>
      </tr>
      <tr>
          <td>fp16</td>
          <td>16</td>
          <td>1</td>
          <td>5</td>
          <td>10</td>
          <td>±65,504</td>
          <td>約 3 位十進位</td>
      </tr>
      <tr>
          <td>bf16</td>
          <td>16</td>
          <td>1</td>
          <td>8</td>
          <td>7</td>
          <td>±10^38（跟 fp32 同範圍）</td>
          <td>約 2 位十進位</td>
      </tr>
      <tr>
          <td>fp8</td>
          <td>8</td>
          <td>1</td>
          <td>4-5</td>
          <td>2-3</td>
          <td>視變體</td>
          <td>約 1 位十進位</td>
      </tr>
  </tbody>
</table>
<p>關鍵觀察：</p>
<ol>
<li>
<p><strong>fp32 vs bf16 vs fp16</strong>：</p>
<ul>
<li>fp32 是基準、訓練最穩、推論最浪費。</li>
<li>bf16 跟 fp32 同 exponent 範圍、不會 overflow、但 mantissa 較少、精度低。</li>
<li>fp16 範圍小（±65,504）、訓練容易 overflow、需要 loss scaling。</li>
</ul>
</li>
<li>
<p><strong>訓練主流選 bf16</strong>：保留 fp32 的範圍、用 fp16 的位元數、避免 overflow / underflow 問題。Apple Silicon、NVIDIA Ampere+ 都原生支援 bf16。</p>
</li>
<li>
<p><strong>推論常見更低精度</strong>：fp16、int8、int4 在推論時夠用；訓練多數情境精度不足、需要更高 format 或特殊技巧（loss scaling、mixed precision）。</p>
</li>
</ol>
<h2 id="bf16-為什麼比-fp16-更適合-llm-訓練">bf16 為什麼比 fp16 更適合 LLM 訓練</h2>
<p>bf16（brain float 16、Google Brain 提出）跟 fp16 都是 16 bits、但結構不同：</p>
<ul>
<li><strong>fp16</strong>：sign 1 + exponent 5 + mantissa 10</li>
<li><strong>bf16</strong>：sign 1 + exponent 8 + mantissa 7</li>
</ul>
<p>fp16 的 exponent 只有 5 bits、能表達的最大值 65,504、最小正值約 6e-5。LLM 訓練中的 gradient 經常超出這個範圍：</p>
<ul>
<li>Gradient 太大 → overflow → NaN → 訓練崩潰。</li>
<li>Gradient 太小 → underflow → 變 0 → 那個權重學不到東西。</li>
</ul>
<p>要用 fp16 訓練、得加 loss scaling（把 loss 乘一個大數、讓 gradient 落在 fp16 範圍內、最後再除回去）、流程複雜。</p>
<p>bf16 的 exponent 8 bits、跟 fp32 同範圍、在 LLM gradient 的典型範圍內不會 overflow / underflow（fp32 的全範圍 ±3.4e38 仍可能 overflow、但 LLM 場景遠超這個值的機率極低）。代價是 mantissa 只剩 7 bits、精度更低。對 LLM 訓練來說、範圍比精度重要（gradient 的方向比精確值關鍵）。</p>
<p>硬體前提：bf16 訓練主流是 NVIDIA Ampere（A100、2020+）跟 Apple Silicon、舊 GPU（Pascal、Volta）只有 fp16 硬體加速、用 bf16 會走 software fallback、性能差。</p>
<p>所以 2026 年主流選擇：</p>
<ul>
<li><strong>訓練</strong>：bf16（forward + backward）+ fp32（master copy of weights）</li>
<li><strong>推論</strong>：bf16 或更低（fp16、int8、int4）</li>
</ul>
<h2 id="量化把權重從-bf16-壓到-q4--q8">量化：把權重從 bf16 壓到 Q4 / Q8</h2>
<p>量化（quantization）的核心定義是「把連續的浮點數值 map 到離散的整數值」。最簡單的對稱量化：</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 ∈ ℝⁿ：
</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">1. 算 scale = max(|W|) / (2^(bits-1) - 1)
</span></span><span class="line"><span class="ln">4</span><span class="cl">   例如 4-bit、scale = max(|W|) / 7
</span></span><span class="line"><span class="ln">5</span><span class="cl">2. 把每個 wᵢ 量化成整數 qᵢ = round(wᵢ / scale)
</span></span><span class="line"><span class="ln">6</span><span class="cl">3. 還原時：w̃ᵢ = qᵢ × scale</span></span></code></pre></div><p>幾何意義：把連續實數軸切成 2^bits 個格子、每個權重 snap 到最近的格子。bits 越少、格子越粗、量化誤差越大。</p>
<p>各量化等級的格子數：</p>
<table>
  <thead>
      <tr>
          <th>Bits</th>
          <th>格子數</th>
          <th>適合場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>16</td>
          <td>65,536</td>
          <td>訓練 + 推論</td>
      </tr>
      <tr>
          <td>8</td>
          <td>256</td>
          <td>推論、品質敏感任務</td>
      </tr>
      <tr>
          <td>4</td>
          <td>16</td>
          <td>推論主流、寫 code 甜蜜點</td>
      </tr>
      <tr>
          <td>3</td>
          <td>8</td>
          <td>較大模型強塞較小硬體時備用</td>
      </tr>
      <tr>
          <td>2</td>
          <td>4</td>
          <td>實驗、實用品質崩</td>
      </tr>
  </tbody>
</table>
<h2 id="k-quants更聰明的量化">K-quants：更聰明的量化</h2>
<p><a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF</a> 的 K-quants 比樸素量化更聰明：</p>
<ol>
<li><strong>Block-wise quantization</strong>：權重切成小 block（例如 32 個權重一組）、每個 block 各自的 scale。讓 scale 適應 local 數值範圍、減少全域量化誤差。</li>
<li><strong>Mixed precision</strong>：不同 layer 用不同 bits。LLM 中某些 layer（如 attention output、embedding）對品質影響大、用較高 bits（Q5）；其他用較低 bits（Q4）。整體平均落在「Q4_K_M」這個標籤。</li>
</ol>
<p>「Q4_K_M」拆解：</p>
<ul>
<li><code>Q4</code>：平均約 4 bits / 權重</li>
<li><code>K</code>：K-quants（block-wise、混合精度）</li>
<li><code>M</code>：medium variant、不同 layer 用不同 bits 的具體配方（也有 <code>S</code> small、<code>L</code> large 等變體）</li>
</ul>
<p>實際每個權重的 bits 不剛好是 4、會稍高一點（Q4_K_M 取中值約 4.5 bits / 權重、實際隨模型架構與 attention layer 比例落在 4.4 ~ 4.8 之間、Hugging Face 上具體檔案大小可能跟下方表格估算差 5 ~ 10%）。</p>
<h2 id="模型大小推算">模型大小推算</h2>
<p>知道每個權重幾 bits 後、可以推算模型佔用：</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">模型大小（GB）= 參數數 × bits / 8 / 1024^3</span></span></code></pre></div><p>例子：</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>量化</th>
          <th>計算</th>
          <th>大小</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>7B</td>
          <td>bf16</td>
          <td>7e9 × 16 / 8 / 1024^3</td>
          <td>約 13 GB</td>
      </tr>
      <tr>
          <td>7B</td>
          <td>Q8</td>
          <td>7e9 × 8 / 8 / 1024^3</td>
          <td>約 6.5 GB</td>
      </tr>
      <tr>
          <td>7B</td>
          <td>Q4_K_M</td>
          <td>7e9 × 4.5 / 8 / 1024^3</td>
          <td>約 3.7 GB</td>
      </tr>
      <tr>
          <td>31B</td>
          <td>Q4_K_M</td>
          <td>31e9 × 4.5 / 8 / 1024^3</td>
          <td>約 16 GB</td>
      </tr>
      <tr>
          <td>70B</td>
          <td>Q4_K_M</td>
          <td>70e9 × 4.5 / 8 / 1024^3</td>
          <td>約 37 GB</td>
      </tr>
      <tr>
          <td>70B</td>
          <td>Q3</td>
          <td>70e9 × 3 / 8 / 1024^3</td>
          <td>約 25 GB</td>
      </tr>
  </tbody>
</table>
<p>加上 metadata、tokenizer、<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 等 overhead、實際記憶體佔用會比表上多 10 ~ 30%。</p>
<h2 id="量化在哪一步損失資訊">量化在哪一步損失資訊</h2>
<p>量化的品質損失來自三個位置：</p>
<ol>
<li><strong>Rounding error</strong>：把連續實數 snap 到離散格子、每個權重產生一個小誤差。Block size 越大、scale 越粗、誤差越大。</li>
<li><strong>Clipping</strong>：若 max(|W|) 估錯（例如忽略 outlier）、超出範圍的權重被 clip 到範圍內、損失大值資訊。K-quants 用 block-wise 解決 outlier 影響。</li>
<li><strong>Layer-wise 累積</strong>：每個 layer 的量化誤差會經過後續 layer 放大或累積；某些 layer（如 attention 的 output projection）對誤差特別敏感。Mixed precision 對這些 layer 保留較高 bits。</li>
</ol>
<p>實務上：</p>
<ul>
<li>Q4_K_M 在 31B 模型上品質衰減約 1 ~ 2%（用 perplexity 衡量）、實用上幾乎察覺不到。</li>
<li>Q3 在 31B 模型上衰減約 5 ~ 10%、coding 任務開始失誤。</li>
<li>Q2 衰減 20%+、實用情境受限、多半用於極端硬體預算的實驗。</li>
</ul>
<h2 id="為什麼-31b-q4-常勝-70b-q3">為什麼 31B Q4 常勝 70B Q3</h2>
<p>模型大小與量化等級的乘積決定實際品質。31B Q4 跟 70B Q3 的記憶體佔用接近（16GB vs 25GB）、但實際表現常常 31B Q4 勝：</p>
<ul>
<li>70B Q3 的量化誤差累積在每一層、深網路放大誤差。</li>
<li>31B Q4 誤差較小、雖然參數量較少但能力穩定。</li>
</ul>
<p>這就是 <a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">模型選型</a> 的核心啟示：「夠大」跟「夠好」是兩件事、優先選穩定量化等級、把激進量化留給有預算驗證的場景。</p>
<h2 id="推論時的數值精度">推論時的數值精度</h2>
<p>寫 code 場景的推論大致流程：</p>
<ol>
<li><strong>權重儲存</strong>：Q4_K_M 格式（4.5 bits / 權重）。</li>
<li><strong>推論時 dequantize</strong>：每次用到權重時、暫時 unpack 回 fp16 / bf16 跟 input 做矩陣乘法。</li>
<li><strong>Activation 維持 fp16 / bf16</strong>：樸素 Q4_K_M 的預設行為是不量化 activation、避免進一步損失精度。進階場景（<a href="/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/" data-link-title="5.2 KV cache 量化策略" data-link-desc="PC 場景用 K=Q8 / V=Q4 等量化把 KV cache 壓縮、騰出 VRAM 開大 context window 或加併發數的判讀">KV cache 量化</a> K=Q8 / V=Q4、AWQ、GPTQ 等 activation-aware 量化）會例外處理、需依框架文件配置。</li>
</ol>
<p>所以「Q4 模型」內部運算精度其實是 fp16 / bf16、只有「儲存」是 4 bits。這是為什麼量化主要省記憶體與頻寬、不省算力（算力差距小）。</p>
<h2 id="下一章">下一章</h2>
<p>想看完整數值分析（IEEE 754 細節、條件數、誤差傳播等）、見 <a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">2.4 公開課推薦</a> 的相關資源。</p>
<p>下一章：<a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">2.4 想學更深：推薦公開課程</a>。</p>
]]></content:encoded></item><item><title>2.4 想學更深：推薦公開課程</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/going-deeper-math/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/02-math-foundations/going-deeper-math/</guid><description>&lt;p>本模組前三章把 LLM 推論需要的數學概念走過一遍、給定義跟用途、保留實務脈絡。想看完整推導、跟練習題、跟系統教學、公開課程是更有效率的路徑。本章整理「為 LLM 打數學基礎」這條學習路線上的高品質公開課與書籍、並標出每門課的定位、適合的讀者、跟前置依賴。&lt;/p>
&lt;p>選課的原則：先從跟 LLM 連結最緊密的開始、由近至遠。3Blue1Brown 的視覺化系列適合入門複習、MIT / Stanford 的正式課程適合認真打底、Karpathy 的 YouTube 系列適合「想直接看 LLM 怎麼從零實作」（需要階段 1 ~ 3 的數學基礎才能順暢跟上、所以排在路線後段）。&lt;/p>
&lt;h2 id="路線總覽">路線總覽&lt;/h2>
&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>1&lt;/td>
 &lt;td>視覺化複習&lt;/td>
 &lt;td>任何工程背景&lt;/td>
 &lt;td>入門 / 概念複習&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2&lt;/td>
 &lt;td>線性代數正式課&lt;/td>
 &lt;td>高中代數&lt;/td>
 &lt;td>想紮實打底&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3&lt;/td>
 &lt;td>機率論 + 統計&lt;/td>
 &lt;td>大學一年級數學&lt;/td>
 &lt;td>想懂機率論完整體系&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>4&lt;/td>
 &lt;td>資訊論&lt;/td>
 &lt;td>機率論 + 微積分&lt;/td>
 &lt;td>想懂 entropy / KL 數學起源&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5&lt;/td>
 &lt;td>最佳化&lt;/td>
 &lt;td>多變數微積分 + 線代&lt;/td>
 &lt;td>想懂 SGD / Adam 數學起源&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>6&lt;/td>
 &lt;td>深度學習 + LLM&lt;/td>
 &lt;td>階段 2 + 3 的線代 / 機率&lt;/td>
 &lt;td>想做研究 / 自己訓練&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>7&lt;/td>
 &lt;td>從零實作 LLM&lt;/td>
 &lt;td>階段 6 或 Python ML 經驗&lt;/td>
 &lt;td>想直接接觸完整系統實作&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="階段-13blue1brown-的視覺化系列youtube-免費">階段 1：3Blue1Brown 的視覺化系列（YouTube 免費）&lt;/h2>
&lt;p>Grant Sanderson 的 3Blue1Brown 頻道是入門 / 複習數學概念最有效率的選擇。動畫品質高、講解直觀、每集 15 ~ 30 分鐘。&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>Essence of Linear Algebra（15 集）&lt;/td>
 &lt;td>向量、矩陣、線性變換、特徵值、向量空間&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">2.0&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Essence of Calculus（12 集）&lt;/td>
 &lt;td>導數、積分、chain rule、Taylor series&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Neural Networks（4 集）&lt;/td>
 &lt;td>神經網路怎麼學、backpropagation、gradient descent&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">3.0&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>But what is a GPT?（多集系列）&lt;/td>
 &lt;td>Transformer 內部、attention、embedding 視覺化&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">3.3&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>為什麼從這裡開始&lt;/strong>：3Blue1Brown 的影片不依賴背景知識、用視覺直觀傳達核心概念、適合在進入正式課之前對齊直覺。看完 Essence of Linear Algebra 跟 Neural Networks 兩個系列、本模組大部分概念都能 grasp 到直覺層。&lt;/p></description><content:encoded><![CDATA[<p>本模組前三章把 LLM 推論需要的數學概念走過一遍、給定義跟用途、保留實務脈絡。想看完整推導、跟練習題、跟系統教學、公開課程是更有效率的路徑。本章整理「為 LLM 打數學基礎」這條學習路線上的高品質公開課與書籍、並標出每門課的定位、適合的讀者、跟前置依賴。</p>
<p>選課的原則：先從跟 LLM 連結最緊密的開始、由近至遠。3Blue1Brown 的視覺化系列適合入門複習、MIT / Stanford 的正式課程適合認真打底、Karpathy 的 YouTube 系列適合「想直接看 LLM 怎麼從零實作」（需要階段 1 ~ 3 的數學基礎才能順暢跟上、所以排在路線後段）。</p>
<h2 id="路線總覽">路線總覽</h2>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>內容</th>
          <th>前置依賴</th>
          <th>適合誰</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>視覺化複習</td>
          <td>任何工程背景</td>
          <td>入門 / 概念複習</td>
      </tr>
      <tr>
          <td>2</td>
          <td>線性代數正式課</td>
          <td>高中代數</td>
          <td>想紮實打底</td>
      </tr>
      <tr>
          <td>3</td>
          <td>機率論 + 統計</td>
          <td>大學一年級數學</td>
          <td>想懂機率論完整體系</td>
      </tr>
      <tr>
          <td>4</td>
          <td>資訊論</td>
          <td>機率論 + 微積分</td>
          <td>想懂 entropy / KL 數學起源</td>
      </tr>
      <tr>
          <td>5</td>
          <td>最佳化</td>
          <td>多變數微積分 + 線代</td>
          <td>想懂 SGD / Adam 數學起源</td>
      </tr>
      <tr>
          <td>6</td>
          <td>深度學習 + LLM</td>
          <td>階段 2 + 3 的線代 / 機率</td>
          <td>想做研究 / 自己訓練</td>
      </tr>
      <tr>
          <td>7</td>
          <td>從零實作 LLM</td>
          <td>階段 6 或 Python ML 經驗</td>
          <td>想直接接觸完整系統實作</td>
      </tr>
  </tbody>
</table>
<h2 id="階段-13blue1brown-的視覺化系列youtube-免費">階段 1：3Blue1Brown 的視覺化系列（YouTube 免費）</h2>
<p>Grant Sanderson 的 3Blue1Brown 頻道是入門 / 複習數學概念最有效率的選擇。動畫品質高、講解直觀、每集 15 ~ 30 分鐘。</p>
<table>
  <thead>
      <tr>
          <th>系列</th>
          <th>涵蓋內容</th>
          <th>直接相關章節</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Essence of Linear Algebra（15 集）</td>
          <td>向量、矩陣、線性變換、特徵值、向量空間</td>
          <td><a href="/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">2.0</a></td>
      </tr>
      <tr>
          <td>Essence of Calculus（12 集）</td>
          <td>導數、積分、chain rule、Taylor series</td>
          <td><a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2</a></td>
      </tr>
      <tr>
          <td>Neural Networks（4 集）</td>
          <td>神經網路怎麼學、backpropagation、gradient descent</td>
          <td><a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2</a> + <a href="/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">3.0</a></td>
      </tr>
      <tr>
          <td>But what is a GPT?（多集系列）</td>
          <td>Transformer 內部、attention、embedding 視覺化</td>
          <td><a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2</a> + <a href="/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">3.3</a></td>
      </tr>
  </tbody>
</table>
<p><strong>為什麼從這裡開始</strong>：3Blue1Brown 的影片不依賴背景知識、用視覺直觀傳達核心概念、適合在進入正式課之前對齊直覺。看完 Essence of Linear Algebra 跟 Neural Networks 兩個系列、本模組大部分概念都能 grasp 到直覺層。</p>
<h2 id="階段-2線性代數正式課">階段 2：線性代數正式課</h2>
<h3 id="mit-1806-linear-algebra-by-gilbert-strangocw-免費">MIT 18.06 Linear Algebra by Gilbert Strang（OCW 免費）</h3>
<p>教授 Gilbert Strang 的線性代數課是公開課的金標準、涵蓋向量空間、特徵值、SVD、最小平方等完整內容。課程網站包含影片、講義、作業、教科書。</p>
<ul>
<li><strong>教科書</strong>：Introduction to Linear Algebra by Gilbert Strang（也有 PDF 可下載）</li>
<li><strong>課程連結</strong>：ocw.mit.edu 站內搜尋 18.06 或 18.06SC</li>
<li><strong>時長</strong>：18 ~ 35 講、每講 50 分鐘、約 30 小時</li>
<li><strong>適合</strong>：認真打底、想做完整作業</li>
<li><strong>跟本模組關係</strong>：完整補完 <a href="/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">2.0</a> 的數學深度</li>
</ul>
<h3 id="mit-1806sc-linear-algebraself-paced-版本">MIT 18.06SC Linear Algebra（Self-Paced 版本）</h3>
<p>同樣 Gilbert Strang、但設計成自學版本、有 problem sessions 補講解。建議自學選擇這版而非原始 18.06。</p>
<h2 id="階段-3機率論--統計">階段 3：機率論 + 統計</h2>
<h3 id="harvard-stat-110-probability-by-joe-blitzsteinyoutube-免費">Harvard Stat 110 Probability by Joe Blitzstein（YouTube 免費）</h3>
<p>Harvard 教授 Joe Blitzstein 的機率論課、是 LLM 機率基礎最完整的公開課。涵蓋條件機率、貝氏定理、各種分佈、generating function、Markov chain 等。</p>
<ul>
<li><strong>課程連結</strong>：projects.iq.harvard.edu/stat110（YouTube 有對應錄影）</li>
<li><strong>教科書</strong>：Introduction to Probability by Blitzstein &amp; Hwang</li>
<li><strong>時長</strong>：35 講、每講 50 分鐘、約 30 小時</li>
<li><strong>適合</strong>：想懂機率論完整體系</li>
<li><strong>跟本模組關係</strong>：補完 <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>
</ul>
<h3 id="mit-6041-probabilistic-systems-analysisocw-免費">MIT 6.041 Probabilistic Systems Analysis（OCW 免費）</h3>
<p>工程取向、比 Stat 110 更貼近應用。涵蓋 Bayes、Markov、隨機過程等。適合工程師背景的讀者。</p>
<h3 id="stanford-cs109-probability-for-computer-scientists">Stanford CS109 Probability for Computer Scientists</h3>
<p>Stanford 的 CS 系開設、機率論 + 程式應用、適合想直接看「機率在 ML 中怎麼用」的讀者。課程材料在 Stanford CS109 網站。</p>
<h2 id="階段-4資訊論">階段 4：資訊論</h2>
<h3 id="mit-6050j-information-and-entropyocw-免費">MIT 6.050J Information and Entropy（OCW 免費）</h3>
<p>涵蓋 entropy、cross-entropy、KL divergence、Shannon coding theorem、channel capacity 等資訊論完整基礎。</p>
<ul>
<li><strong>教科書</strong>：Information Theory, Inference, and Learning Algorithms by David MacKay（也免費 PDF）</li>
<li><strong>適合</strong>：想懂 <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> 中 entropy / KL 的數學起源</li>
<li><strong>跟 LLM 的連結</strong>：cross-entropy 為什麼是訓練 LLM 的標準 loss、perplexity 的資訊論意義</li>
</ul>
<h3 id="stanford-ee376a-information-theory">Stanford EE376A Information Theory</h3>
<p>Stanford 的 EE 系開設、跟通訊工程結合、適合 EE 背景讀者。</p>
<h2 id="階段-5最佳化">階段 5：最佳化</h2>
<h3 id="stanford-ee364a-convex-optimization-by-stephen-boydyoutube--教科書免費">Stanford EE364A Convex Optimization by Stephen Boyd（YouTube + 教科書免費）</h3>
<p>凸最佳化的金標準課程。涵蓋 gradient descent、Lagrangian、duality、KKT 條件等。雖然 LLM 訓練是非凸最佳化、但凸最佳化的觀念是基礎。</p>
<ul>
<li><strong>教科書</strong>：Convex Optimization by Boyd &amp; Vandenberghe（線上 PDF 免費）</li>
<li><strong>適合</strong>：想懂 SGD、Adam、Lagrangian 等最佳化技術的數學起源</li>
<li><strong>跟本模組關係</strong>：補完 <a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2</a> 的最佳化理論深度</li>
</ul>
<h2 id="階段-6深度學習與-llm">階段 6：深度學習與 LLM</h2>
<h3 id="mit-6s191-introduction-to-deep-learning每年更新youtube-免費">MIT 6.S191 Introduction to Deep Learning（每年更新、YouTube 免費）</h3>
<p>MIT 的入門 deep learning 課、每年寒假開課並錄影上傳、涵蓋 RNN、Transformer、Diffusion、LLM。</p>
<ul>
<li><strong>課程連結</strong>：introtodeeplearning.com</li>
<li><strong>時長</strong>：每集 1 小時、約 7 ~ 10 集</li>
<li><strong>適合</strong>：deep learning 全面 overview、跟最新主題對齊</li>
</ul>
<h3 id="stanford-cs229-machine-learning-by-andrew-ngstanford-online--youtube">Stanford CS229 Machine Learning by Andrew Ng（Stanford Online + YouTube）</h3>
<p>ML 基礎金標準、涵蓋 linear regression、logistic regression、SVM、CNN、強化學習等。雖然較舊（沒有最新 Transformer）、但基礎扎實。CS229 的免費影片版在 Stanford Online 跟 YouTube（cs229.stanford.edu 有講義跟舊版錄影連結）；OCW 沒有 CS229 官方版本。</p>
<ul>
<li><strong>新版</strong>：Coursera 上有付費版「Machine Learning Specialization」、更新且互動性強</li>
<li><strong>適合</strong>：想完整懂 ML 數學基礎</li>
</ul>
<h3 id="stanford-cs224n-natural-language-processing-with-deep-learning">Stanford CS224N Natural Language Processing with Deep Learning</h3>
<p>NLP + Transformer 的標杆課程。涵蓋 word embedding、RNN、attention、Transformer、BERT、GPT 等。每年更新材料。</p>
<ul>
<li><strong>適合</strong>：<a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2 attention 機制</a> 與 <a href="/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">3.3 Transformer 架構</a> 的最佳補完</li>
<li><strong>連結</strong>：Stanford CS224N 課程網站、YouTube 有錄影</li>
</ul>
<h3 id="stanford-cs25-transformers-united">Stanford CS25 Transformers United</h3>
<p>Stanford 的 Transformer 專題課、每集邀請業界與學界專家、涵蓋 Transformer 在不同領域的應用與進展。</p>
<ul>
<li><strong>適合</strong>：想跟最新 Transformer 研究進度</li>
<li><strong>連結</strong>：YouTube 上搜尋「Stanford CS25」</li>
</ul>
<h3 id="stanford-cs336-language-modeling-from-scratch2024-新開後續每年更新">Stanford CS336 Language Modeling from Scratch（2024 新開、後續每年更新）</h3>
<p>Stanford 新開的 LLM 從零訓練課程、涵蓋資料、tokenization、模型架構、訓練、評估、部署整條鏈。課程材料逐年更新、引用時請註明你看的是哪一年的版本（2026 年後內容可能跟本章引用時有差異）。</p>
<ul>
<li><strong>適合</strong>：想懂 LLM 完整 lifecycle</li>
<li><strong>連結</strong>：Stanford CS336 課程網站</li>
</ul>
<h2 id="階段-7直接動手實作">階段 7：直接動手實作</h2>
<h3 id="andrej-karpathy-的-neural-networks-zero-to-heroyoutube-免費">Andrej Karpathy 的 Neural Networks: Zero to Hero（YouTube 免費）</h3>
<p>OpenAI 前研究員 Andrej Karpathy 的系列影片、從手刻 micrograd 到實作 GPT-2、是「想動手懂 LLM」的最佳路徑。每集 1 ~ 4 小時、邊講邊寫 code。</p>
<ul>
<li><strong>核心集數</strong>：
<ul>
<li>Micrograd（自己刻 autograd）</li>
<li>Makemore 系列（從 bigram 到 Transformer）</li>
<li>Let&rsquo;s build GPT（從零實作 GPT-2）</li>
<li>Let&rsquo;s reproduce GPT-2（更完整的訓練 pipeline）</li>
<li>Let&rsquo;s build the GPT Tokenizer（BPE 詳細實作）</li>
</ul>
</li>
<li><strong>適合</strong>：完成階段 1-3、想直接接觸完整系統實作</li>
<li><strong>連結</strong>：YouTube 搜尋「Karpathy zero to hero」</li>
</ul>
<h3 id="hugging-face-nlp-course">Hugging Face NLP Course</h3>
<p>Hugging Face 官方教材、涵蓋 Transformers library、tokenizer、訓練、推論、deployment。實作取向、適合工程師。</p>
<ul>
<li><strong>連結</strong>：huggingface.co/learn</li>
</ul>
<h2 id="書籍補充">書籍補充</h2>
<table>
  <thead>
      <tr>
          <th>書名</th>
          <th>涵蓋</th>
          <th>免費 PDF</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mathematics for Machine Learning by Deisenroth et al.</td>
          <td>線性代數、機率、最佳化、PCA、SVM</td>
          <td>是</td>
      </tr>
      <tr>
          <td>Deep Learning by Goodfellow, Bengio, Courville</td>
          <td>DL 全面教科書、ML 基礎到 Transformer 出現前</td>
          <td>是</td>
      </tr>
      <tr>
          <td>Information Theory, Inference, and Learning Algorithms by MacKay</td>
          <td>機率 + 資訊論 + ML 整合</td>
          <td>是</td>
      </tr>
      <tr>
          <td>Convex Optimization by Boyd &amp; Vandenberghe</td>
          <td>最佳化理論金標準</td>
          <td>是</td>
      </tr>
      <tr>
          <td>The Elements of Statistical Learning by Hastie et al.</td>
          <td>統計學習方法</td>
          <td>是</td>
      </tr>
  </tbody>
</table>
<p>這幾本書的官方免費 PDF 來源（避免落到盜版站）：</p>
<ul>
<li>Mathematics for Machine Learning：mml-book.github.io</li>
<li>Deep Learning（Goodfellow）：deeplearningbook.org</li>
<li>Information Theory, Inference, and Learning Algorithms：inference.org.uk/mackay/itila/</li>
<li>Convex Optimization（Boyd）：stanford.edu/~boyd/cvxbook/</li>
<li>The Elements of Statistical Learning：hastie.su.domains/ElemStatLearn/</li>
</ul>
<h2 id="何時不適用本路線">何時不適用本路線</h2>
<p>本路線假設「想紮實打底數學跟 LLM 內部、之後做研究或寫 LLM-related code」。以下情境的路線需求不同：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>該怎麼安排</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>直接做 LLM application（RAG / agent）</td>
          <td>階段 1（3B1B）即可、不需要 MIT 18.06 完整 30 小時；應用層 paper 看得懂就夠</td>
      </tr>
      <tr>
          <td>已具備 ML 背景（修過 CS229 / 同等）</td>
          <td>跳過階段 1 ~ 5、直接進階段 6 ~ 7</td>
      </tr>
      <tr>
          <td>純使用本地 LLM、不寫 ML code</td>
          <td>模組零 + 模組一已足夠、本路線可全跳過</td>
      </tr>
      <tr>
          <td>想 fine-tune 模型</td>
          <td>階段 1（複習）+ 階段 6 ~ 7 為主、最佳化 / 資訊論可後補</td>
      </tr>
      <tr>
          <td>想懂 paper 但不打算實作</td>
          <td>階段 1（3B1B）+ Karpathy zero-to-hero 前兩集已足夠</td>
      </tr>
      <tr>
          <td>學術研究 / 想自己 propose 架構</td>
          <td>全路線 + Stanford CS336 / CS25 持續追蹤新論文</td>
      </tr>
  </tbody>
</table>
<h2 id="建議的時間投入">建議的時間投入</h2>
<table>
  <thead>
      <tr>
          <th>目標</th>
          <th>預估時間（投入 5 ~ 10 小時 / 週）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>看完 3Blue1Brown 三個系列</td>
          <td>2 ~ 4 週</td>
      </tr>
      <tr>
          <td>完成 MIT 18.06 線性代數</td>
          <td>8 ~ 12 週</td>
      </tr>
      <tr>
          <td>完成 Stat 110 機率</td>
          <td>8 ~ 12 週</td>
      </tr>
      <tr>
          <td>完成 Karpathy zero-to-hero</td>
          <td>4 ~ 8 週</td>
      </tr>
      <tr>
          <td>完成 Stanford CS224N</td>
          <td>10 週</td>
      </tr>
      <tr>
          <td>完成 Stanford CS336 LLM from scratch</td>
          <td>10 週</td>
      </tr>
  </tbody>
</table>
<p><strong>機會成本提醒</strong>：本系列文章在「Mac 上跑本地 LLM 寫 code」場景中、不需要完整跑完上述課程。3Blue1Brown 三系列 + Karpathy zero-to-hero 已經涵蓋「能讀懂 LLM paper、能看懂模型架構討論」的程度、約 6 ~ 10 週投入。想做研究或自己訓練模型、再進入 MIT / Stanford 正式課程。</p>
<h2 id="下一個模組">下一個模組</h2>
<p>下一個模組：<a href="/blog/llm/03-theoretical-foundations/" data-link-title="模組三：LLM 的理論基礎" data-link-desc="從神經網路、embedding、attention、Transformer 架構、訓練到 sampling：LLM 內部運作的完整理論圖像">模組三 LLM 的理論基礎</a>、把本模組的數學工具拼成完整的 LLM 運作機制。</p>
]]></content:encoded></item><item><title>2.0 線性代數：向量、矩陣、空間</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/linear-algebra-for-llm/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/02-math-foundations/linear-algebra-for-llm/</guid><description>&lt;p>線性代數是 LLM 內部運算的基底。每一次模型 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/forward-pass/" data-link-title="Forward Pass" data-link-desc="input 經過所有 layer 的計算、得到 output 的單向流程；推論跟訓練都會跑、訓練多一個反向階段">forward pass&lt;/a>、本質上都是一連串矩陣乘法；每個 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token&lt;/a> 在模型內部都是一個向量；&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention&lt;/a> 機制計算「相關性」的方式就是向量內積。理解這幾個概念、能讓「為什麼模型有 31B 個參數」「為什麼推論需要這麼多記憶體」「為什麼 &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;/p>
&lt;p>本章假設你看過向量這個詞、知道矩陣有 row 跟 column、但忘記中間細節。每個概念給出定義、在 LLM 中的角色、實務上會怎麼遇到它。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>用向量描述「token 在語意空間中的位置」。&lt;/li>
&lt;li>用矩陣乘法解釋「模型一個 layer 在做什麼」。&lt;/li>
&lt;li>估算「31B 模型佔多少記憶體」（除了量化外的計算依據）。&lt;/li>
&lt;li>看到「dimension mismatch」錯誤時、知道是維度沒對齊。&lt;/li>
&lt;/ol>
&lt;h2 id="向量有方向有長度的數列">向量：有方向有長度的數列&lt;/h2>
&lt;p>向量（vector）的核心定義是「有序的數字序列」。在 LLM 中、每個 token 對應一個向量、稱為 embedding；向量的維度（dimension）通常是幾百到幾千、例如 Gemma 4 的 hidden size 約 4096。&lt;/p>
&lt;p>向量可以幾何解釋成「N 維空間中的一個箭頭」、方向跟長度都重要：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方向&lt;/strong>：表示「token 的語意特徵」。語意相近的 token（如 &lt;code>cat&lt;/code> 跟 &lt;code>kitten&lt;/code>）向量方向接近、語意無關的（如 &lt;code>cat&lt;/code> 跟 &lt;code>algorithm&lt;/code>）方向遠。&lt;/li>
&lt;li>&lt;strong>長度&lt;/strong>（norm）：表示「token 在這個維度上的強度」、計算方式有 L1（絕對值總和）、L2（平方和開根號、最常用）、L∞（最大絕對值）等。&lt;/li>
&lt;/ul>
&lt;p>實務上會遇到向量的地方：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">Embedding 模型&lt;/a> 把文字轉成向量、Continue.dev 的 &lt;code>@codebase&lt;/code> 用這個機制找相關片段。&lt;/li>
&lt;li>&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> 存的就是每個 token 在每個 layer 算出來的向量。&lt;/li>
&lt;li>模型內部所有 token 都以向量形式流動、token 本身的整數 ID 只在輸入跟輸出端用到。&lt;/li>
&lt;/ul>
&lt;h2 id="內積衡量兩個向量的相關性">&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">內積&lt;/a>：衡量兩個向量的相關性&lt;/h2>
&lt;p>內積（dot product / inner product）的核心定義是「兩個向量對應位置相乘再相加」。&lt;code>a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ&lt;/code>。&lt;/p>
&lt;p>內積的幾何意義是「投影」：a 在 b 方向上的長度乘以 b 的長度。對 LLM 而言、它最重要的用途是衡量兩個向量的相似度：&lt;/p>
&lt;ul>
&lt;li>兩個向量方向接近、內積大（正值）。&lt;/li>
&lt;li>兩個向量垂直、內積為 0。&lt;/li>
&lt;li>兩個向量方向相反、內積大負值。&lt;/li>
&lt;/ul>
&lt;p>Attention 機制就是用內積算「當前 token 該關注前面哪幾個 token」：&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">attention_score = query · key ← 內積&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一對 (query, key) 算一次內積、得到一個分數；分數高表示「這個 token 該注意那個位置」。詳細展開見 &lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2 attention 機制&lt;/a>。&lt;/p>
&lt;h2 id="norm向量的長度">&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/vector-norm/" data-link-title="Vector Norm" data-link-desc="衡量向量大小的純量值、L1 / L2 / L∞ 各有用途、cosine similarity 的基礎">Norm&lt;/a>：向量的長度&lt;/h2>
&lt;p>Norm（範數）的核心定義是「衡量向量大小的純量值」。最常用的 L2 norm（也叫 Euclidean 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">||v||₂ = sqrt(v₁² + v₂² + ... + vₙ²)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 中 norm 的用途：&lt;/p></description><content:encoded><![CDATA[<p>線性代數是 LLM 內部運算的基底。每一次模型 <a href="/blog/llm/knowledge-cards/forward-pass/" data-link-title="Forward Pass" data-link-desc="input 經過所有 layer 的計算、得到 output 的單向流程；推論跟訓練都會跑、訓練多一個反向階段">forward pass</a>、本質上都是一連串矩陣乘法；每個 <a href="/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token</a> 在模型內部都是一個向量；<a href="/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention</a> 機制計算「相關性」的方式就是向量內積。理解這幾個概念、能讓「為什麼模型有 31B 個參數」「為什麼推論需要這麼多記憶體」「為什麼 <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a> 是瓶頸」從口號變成可推導的事實。</p>
<p>本章假設你看過向量這個詞、知道矩陣有 row 跟 column、但忘記中間細節。每個概念給出定義、在 LLM 中的角色、實務上會怎麼遇到它。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>用向量描述「token 在語意空間中的位置」。</li>
<li>用矩陣乘法解釋「模型一個 layer 在做什麼」。</li>
<li>估算「31B 模型佔多少記憶體」（除了量化外的計算依據）。</li>
<li>看到「dimension mismatch」錯誤時、知道是維度沒對齊。</li>
</ol>
<h2 id="向量有方向有長度的數列">向量：有方向有長度的數列</h2>
<p>向量（vector）的核心定義是「有序的數字序列」。在 LLM 中、每個 token 對應一個向量、稱為 embedding；向量的維度（dimension）通常是幾百到幾千、例如 Gemma 4 的 hidden size 約 4096。</p>
<p>向量可以幾何解釋成「N 維空間中的一個箭頭」、方向跟長度都重要：</p>
<ul>
<li><strong>方向</strong>：表示「token 的語意特徵」。語意相近的 token（如 <code>cat</code> 跟 <code>kitten</code>）向量方向接近、語意無關的（如 <code>cat</code> 跟 <code>algorithm</code>）方向遠。</li>
<li><strong>長度</strong>（norm）：表示「token 在這個維度上的強度」、計算方式有 L1（絕對值總和）、L2（平方和開根號、最常用）、L∞（最大絕對值）等。</li>
</ul>
<p>實務上會遇到向量的地方：</p>
<ul>
<li><a href="/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">Embedding 模型</a> 把文字轉成向量、Continue.dev 的 <code>@codebase</code> 用這個機制找相關片段。</li>
<li><a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 存的就是每個 token 在每個 layer 算出來的向量。</li>
<li>模型內部所有 token 都以向量形式流動、token 本身的整數 ID 只在輸入跟輸出端用到。</li>
</ul>
<h2 id="內積衡量兩個向量的相關性"><a href="/blog/llm/knowledge-cards/dot-product/" data-link-title="Dot Product" data-link-desc="兩個向量對應位置相乘再加總、attention score 跟相似度判讀的基礎">內積</a>：衡量兩個向量的相關性</h2>
<p>內積（dot product / inner product）的核心定義是「兩個向量對應位置相乘再相加」。<code>a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ</code>。</p>
<p>內積的幾何意義是「投影」：a 在 b 方向上的長度乘以 b 的長度。對 LLM 而言、它最重要的用途是衡量兩個向量的相似度：</p>
<ul>
<li>兩個向量方向接近、內積大（正值）。</li>
<li>兩個向量垂直、內積為 0。</li>
<li>兩個向量方向相反、內積大負值。</li>
</ul>
<p>Attention 機制就是用內積算「當前 token 該關注前面哪幾個 token」：</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">attention_score = query · key  ← 內積</span></span></code></pre></div><p>每一對 (query, key) 算一次內積、得到一個分數；分數高表示「這個 token 該注意那個位置」。詳細展開見 <a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">3.2 attention 機制</a>。</p>
<h2 id="norm向量的長度"><a href="/blog/llm/knowledge-cards/vector-norm/" data-link-title="Vector Norm" data-link-desc="衡量向量大小的純量值、L1 / L2 / L∞ 各有用途、cosine similarity 的基礎">Norm</a>：向量的長度</h2>
<p>Norm（範數）的核心定義是「衡量向量大小的純量值」。最常用的 L2 norm（也叫 Euclidean 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">||v||₂ = sqrt(v₁² + v₂² + ... + vₙ²)</span></span></code></pre></div><p>LLM 中 norm 的用途：</p>
<ul>
<li><strong>Layer normalization</strong>：每個 layer 結束後把 activation（每層輸出的數值、見 <a href="/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">3.0 神經網路基礎</a>）重新正規化、避免數值爆炸或消失。</li>
<li><strong>Embedding normalization</strong>：embedding 模型常把向量正規化到 L2 norm = 1、讓內積等同於 cosine similarity。</li>
<li><strong>Gradient clipping</strong>：訓練時若 <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/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">2.2 微積分與最佳化</a>）的 norm 太大、截斷到合理範圍、避免訓練不穩。</li>
</ul>
<p>Cosine similarity（餘弦相似度）= 兩個向量的內積除以兩者 norm 的乘積、結果落在 -1 到 1 之間、是 RAG / semantic search 最常用的相似度指標。實務上常先把 embedding 正規化到 L2 norm = 1、之後 cosine similarity 退化為單純內積、可直接套用 dot-product 比對。</p>
<p>使用 cosine similarity 時的兩個邊界：</p>
<ul>
<li><strong>Anisotropy（向量集中在某方向）</strong>：訓練不充分或 embedding 維度太低時、所有向量會擠在一個窄錐裡、cosine 分數普遍偏高、相對排序失準。判讀訊號：抽樣 100 對隨機 query、cosine score 平均 &gt; 0.7。修法：換較強的 embedding model、或對 embedding 做 mean-centering / whitening。</li>
<li><strong>不同 embedding space 不可比</strong>：nomic、OpenAI、bge 訓練 objective 不同、向量空間不同源、跨模型算 cosine 沒意義。修法：同一個 retrieval pipeline 鎖一個 embedding model、換模型時整批重算 index。</li>
</ul>
<h2 id="矩陣把向量打包成-2d-結構">矩陣：把向量打包成 2D 結構</h2>
<p>矩陣（matrix）的核心定義是「向量的有序集合、以 2D table 形式組織」。一個 m × n 矩陣有 m row、n column；每個 row 或 column 可以視為向量。</p>
<p>LLM 中的矩陣到處都是：</p>
<ul>
<li><strong>權重矩陣</strong>：每個 linear layer 對應一個權重矩陣 W、shape 是 <code>(input_dim, output_dim)</code>。</li>
<li><strong>Batched inputs</strong>：把多個 token 的 embedding 打包成 <code>(seq_len, embed_dim)</code> 矩陣、一次處理。</li>
<li><strong>Attention scores</strong>：每對 (query, key) 算內積、得到 <code>(seq_len, seq_len)</code> 矩陣。</li>
</ul>
<p>模型權重數量的算法：把所有 layer 的權重矩陣大小加總、就是 31B / 70B 等參數規模。例如一個 hidden size = 4096 的 linear layer、權重矩陣大小 <code>4096 × 4096 = 16,777,216</code>、約 16.8M 參數。31B 模型的數字推導：~1800 個這個量級的權重矩陣相加（attention 的 Q / K / V / O 矩陣 + FFN 的兩個矩陣 × 數十個 transformer block）、總和約 31B 個參數；bf16 每權重 2 bytes、整份權重約 62GB；Q4 量化後每權重 0.5 bytes、約 18GB。完整的記憶體預算判讀見 <a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">0.5 Apple Silicon 記憶體預算</a>。</p>
<h2 id="矩陣乘法llm-推論的核心運算"><a href="/blog/llm/knowledge-cards/matrix-multiplication/" data-link-title="Matrix Multiplication" data-link-desc="LLM 推論最頻繁的單一運算、forward pass 每層的核心、memory bandwidth 瓶頸的根源">矩陣乘法</a>：LLM 推論的核心運算</h2>
<p>矩陣乘法（matrix multiplication）的核心定義是「左矩陣的 row 跟右矩陣的 column 做內積、結果填進對應位置」。對 <code>A (m × k)</code> 跟 <code>B (k × n)</code> 相乘、得到 <code>C (m × n)</code>、其中 <code>C[i][j] = A 的第 i row 跟 B 的第 j column 的內積</code>。</p>
<p>LLM 推論的每個 layer 都是矩陣乘法 + 非線性 activation。例如一個 feed-forward 層的計算是：</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">output = activation(input @ W₁) @ W₂</span></span></code></pre></div><p>其中 <code>@</code> 是矩陣乘法、<code>W₁</code>、<code>W₂</code> 是權重矩陣。一個 31B 模型跑一次 forward pass、會做數百次矩陣乘法、總運算量是「token 數 × 模型參數數 × 2」的量級。</p>
<p>矩陣乘法的維度規則：<strong>左矩陣的 column 數要等於右矩陣的 row 數</strong>。<code>(m × k) @ (k × n) = (m × n)</code>。遇到 dimension mismatch 錯誤的定位流程：讀 traceback 找到 <code>mat1</code> / <code>mat2</code> 各自的 shape、檢查倒數第二維（左）跟倒數第一維（右）是否相等；常見來源是 batch dim 沒 squeeze、或 transpose 順序錯。理論上限 ≈ 30 tok/s 是 dense 模型 + 單請求 + 無 batching / 無 speculative decoding 的純 memory-bound 情境下的估算、實際數字隨量化、framework、batch 配置浮動。</p>
<h2 id="為什麼這對-memory-bandwidth-重要">為什麼這對 memory bandwidth 重要</h2>
<p><a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">Memory bandwidth</a> 是 LLM 推論的真實瓶頸、原因落在矩陣乘法本身：</p>
<ul>
<li>每生成一個新 token、需要把整個模型權重（所有矩陣）從記憶體讀到處理器一次。</li>
<li>算力（FLOPs）在現代 GPU / Apple Silicon 上充足、瓶頸落在「讀權重要多久」。</li>
<li>31B 模型約 18GB（Q4 量化）、M4 Max 頻寬 546 GB/s、理論上限 ≈ 30 tok/s。</li>
</ul>
<p>這就是為什麼 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 能加速：權重變小、每秒能讀過更多次完整模型、tok/s 變高。也是為什麼 <a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a> 能加速：一次 forward pass 就把權重讀過一次、驗證多個 token、攤平單 token 成本。</p>
<h2 id="張量tensor多維度的矩陣"><a href="/blog/llm/knowledge-cards/tensor/" data-link-title="Tensor" data-link-desc="多維陣列、矩陣是 2D 特例、PyTorch / MLX / JAX 等 framework 的核心型別">張量（Tensor）</a>：多維度的矩陣</h2>
<p>張量（tensor）的核心定義是「N 維陣列、矩陣是 N=2 的特例」。LLM 內部常用 3D / 4D tensor：</p>
<ul>
<li><strong>3D</strong>：<code>(batch_size, seq_len, hidden_dim)</code>、表示「N 個句子、每個句子 M 個 token、每個 token 是 D 維向量」。</li>
<li><strong>4D</strong>：<code>(batch_size, num_heads, seq_len, head_dim)</code>、表示 multi-head attention 的並行計算結構。</li>
</ul>
<p>PyTorch、MLX 等 framework 的核心型別都叫 Tensor、所有運算（矩陣乘法、norm、softmax 等）都對 tensor 做。</p>
<h2 id="下一章">下一章</h2>
<p>想看完整推導跟練習、見 <a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">2.4 公開課推薦</a> 的 MIT 18.06、3Blue1Brown 線性代數系列等資源。</p>
<p>下一章：<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>。</p>
]]></content:encoded></item></channel></rss>