|
28 | 28 | <meta property="og:description" content="Task 1: 均方根层归一化 (RMS Norm)均方根层归一化(RMS Norm)是深度学习中应用最广泛的归一化模块,尤其在自然语言处理(NLP)和大语言模型(LLM)领域。该模块以形状为 [batch_size, seqlen, hidden_size] 的张量为输入(记为 X,形状为 [b, s, h]),并沿着隐藏层 h 维度,执行带可学习缩放变换的均方根归一化操作,得到输出 Y,形状为"> |
29 | 29 | <meta property="og:locale" content="zh_CN"> |
30 | 30 | <meta property="article:published_time" content="2025-06-17T06:17:05.000Z"> |
31 | | -<meta property="article:modified_time" content="2025-06-18T08:30:06.897Z"> |
| 31 | +<meta property="article:modified_time" content="2025-06-18T09:11:14.634Z"> |
32 | 32 | <meta property="article:author" content="DeepEngine"> |
33 | 33 | <meta property="article:tag" content="RMSNorm"> |
34 | 34 | <meta property="article:tag" content="Vocab Embedding"> |
@@ -187,7 +187,7 @@ <h1 class="post-title" itemprop="name headline"> |
187 | 187 | <i class="far fa-calendar-check"></i> |
188 | 188 | </span> |
189 | 189 | <span class="post-meta-item-text">更新于</span> |
190 | | - <time title="修改时间:2025-06-18 16:30:06" itemprop="dateModified" datetime="2025-06-18T16:30:06+08:00">2025-06-18</time> |
| 190 | + <time title="修改时间:2025-06-18 17:11:14" itemprop="dateModified" datetime="2025-06-18T17:11:14+08:00">2025-06-18</time> |
191 | 191 | </span> |
192 | 192 | <span class="post-meta-item"> |
193 | 193 | <span class="post-meta-item-icon"> |
@@ -265,22 +265,21 @@ <h4 id="Optional-Task4:旋转位置编码"><a href="#Optional-Task4:旋转 |
265 | 265 | <li>输出张量 <code>E</code> 的形状与 <code>X</code> 的形状相同,表示应用旋转编码后的结果。</li> |
266 | 266 | </ul> |
267 | 267 | </li> |
268 | | -<li><p>由于 <strong>RoPE</strong> 矩阵的稀疏性,直接用矩阵乘法来实现会很浪费算力,推荐使用以下方式来实现 <strong>RoPE</strong>:<br>$$<br>\begin{pmatrix}<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\quad</p> |
269 | | -<ul> |
270 | | -<li></li> |
| 268 | +<li><p>由于 <strong>RoPE</strong> 矩阵的稀疏性,直接用矩阵乘法来实现会很浪费算力,推荐使用 $(8)$ 中的方法来实现标准 <strong>RoPE</strong>。其中,$\bigotimes$ 是逐位相乘,并且可以注意到 $(8)$ 中,$X$ 按 $(x_0,x_1),(x_2,x_3),\cdots$ 的顺序进行分组。而 <code>Llama</code> 和 <code>ChatGLM</code> 的 <strong>RoPE</strong> 模块对 $X$ 的顺序进行了重组,也即按 $(x_0,x_{\frac{d}{2}}),(x_1,x_{\frac{d}{2}+1}),\cdots$ 的顺序进行分组,请使用 $(9)$ 中的方法实现 <strong>Task4</strong> 中的 <strong>RoPE</strong>。</p> |
| 269 | +<div class="note info"> |
| 270 | + <p>余弦\正弦参数对 <code>(C, S)</code> 也要做相应调整。</p> |
| 271 | + </div></li> |
271 | 272 | </ul> |
272 | | -<p>\quad<br>\begin{pmatrix}<br>-x_1 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>-x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>-x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\tag{8}<br>$$<br>其中,$\otimes$ 是逐位相乘,并且可以注意到上述式子中,按 $(x_0,x_1),(x_2,x_3),\cdots$ 的顺序进行分组。而 <code>Llama</code> 和 <code>ChatGLM</code> 的 <strong>RoPE</strong> 模块对 $x$ 的顺序进行了重组,也即按 $(x_0,x_{\frac{d}{2}}),(x_1,x_{\frac{d}{2}+1}),\cdots$ 的顺序进行分组,请使用如下方法进行计算。<br>$$<br>\begin{pmatrix}<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{\frac{d}{2}-1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_{\frac{d}{2}} \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_{\frac{d}{2}+1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_{\frac{d}{2}+2} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^2\right)} \cr<br>\cos{\left(n\theta^3\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^2\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-2}\right) \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\quad<br>+<br>\quad<br>\begin{pmatrix}<br>-x_{\frac{d}{2}} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>-x_{\frac{d}{2}+1} \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>-x_{\frac{d}{2}+2} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>-x_{\frac{d}{2}+3} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>-x_{d-1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{\frac{d}{2}-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{\frac{d}{2}-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^2\right)} \cr<br>\sin{\left(n\theta^3\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^2\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-2}\right) \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\tag{9}<br>$$<br>注意:余弦\正弦参数对 <code>(C, S)</code> 也要做相应调整。</p> |
273 | | -</li> |
274 | | -<li><p>另一个问题是,初始化 <code>NTKAwareRoPE</code> 时会提供一个训练阶段使用的最大序列长度(记作 <code>ms</code>)和一个缩放比例(记作 <code>k</code>,也即 $\kappa$),此时我们可以预先计算好 <code>(C, S)</code>,其形状为 <code>[es, hd]</code>,其中 <code>es = ms x k</code> 表示最大支持的拓展序列长度。因此,当有一个输入张量 <code>X_</code> 的实际序列长度 <code>s_</code> 超过了 <code>es</code>,即 <code>s_ > es</code>,我们必须动态重新计算一对新的 <code>(C_, S_)</code>,以确保旋转编码操作可以适用于这类超长输入。</p> |
275 | | -</li> |
276 | | -<li><p>但这里有两个问题:</p> |
277 | | -<ol> |
| 273 | +<p>$$<br>\begin{pmatrix}<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\quad<br>+<br>\quad<br>\begin{pmatrix}<br>-x_1 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>-x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>-x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\tag{8}<br>$$</p> |
| 274 | +<p>$$<br>\begin{pmatrix}<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_3 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{\frac{d}{2}-1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_{\frac{d}{2}} \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_{\frac{d}{2}+1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_{\frac{d}{2}+2} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{d-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{d-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^2\right)} \cr<br>\cos{\left(n\theta^3\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\cos{\left(n\theta^0\right)} \cr<br>\cos{\left(n\theta^1\right)} \cr<br>\cos{\left(n\theta^2\right)} \cr<br>\vdots \cr<br>\cos\left(n\theta^{\frac{d}{2}-2}\right) \cr<br>\cos\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\quad<br>+<br>\quad<br>\begin{pmatrix}<br>-x_{\frac{d}{2}} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>-x_{\frac{d}{2}+1} \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>-x_{\frac{d}{2}+2} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>-x_{\frac{d}{2}+3} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>-x_{d-1} \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_0 \vphantom{\cos{\left(n\theta^0\right)}} \cr<br>x_1 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>x_2 \vphantom{\cos{\left(n\theta^0\right)}}\cr<br>\vdots \cr<br>x_{\frac{d}{2}-2} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}\cr<br>x_{\frac{d}{2}-1} \vphantom{\cos\left(n\theta^{\frac{d}{2}-1}\right)}<br>\end{pmatrix}<br>\quad<br>\bigotimes<br>\quad<br>\begin{pmatrix}<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^2\right)} \cr<br>\sin{\left(n\theta^3\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right) \cr<br>\sin{\left(n\theta^0\right)} \cr<br>\sin{\left(n\theta^1\right)} \cr<br>\sin{\left(n\theta^2\right)} \cr<br>\vdots \cr<br>\sin\left(n\theta^{\frac{d}{2}-2}\right) \cr<br>\sin\left(n\theta^{\frac{d}{2}-1}\right)<br>\end{pmatrix}<br>\tag{9}<br>$$</p> |
| 275 | +<ul> |
| 276 | +<li>另一个问题是,初始化 <code>NTKAwareRoPE</code> 时会提供一个训练阶段使用的最大序列长度(记作 <code>ms</code>)和一个缩放比例(记作 <code>k</code>,也即 $\kappa$),此时我们可以预先计算好 <code>(C, S)</code>,其形状为 <code>[es, hd]</code>,其中 <code>es = ms x k</code> 表示最大支持的拓展序列长度。因此,当有一个输入张量 <code>X_</code> 的实际序列长度 <code>s_</code> 超过了 <code>es</code>,即 <code>s_ > es</code>,我们必须动态重新计算一对新的 <code>(C_, S_)</code>,以确保旋转编码操作可以适用于这类超长输入。</li> |
| 277 | +<li>但这里有两个问题:<ol> |
278 | 278 | <li>当需要重新计算新的余弦/正弦基 <code>(C', S')</code> 时,我们应如何为输入张量 <code>X'</code> 确定新的缩放比例 <code>k'</code> ?</li> |
279 | 279 | <li>当遇到这类超长序列时,我们是否应该每次仅计算并使用该输入所需的 <code>(C', S')</code>,同时保留原始的缩放比例 <code>k</code> 及其对应的 <code>(C, S)</code> 用于常规输入?或者,我们应该每次都更新当前的 <code>k</code> 及其对应的 <code>(C, S)</code> 为新的 <code>k'</code> 和 <code>(C', S')</code> ?</li> |
280 | 280 | </ol> |
281 | 281 | </li> |
282 | | -<li><p>上述问题尚无标准答案。在此任务中,我们采用如下策略:</p> |
283 | | -<ol> |
| 282 | +<li>上述问题尚无标准答案。在此任务中,我们采用如下策略:<ol> |
284 | 283 | <li>当出现新的输入长度 <code>s' > es</code> 时,我们选择满足 <code>es' = ms x k' >= s'</code> 的最小 <code>k'</code>,其中 <code>k'</code> 是一个偶数;</li> |
285 | 284 | <li>我们在初始化 <code>NTKAwareRoPE</code> 模块时新增了一个参数 <code>dynamic</code>。当 <code>dynamic = True</code> 时,每次遇到超出长度的输入时,都会更新当前的 $k \leftarrow k’$ 以及 $(C,S) \leftarrow (C’, S’)$;反之,若 <code>dynamic = False</code> 时,则仅为当前超长输入临时计算并使用 $(C’,S’)$,而全局的 $k$ 和 $(C,S)$ 保持不变。</li> |
286 | 285 | </ol> |
|
0 commit comments