<?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>Optimizer on Tarragon</title><link>https://tarrragon.github.io/blog/tags/optimizer/</link><description>Recent content in Optimizer 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/optimizer/index.xml" rel="self" type="application/rss+xml"/><item><title>Adam / AdamW</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/adam-adamw/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/adam-adamw/</guid><description>&lt;p>Adam（Adaptive Moment Estimation、Kingma &amp;amp; Ba, 2014）的核心概念是「&lt;strong>對每個參數維護兩個 EMA&lt;/strong>（gradient 的一階矩 = 平均、二階矩 = 變異）、用這兩個值自適應地縮放每個參數的更新步長」。AdamW（Loshchilov &amp;amp; Hutter, 2017）是 Adam 加上「decoupled weight decay」的修正版、是現代 LLM 訓練的標準 optimizer。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Adam 更新規則（簡化）：&lt;/p>





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





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





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





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">W_new = W_old - learning_rate × gradient_of_loss_on_minibatch</span></span></code></pre></div><p>跟其他 optimizer 的對比：</p>
<table>
  <thead>
      <tr>
          <th>Optimizer</th>
          <th>更新規則</th>
          <th>特性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>SGD</td>
          <td><code>W -= lr × g</code></td>
          <td>簡單、慢、容易卡 local minimum</td>
      </tr>
      <tr>
          <td>SGD + Momentum</td>
          <td>加速度項：<code>v = μv + g; W -= lr × v</code></td>
          <td>衝過 saddle point、收斂較穩</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/knowledge-cards/adam-adamw/" data-link-title="Adam / AdamW" data-link-desc="對每個參數自適應 learning rate 的 optimizer、LLM 訓練主流選擇">Adam / AdamW</a></td>
          <td>對每個參數自適應 lr、用 gradient 的 EMA 跟二階矩</td>
          <td>對 lr 較不敏感、LLM 訓練主流</td>
      </tr>
  </tbody>
</table>
<p>LLM 訓練幾乎都用 Adam / AdamW、不是純 SGD。但 SGD 仍出現在：</p>
<ol>
<li><strong>小模型 / 簡單任務</strong>：fine-tune 小 vision 模型、SGD + momentum 仍是合理選擇。</li>
<li><strong>理論分析 / 教學</strong>：SGD 是最簡單的 optimizer、用來解釋 gradient descent 概念。</li>
<li><strong>某些 fine-tuning 場景</strong>：<a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> 或 SFT 偶爾用 SGD（避免 Adam 改變 base model 太多）。</li>
</ol>
<h2 id="設計責任">設計責任</h2>
<p>讀 paper / training script 看到 optimizer 選擇、SGD 是基線、其他 optimizer 通常是「對 SGD 的改進」。寫 code 場景的判讀：訓練自己的小模型可以從 SGD + momentum 開始；fine-tune 大 LLM 沒理由不用 AdamW。</p>
]]></content:encoded></item></channel></rss>