From f9e03eba602e97b9915d002382d436f102c586d9 Mon Sep 17 00:00:00 2001 From: dongtaishi Date: Sun, 15 Mar 2026 11:52:51 -0700 Subject: [PATCH] fix markdown formatting: LaTeX rendering, bold markers, and clarify MHA/residual explanations --- ...55\350\250\200\346\250\241\345\236\213.md" | 6 +++--- .../1.attention/1.attention.md" | 20 ++++++++++--------- .../2.layer_normalization.md" | 8 ++++---- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git "a/01.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\345\237\272\347\241\200/1.\350\257\255\350\250\200\346\250\241\345\236\213/1.\350\257\255\350\250\200\346\250\241\345\236\213.md" "b/01.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\345\237\272\347\241\200/1.\350\257\255\350\250\200\346\250\241\345\236\213/1.\350\257\255\350\250\200\346\250\241\345\236\213.md" index e158aa1..79b863a 100644 --- "a/01.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\345\237\272\347\241\200/1.\350\257\255\350\250\200\346\250\241\345\236\213/1.\350\257\255\350\250\200\346\250\241\345\236\213.md" +++ "b/01.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\345\237\272\347\241\200/1.\350\257\255\350\250\200\346\250\241\345\236\213/1.\350\257\255\350\250\200\346\250\241\345\236\213.md" @@ -26,7 +26,7 @@ $$ 例如,语言模型应该隐含地赋予"𝗆𝗈𝗎𝗌𝖾 𝗍𝗁𝖾 𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾 𝖺𝗍𝖾"一个非常低的概率,因为它在语法上是不正确的(句法知识)。由于世界知识的存在,语言模型应该隐含地赋予"𝗍𝗁𝖾 𝗆𝗈𝗎𝗌𝖾 𝖺𝗍𝖾 𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾"比"𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾 𝖺𝗍𝖾 𝗍𝗁𝖾 𝗆𝗈𝗎𝗌𝖾"更高的概率。这是因为两个句子在句法上是相同的,但在语义上却存在差异,而语言模型需要具备卓越的语言能力和世界知识,才能准确评估序列的概率。 -语言模型也可以做生成任务。如定义所示,语言模型p接受一个序列并返回一个概率来评估其好坏。我们也可以根据语言模型生成一个序列。最纯粹的方法是从语言模型$p$中以概率$p(x_{1:L})$进行采样,表示为: +语言模型也可以做生成任务。如定义所示,语言模型 $p$ 接受一个序列并返回一个概率来评估其好坏。我们也可以根据语言模型生成一个序列。最纯粹的方法是从语言模型 $p$ 中以概率 $p(x_{1:L})$ 进行采样,表示为: $$ x_{1:L}∼p. @@ -48,7 +48,7 @@ $$ \begin{align*} p({the}, {mouse}, {ate}, {the}, {cheese}) = \, & p({the}) \\ & p({mouse} \mid {the}) \\ & p({ate} \mid {the}, {mouse}) \\ & p({the} \mid {the}, {mouse}, {ate}) \\ & p({cheese} \mid {the}, {mouse}, {ate}, {the}). \end{align*} $$ -特别地,需要理解 $p(x_{i}∣x_{1:i−1})$ 是一个给定前面的记号 $x_{1:i−1}$ 后,下一个记号 $x_{i}$ 的条件概率分布。在数学上,任何联合概率分布都可以通过这种方式表示。然而,自回归语言模型的特点是\*\*它可以利用例如前馈神经网络等方法有效计算出每个条件概率分布 \*\*$p(x_{i}∣x_{1:i−1})$ 。在自回归语言模型 $p$ 中生成整个序列 $x_{1:L}$ ,我们需要一次生成一个令牌(token),该令牌基于之前以生成的令牌进行计算获得: +特别地,需要理解 $p(x_{i}∣x_{1:i−1})$ 是一个给定前面的记号 $x_{1:i−1}$ 后,下一个记号 $x_{i}$ 的条件概率分布。在数学上,任何联合概率分布都可以通过这种方式表示。然而,自回归语言模型的特点是**它可以利用例如前馈神经网络等方法有效计算出每个条件概率分布** $p(x_{i}∣x_{1:i−1})$ 。在自回归语言模型 $p$ 中生成整个序列 $x_{1:L}$ ,我们需要一次生成一个令牌(token),该令牌基于之前以生成的令牌进行计算获得: $$ \begin{aligned} @@ -105,7 +105,7 @@ $$ H(p) = \sum_x p(x) \log \frac{1}{p(x)}. $$ -熵实际上是**一个衡量将样本**$x∼p$\*\* 编码(即压缩)成比特串所需要的预期比特数的度量\*\*。举例来说,"the mouse ate the cheese" 可能会被编码成 "0001110101"。 +熵实际上是**一个衡量将样本 $x∼p$ 编码(即压缩)成比特串所需要的预期比特数的度量**。举例来说,"the mouse ate the cheese" 可能会被编码成 "0001110101"。 **熵的值越小,表明序列的结构性越强,编码的长度就越短。** 直观地理解,$\log \frac{1}{p(x)}$ 可以视为用于表示出现概率为 $p(x)$ 的元素 $x$ 的编码的长度。 diff --git "a/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/1.attention/1.attention.md" "b/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/1.attention/1.attention.md" index 066ba86..91709e1 100644 --- "a/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/1.attention/1.attention.md" +++ "b/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/1.attention/1.attention.md" @@ -83,11 +83,11 @@ Transformer Paper里重新用QKV定义了Attention。所谓的QKV就是Query,K 每个head是独立的注意力机制,它们可以学习不同类型的特征和关系。通过使用多个注意力头,Transformer可以并行地学习多种不同的特征表示,从而增强了模型的表示能力。 -然而,在使用多个注意力头的同时,注意力机制的计算复杂度也会增加。原始的Scaled Dot-Product Attention的计算复杂度为$O(d^2)$,其中d是输入向量的维度。如果使用h个注意力头,计算复杂度将增加到$O(hd^2)$。这可能会导致Transformer在处理大规模输入时变得非常耗时。 +然而,在使用多个注意力头的同时,注意力机制的计算复杂度也会增加。原始的Scaled Dot-Product Attention的计算复杂度为 $O(d^2)$,其中 $d$ 是输入向量的维度。如果使用 $h$ 个注意力头,计算复杂度将增加到 $O(hd^2)$。这可能会导致Transformer在处理大规模输入时变得非常耗时。 为了缓解计算复杂度的问题,Transformer中在每个head上进行降维。在每个注意力头中,输入向量通过线性变换被映射到一个较低维度的空间。这个降维过程使用两个矩阵:一个是查询(Q)和键(K)的降维矩阵$W_q$和$W_k$,另一个是值(V)的降维矩阵$W_v$。 -通过降低每个head的维度,Transformer可以在**保持较高的表达能力的同时,大大减少计算复杂度**。降维后的计算复杂度为$(h\hat d ^ 2)$,其中$\hat d$是降维后的维度。通常情况下,$\hat d$会远小于原始维度d,这样就可以显著提高模型的计算效率。 +通过降低每个head的维度,Transformer可以在**保持较高的表达能力的同时,大大减少计算复杂度**。降维后的计算复杂度为 $O(h\hat{d}^2)$,其中 $\hat{d}$ 是降维后的维度。通常情况下,$\hat{d}$ 会远小于原始维度 $d$,这样就可以显著提高模型的计算效率。 **2.2 transformer在哪里做了权重共享,为什么可以做权重共享?** @@ -179,7 +179,7 @@ BERT在第一句前会加一个 \[CLS] 标志,**最后一层该位对应向量 #### (1)MHA -从多头注意力的结构图中,貌似这个所谓的**多个头就是指多组线性变换层**,其实并不是,只有使用了一组线性变化层,即三个变换张量对Q,K,V分别进行线性变换,**这些变换不会改变原有张量的尺寸**,因此每个变换矩阵都是方阵,得到输出结果后,多头的作用才开始显现,每个头开始从词义层面分割输出的张量,也就是每个头都想获得一组Q,K,V进行注意力机制的计算,但是句子中的每个词的表示只获得一部分,也就是只分割了最后一维的词嵌入向量。这就是所谓的多头,将每个头的获得的输入送到注意力机制中, 就形成多头注意力机制. +概念上,每个 head 拥有独立的投影矩阵 $W_i^Q, W_i^K, W_i^V$(维度为 $d_{\text{model}} \times d_k$,其中 $d_k = d_{\text{model}} / h$),分别将输入投影到不同的低维子空间中做 attention。但在实现中,为了计算效率,通常**将所有 head 的投影合并成一个大矩阵**(维度为 $d_{\text{model}} \times d_{\text{model}}$),对 Q、K、V 各做一次线性变换,输出维度不变。然后**将输出沿最后一维(词嵌入维度)切分成 $h$ 份**,每份维度为 $d_k$,分配给各个 head。每个 head 拿到自己的一组 Q、K、V 后,独立做 scaled dot-product attention,最后将所有 head 的输出拼接起来,再经过一个线性层 $W^O$ 得到最终结果。这就是多头注意力机制。 Multi-head attention允许模型**共同关注来自不同位置的不同表示子空间的信息**,如果只有一个attention head,它的平均值会削弱这个信息。 @@ -188,8 +188,7 @@ MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O \\ where ~ head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) $$ -其中映射由权重矩阵完成:$W^Q_i \in \mathbb{R}^{d_{{model}} \times d_k} - $, $W^K_i \in \mathbb{R}^{d_{\text{model}} \times d_k}$, $W^V_i \in \mathbb{R}^{d_{\text{model}} \times d_v}$和$W^O_i \in \mathbb{R}^{hd_v \times d_{\text{model}} }$。 +其中映射由权重矩阵完成:$W^Q_i \in \mathbb{R}^{d_{\text{model}} \times d_k}$, $W^K_i \in \mathbb{R}^{d_{\text{model}} \times d_k}$, $W^V_i \in \mathbb{R}^{d_{\text{model}} \times d_v}$ 和 $W^O_i \in \mathbb{R}^{hd_v \times d_{\text{model}}}$。 ![](image/image_bfiZnT0f5w.png) @@ -201,9 +200,9 @@ $$ **为什么要做多头注意力机制呢**? -- 一个 dot product 的注意力里面,没有什么可以学的参数。具体函数就是内积,为了识别不一样的模式,希望有不一样的计算相似度的办法。加性 attention 有一个权重可学,也许能学到一些内容。 -- multi-head attention 给 h 次机会去学习 不一样的投影的方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的一些相似函数,然后把 h 个 heads 拼接起来,最后再做一次投影。 -- 每一个头 hi 是把 Q,K,V 通过 可以学习的 Wq, Wk, Wv 投影到 dv 上,再通过注意力函数,得到 headi。 +- Scaled dot-product attention 本身**没有可学习的参数**(就是固定的内积运算),无法适应不同的相似度计算需求。 +- Multi-head attention 通过 $h$ 组**可学习的投影矩阵** $W_i^Q, W_i^K, W_i^V$,将输入投影到 $h$ 个不同的子空间,让每个 head 学习不同的相似度模式(如语法关系、语义关系等)。 +- 最后将 $h$ 个 head 的输出拼接,再通过 $W^O$ 投影回原始维度,综合所有 head 学到的信息。 #### (2)MQA @@ -384,7 +383,10 @@ RNN 跟 transformer **同:语义空间的转换 + 关注点** **简单讲一下Transformer中的残差结构以及意义。** -- 就是ResNet的优点,解决梯度消失 +- Transformer 每个子层(Self-Attention、FFN)都使用残差连接:$\text{output} = \text{LayerNorm}(x + \text{SubLayer}(x))$ +- **解决梯度消失**:反向传播时 $\frac{\partial}{\partial x}[x + f(x)] = 1 + f'(x)$,无论 $f'(x)$ 多小,梯度始终有 "1" 保底,不会因层数增多而消失 +- **降低优化难度**:网络只需学习残差 $\Delta(x) \approx 0$(权重趋向零),比学习恒等映射 $F(x) = x$(权重趋向单位矩阵)容易得多 +- **信息直通**:底层特征通过跳跃连接直达高层,不会在深层传递中丢失 **为什么transformer块使用LayerNorm而不是BatchNorm?LayerNorm 在Transformer的位置是哪里?** diff --git "a/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/2.layer_normalization/2.layer_normalization.md" "b/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/2.layer_normalization/2.layer_normalization.md" index c8cfcc4..6828254 100644 --- "a/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/2.layer_normalization/2.layer_normalization.md" +++ "b/02.\345\244\247\350\257\255\350\250\200\346\250\241\345\236\213\346\236\266\346\236\204/2.layer_normalization/2.layer_normalization.md" @@ -18,9 +18,9 @@ - 沿着通道计算每个batch的均值 - 沿着通道计算每个batch的方差 - 做归一化 -- 加入缩放和平移变量$\gamma$和 $\beta$ +- 加入缩放和平移变量 $\gamma$ 和 $\beta$ -**加入缩放和平移变量的原因是:****保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练****。** 这两个参数是用来学习的参数。 +**加入缩放和平移变量的原因是:** **保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练**。这两个参数是用来学习的参数。 **BN的作用:** @@ -42,7 +42,7 @@ $$ \mathrm{y} = \frac{\mathrm{x} - \mathrm{E}(\mathrm{x})}{\sqrt{\text{Var}(\mathrm{x}) + \epsilon}} \cdot \gamma + \beta $$ -这里的 $x$ 可以理解为\*\* 张量中具体某一维度的所有元素\*\*,比如对于 shape 为 (2,2,4) 的张量 input,若指定归一化的操作为第三个维度,则会对第三个维度中的四个张量(2,2,1),各进行上述的一次计算. +这里的 $x$ 可以理解为**张量中指定归一化维度上的所有元素**。比如对于 shape 为 $(2,2,4)$ 的张量 input,若指定对最后一个维度(大小为 4)做归一化,则沿该维度取出 $2 \times 2 = 4$ 组长度为 4 的向量,每组独立计算均值和方差并归一化。 详细形式: @@ -89,7 +89,7 @@ $$ $$ #### 1.5 **Group Norm** -**GN是为了解决BN对较小的mini-batch size效果差的问题****。** ​ +**GN是为了解决BN对较小的mini-batch size效果差的问题。** GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batch size 只能是个位数,再大显存就不够用了。而当 batch size 是个位数时,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。GN 也是独立于 batch 的,它是 LN 和 IN 的折中。