<?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>Linear-Algebra on Tarragon</title><link>https://tarrragon.github.io/blog/tags/linear-algebra/</link><description>Recent content in Linear-Algebra 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/linear-algebra/index.xml" rel="self" type="application/rss+xml"/><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>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>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.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>