<?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>模組二：LLM 的數學基礎 on Tarragon</title><link>https://tarrragon.github.io/blog/llm/02-math-foundations/</link><description>Recent content in 模組二：LLM 的數學基礎 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 11 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/llm/02-math-foundations/index.xml" rel="self" type="application/rss+xml"/><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>