<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>RMSNorm - 标签 - vllbc02&#39;s blogs</title>
        <link>https://blog.vllbc.top/tags/rmsnorm/</link>
        <description>RMSNorm - 标签 - vllbc02&#39;s blogs</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Sat, 06 Jun 2026 00:00:00 &#43;0000</lastBuildDate><atom:link href="https://blog.vllbc.top/tags/rmsnorm/" rel="self" type="application/rss+xml" /><item>
    <title>QK-Norm</title>
    <link>https://blog.vllbc.top/qk-norm/</link>
    <pubDate>Sat, 06 Jun 2026 00:00:00 &#43;0000</pubDate>
    <author>vllbc</author>
    <guid>https://blog.vllbc.top/qk-norm/</guid>
    <description><![CDATA[<h1 id="qk-norm">QK-Norm</h1>
<blockquote>
<p>来自 Sebastian Raschka 的 <em>The Big LLM Architecture
Comparison</em>。</p>
</blockquote>
<h2 id="一句话">一句话</h2>
<p>QK-Norm = 在 attention 模块内，对 <strong>q、k</strong> 各自加一层
RMSNorm，<strong>在 RoPE 之前</strong> 应用。起源是 2023 年的
<em>Scaling Vision Transformers</em> 论文。</p>
<h2 id="代码示例">代码示例</h2>
<div class="sourceCode" id="cb1"><pre
class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">class</span> GroupedQueryAttention(nn.Module):</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">def</span> <span class="fu">__init__</span>(<span class="va">self</span>, d_in, num_heads, num_kv_groups,</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>                 head_dim<span class="op">=</span><span class="va">None</span>, qk_norm<span class="op">=</span><span class="va">False</span>, dtype<span class="op">=</span><span class="va">None</span>):</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>        <span class="co"># ...</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> qk_norm:</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>            <span class="va">self</span>.q_norm <span class="op">=</span> RMSNorm(head_dim, eps<span class="op">=</span><span class="fl">1e-6</span>)</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>            <span class="va">self</span>.k_norm <span class="op">=</span> RMSNorm(head_dim, eps<span class="op">=</span><span class="fl">1e-6</span>)</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>        <span class="cf">else</span>:</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>            <span class="va">self</span>.q_norm <span class="op">=</span> <span class="va">self</span>.k_norm <span class="op">=</span> <span class="va">None</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a>    <span class="kw">def</span> forward(<span class="va">self</span>, x, mask, cos, sin):</span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>        b, num_tokens, _ <span class="op">=</span> x.shape</span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a>        queries <span class="op">=</span> <span class="va">self</span>.W_query(x)</span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a>        keys <span class="op">=</span> <span class="va">self</span>.W_key(x)</span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a>        values <span class="op">=</span> <span class="va">self</span>.W_value(x)</span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a>        <span class="co"># ...</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="va">self</span>.q_norm:</span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a>            queries <span class="op">=</span> <span class="va">self</span>.q_norm(queries)</span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="va">self</span>.k_norm:</span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a>            keys <span class="op">=</span> <span class="va">self</span>.k_norm(keys)</span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a>        <span class="co"># apply RoPE</span></span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a>        queries <span class="op">=</span> apply_rope(queries, cos, sin)</span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a>        keys <span class="op">=</span> apply_rope(keys, cos, sin)</span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a>        <span class="co"># ...</span></span></code></pre></div>
<h2 id="作用">作用</h2>
<ul>
<li>与 [[Post-Norm vs Pre-Norm|Post-Norm]] 一起 → 稳定训练</li>
<li>QK 的尺度被显式控制 → 防止 attention logits 爆炸</li>
</ul>
<h2 id="谁在用">谁在用</h2>
<ul>
<li>OLMo 2（首次出现在主流 LLM）</li>
<li>Gemma 2 / Gemma 3</li>
<li>MiniMax M2（<strong>Per-Layer QK-Norm</strong>——见下）</li>
<li>Arcee Trinity Large</li>
<li>GLM-4.5</li>
</ul>
<h2 id="per-layer-qk-normm2-变体">Per-Layer QK-Norm（M2 变体）</h2>
<p>普通 QK-Norm 是一组 <code>q_norm</code> / <code>k_norm</code>
在每层共享。M2 的实现更”细”：</p>]]></description>
</item>
</channel>
</rss>
