第一章:人工智能之不同数据类型及其特点梳理
第二章:自然语言处理(NLP):文本向量化从文字到数字的原理
第三章:循环神经网络RNN:理解 RNN的工作机制与应用场景(附代码)
第四章:循环神经网络RNN、LSTM以及GRU 对比(附代码)
第五章:理解Seq2Seq的工作机制与应用场景中英互译(附代码)
第六章:深度学习架构Seq2Seq-添加并理解注意力机制(一)
第七章:深度学习架构Seq2Seq-添加并理解注意力机制(二)
第八章:深度学习模型Transformer初步认识整体架构
第九章:深度学习模型Transformer核心组件—自注意力机制
第十章:理解梯度下降、链式法则、梯度消失/爆炸
第十一章:Transformer核心组件—残差连接与层归一化
假设我们有一个想要翻译的输入句子:“这只动物没有穿过街道,因为它太累了。”
这句话中的“它”指的是什么?是指“街道”还是“动物”呢?对于人类来说,这是一个简单的问题,但对于算法而言则不然。
当模型处理到单词“它”时,自注意力机制允许模型将“它”与“动物”关联起来。
当模型处理每个单词(即输入序列中的每个位置)时,自注意力机制允许模型查看输入序列中的其他位置,以寻找有助于为该单词生成更好编码的线索。
如果你对RNN(循环神经网络)有所了解,可以想想维持隐藏状态是如何让RNN将其对之前处理过的词或向量的表示与当前正在处理的词结合起来的。自注意力就是Transformer用来将其他相关词的理解融入到当前正在处理的词中的方法。
一、自注意力机制工作原理
自注意力机制(Self-Attention),也称为内部注意力机制(Intra-Attention),是Transformer模型的核心组成部分。它允许模型在处理序列数据时,能够考虑到序列中不同位置之间的关系,从而有效地捕捉长距离依赖。
-
输入表示:假设我们有一个输入序列 X = ( x 1 , x 2 , . . . , x n ) X = (x_1, x_2, ..., x_n) X=(x1,x2,...,xn),其中每个 x i x_i xi都是一个向量(例如词嵌入)。
-
线性变换:对输入序列中的每个元素应用三个不同的线性变换(通过学习得到的权重矩阵),生成查询(Query)、键(Key)和值(Value)向量:
- 查询向量 Q = X W Q Q = XW_Q Q=XWQ
- 键向量 K = X W K K = XW_K K=XWK
- 值向量 V = X W V V = XW_V V=XWV
其中, W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 是模型需要学习的参数矩阵。
-
计算注意力分数:对于序列中的每个位置 i i i,使用 Q K ⊤ QK^\top QK⊤
点积来计算当前位置与其他所有位置之间的相似度(即注意力分数Score)。
这可以通过以下公式完成:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
这里, d k d_k dk 是键向量的维度,分母中的 d k \sqrt{d_k} dk 用于缩放,避免点积结果过大导致softmax函数饱和。
-
加权求和:根据计算出的注意力分数,为每个位置的值向量分配权重,并进行加权求和,得到输出序列 Z Z Z。
二、自注意力推导示例
假设输入序列为两个词,维度 d k = 3 d_k=3 dk=3:
X = [ 1 0 1 0 1 1 ] , W Q = [ 1 0 0 1 1 0 ] , W K = [ 0 1 1 0 0 1 ] , W V = [ 1 1 0 1 1 0 ] X = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \\ \end{bmatrix}, \quad W^Q = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 0 \\ \end{bmatrix}, \quad W^K = \begin{bmatrix} 0 & 1 \\ 1 & 0 \\ 0 & 1 \\ \end{bmatrix}, \quad W^V = \begin{bmatrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \\ \end{bmatrix} X=[100111],WQ= 101010 ,WK= 010101 ,WV= 101110
-
计算 Q、K、V:
Q = X W Q = [ 2 0 1 1 ] , K = X W K = [ 1 2 1 1 ] , V = X W V = [ 2 1 1 1 ] Q = XW^Q = \begin{bmatrix} 2 & 0 \\ 1 & 1 \end{bmatrix}, \quad K = XW^K = \begin{bmatrix} 1 & 2 \\ 1 & 1 \end{bmatrix}, \quad V = XW^V = \begin{bmatrix} 2 & 1 \\ 1 & 1 \end{bmatrix} Q=XWQ=[2101],K=XWK=[1121],V=XWV=[2111] -
计算注意力分数:
Q K ⊤ 3 = 1 3 [ 4 2 2 2 ] \frac{QK^\top}{\sqrt{3}} = \frac{1}{\sqrt{3}} \begin{bmatrix} 4 & 2 \\ 2 & 2 \end{bmatrix} 3QK⊤=31[4222] -
Softmax 归一化:
Softmax ( [ 4 / 3 2 / 3 2 / 3 2 / 3 ] ) ≈ [ 0.88 0.12 0.5 0.5 ] \text{Softmax}\left(\begin{bmatrix} 4/\sqrt{3} & 2/\sqrt{3} \\ 2/\sqrt{3} & 2/\sqrt{3} \end{bmatrix}\right) \approx \begin{bmatrix} 0.88 & 0.12 \\ 0.5 & 0.5 \end{bmatrix} Softmax([4/32/32/32/3])≈[0.880.50.120.5] -
加权求和:
Attention ( Q , K , V ) = [ 0.88 0.12 0.5 0.5 ] @ [ 2 1 1 1 ] = [ 0.88 × 2 + 0.12 × 1 0.88 × 1 + 0.12 × 1 0.5 × 2 + 0.5 × 1 0.5 × 1 + 0.5 × 1 ] = [ 1.88 1.0 1.5 1.0 ] \text{Attention}(Q, K, V) =\begin{bmatrix} 0.88 & 0.12 \\ 0.5 & 0.5 \end{bmatrix} @ \begin{bmatrix} 2 & 1 \\ 1 & 1 \end{bmatrix}= \begin{bmatrix} 0.88 \times 2 + 0.12 \times 1 & 0.88 \times 1 + 0.12 \times 1 \\ 0.5 \times 2 + 0.5 \times 1 & 0.5 \times 1 + 0.5 \times 1 \end{bmatrix} = \begin{bmatrix} 1.88 & 1.0 \\ 1.5 & 1.0 \end{bmatrix} Attention(Q,K,V)=[0.880.50.120.5]@[2111]=[0.88×2+0.12×10.5×2+0.5×10.88×1+0.12×10.5×1+0.5×1]=[1.881.51.01.0]
W Q W^Q WQ 和 W K W^K WK和 W V W^V WV,这三个 W W W 怎么得来的,有什么作用,为什么要和 X 分别相乘
三、如何得到 W Q W^Q WQ 、 W K W^K WK 和 W V W^V WV
-
初始化与学习:这些权重矩阵通常是在训练开始时随机初始化的,并通过反向传播算法在训练过程中不断调整以最小化损失函数。换句话说,它们是通过训练过程自动学习得到的,目的是为了优化模型在特定任务上的性能。
-
作用:
- W Q W^Q WQ (Query Weight Matrix):用于将输入向量 X X X转换为查询向量 Q Q Q。查询向量代表了对于某个位置的信息“查询”或需求。
- W K W^K WK (Key Weight Matrix):用于将输入向量 X X X转换为键向量 K K K。键向量是用来与查询向量进行比较,以确定哪些部分的信息是相关的。
- W V W^V WV (Value Weight Matrix):用于将输入向量 X X X转换为值向量 V V V。值向量包含了实际的内容信息,这些信息将根据注意力分数被加权组合。
四、 W Q W^Q WQ 、 W K W^K WK 和 W V W^V WV为什么要与 X X X 分别相乘
-
不同视角的理解:通过使用不同的权重矩阵将相同的输入向量 X X X映射到不同的空间,模型可以从多个角度理解输入数据。例如,一个单词在一个句子中可能扮演多种角色(如主语、宾语等),通过不同的变换可以捕捉到这些多样的信息。
-
增强表达能力:这种机制极大地增强了模型的表达能力。因为即使面对相同的输入,通过不同的权重矩阵可以产生多样化的输出,从而使得模型能够更灵活地捕捉序列中的复杂模式和依赖关系。
-
实现自我关注机制:在自注意力机制中, Q Q Q和 K K K之间的交互(即点积操作)用于衡量输入序列中各元素间的相关性或相似度。然后,基于这些相似度得分对 V V V进行加权求和,以生成每个位置的新表示。这样做的好处是可以让模型在构建每个位置的表示时考虑到整个序列的信息,而不是仅仅局限于局部邻域内的信息。
总之, W Q W^Q WQ、 W K W^K WK和 W V W^V WV的存在是为了将输入向量映射到不同的表示空间,从而使得模型能够在计算自注意力时从多个维度理解输入数据。这一过程不仅提高了模型处理序列数据的能力,还使其能够有效地捕捉长距离依赖关系。
五、Q为什么要和 K 的转置 K T K^T KT求点积
(Q)与 K T K^T KT(即键(K)的转置)点积这一操作是为了计算注意力分数,也就是衡量输入序列中各个元素之间的相似度或关联程度。
-
计算相似度:在自注意力机制中,我们需要一种方法来量化序列中每个位置与其他所有位置之间的相关性或相似度。通过将查询向量 Q Q Q 与键向量 K K K 的转置 K T K^T KT 求点积,我们可以得到一个矩阵,其中每个元素代表了一个位置的查询向量与另一个位置的键向量之间的点积。这个点积可以看作是一种相似度得分,表示两个向量方向上的接近程度。
-
维度匹配:假设我们有一个输入序列长度为 n n n,每个位置对应的向量维度为 d k d_k dk 。那么, Q Q Q 和 K K K 都是形状为 [ n , d k ] [n, d_k] [n,dk] 的矩阵。为了使 Q Q Q 中的每个查询向量能够与 K K K 中的每个键向量进行比较,我们需要将 K K K 转置成形状为 [ d k , n ] [d_k, n] [dk,n] 的矩阵。这样,当执行 Q × K T Q \times K^T Q×KT 时,结果就是一个形状为 [ n , n ] [n, n] [n,n] 的矩阵,其中每个元素 A i j A_{ij} Aij 表示第 i i i 个位置的查询向量与第 j j j 个位置的键向量之间的相似度得分。
-
生成注意力权重:一旦得到了相似度得分矩阵,接下来会通过softmax函数将其转换为概率分布,这些概率就是所谓的“注意力权重”。它们决定了在计算最终输出时,每个位置的值向量 V V V 应该被赋予多少权重。换句话说,它决定了哪些位置的信息对于当前位置最为重要。
-
加权求和得到输出:最后,使用上述获得的注意力权重对值向量 V V V 进行加权求和,从而产生新的表示形式,该表示综合了整个序列的信息,并且更加侧重于那些被认为更重要的位置。
综上所述, Q Q Q 与 K T K^T KT 点积是自注意力机制中用于计算输入序列中各个元素之间相似度的核心步骤。这一步骤允许模型动态地评估并整合来自序列内不同位置的信息,从而捕捉到复杂的模式和依赖关系。
六、 Q K ⊤ QK^\top QK⊤为什么要除以 d k \sqrt{d_k} dk
防止梯度过大或过小
-
梯度消失或爆炸问题:当输入向量的维度较高时,点积的结果可能会非常大或者非常小。这会导致softmax函数的输出变得极端(接近0或1),从而引发梯度消失或梯度爆炸的问题。这是因为softmax函数对输入的尺度非常敏感,特别是在其输入值较大或较小时。
-
归一化效果:通过除以 d k \sqrt{d_k} dk,可以有效地将点积的结果控制在一个合理的范围内。这样做有助于保持softmax函数输入值的稳定性,使其不会因为输入过大而饱和到极端值,也不会因为输入过小而导致所有输出几乎相同的情况。
实践中的影响
- 训练稳定性:适当缩放可以提高训练过程的稳定性,使得模型更容易收敛。
- 性能提升:通过这种方式,可以改善模型的表现,因为它有助于维持每一层输入的尺度一致,避免了某些层的激活值过于膨胀或收缩。
示例数据
第一组:未缩放时 - 注意力权重趋向极端分布
假设我们有如下输入序列,每个词被表示为一个4维向量,并且这些向量之间的差异较大:
- x 1 = [ 1 , 2 , 3 , 4 ] x_1 = [1, 2, 3, 4] x1=[1,2,3,4]
- x 2 = [ 5 , 6 , 7 , 8 ] x_2 = [5, 6, 7, 8] x2=[5,6,7,8]
- x 3 = [ 9 , 10 , 11 , 12 ] x_3 = [9, 10, 11, 12] x3=[9,10,11,12]
这些向量通过线性变换得到查询 Q Q Q、键 K K K(这里为了简化,直接使用原始向量作为 Q Q Q和 K K K)。
计算 Q K ⊤ QK^\top QK⊤:
Q K ⊤ = [ 1 2 3 4 5 6 7 8 9 10 11 12 ] [ 1 5 9 2 6 10 3 7 11 4 8 12 ] = [ 30 70 110 70 174 278 110 278 446 ] QK^\top = \begin{bmatrix} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \end{bmatrix} \begin{bmatrix} 1 & 5 & 9 \\ 2 & 6 & 10 \\ 3 & 7 & 11 \\ 4 & 8 & 12 \end{bmatrix} = \begin{bmatrix} 30 & 70 & 110 \\ 70 & 174 & 278 \\ 110 & 278 & 446 \end{bmatrix} QK⊤= 159261037114812 123456789101112 = 307011070174278110278446
应用Softmax函数到每一行上,得到注意力权重矩阵:
softmax ( Q K ⊤ ) ≈ [ 0.001 0.018 0.981 0.000 0.002 0.998 0.000 0.000 1.000 ] \text{softmax}(QK^\top) \approx \begin{bmatrix} 0.001 & 0.018 & 0.981 \\ 0.000 & 0.002 & 0.998 \\ 0.000 & 0.000 & 1.000 \end{bmatrix} softmax(QK⊤)≈ 0.0010.0000.0000.0180.0020.0000.9810.9981.000
可以看到,在这种情况下,未经缩放的点积结果导致了非常极端的注意力权重分布。特别是对于第三个位置,几乎所有的注意力都集中在自身上,而忽略了其他位置的信息。
第二组:缩放后 - 权重分布更平缓
现在考虑相同的输入序列,但在计算 Q K ⊤ QK^\top QK⊤后除以 d k \sqrt{d_k} dk,其中 d k = 4 d_k=4 dk=4,因此缩放因子是 1 2 \frac{1}{2} 21。
重新计算 Q K ⊤ / d k QK^\top/\sqrt{d_k} QK⊤/dk:
Q K ⊤ d k = 1 2 × [ 30 70 110 70 174 278 110 278 446 ] = [ 15 35 55 35 87 139 55 139 223 ] \frac{QK^\top}{\sqrt{d_k}} = \frac{1}{2} \times \begin{bmatrix} 30 & 70 & 110 \\ 70 & 174 & 278 \\ 110 & 278 & 446 \end{bmatrix} = \begin{bmatrix} 15 & 35 & 55 \\ 35 & 87 & 139 \\ 55 & 139 & 223 \end{bmatrix} dkQK⊤=21× 307011070174278110278446 = 153555358713955139223
接着应用Softmax函数到每一行上,得到调整后的注意力权重矩阵:
softmax ( Q K ⊤ d k ) ≈ [ 0.011 0.269 0.720 0.002 0.092 0.906 0.000 0.024 0.976 ] \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) \approx \begin{bmatrix} 0.011 & 0.269 & 0.720 \\ 0.002 & 0.092 & 0.906 \\ 0.000 & 0.024 & 0.976 \end{bmatrix} softmax(dkQK⊤)≈ 0.0110.0020.0000.2690.0920.0240.7200.9060.976
对比与解释
-
未缩放的情况:在第一组的例子中,由于点积结果非常大,导致Softmax输出的概率分布极其不均衡,某些位置几乎完全占据了注意力权重,这不利于模型学习序列中的复杂依赖关系。
-
缩放的情况:第二组的数据展示了当应用缩放因子后,Softmax函数产生的概率分布更加平滑。虽然第三个位置仍然获得了较高的注意力权重,但相比于未缩放情况下的极端分布,这里的权重分布明显更加合理和平缓,允许模型更好地捕捉不同位置之间的关系。
七、不缩放为什么会导致梯度消失?
-
Softmax函数的导数:
Softmax函数的导数依赖于其自身的输出。具体来说,如果某个位置的Softmax输出接近1,则该位置对应的梯度将会很小,因为Softmax函数在其输出接近1的地方几乎是平坦的。相反,对于那些输出接近0的位置,其梯度也会非常小,因为这些位置对最终输出的影响微乎其微。 -
梯度传播:
在反向传播过程中,梯度通过网络层逐层传递。如果某一层的激活值(在这里是Softmax的输出)导致梯度变得非常小,那么这一小部分梯度将被进一步传播到前面的层,导致前层接收到的用于参数更新的信号极其微弱。这种情况称为“梯度消失”。 -
极端分布的影响:
当注意力权重分布极为不均衡(例如,一个位置几乎占据了所有注意力,而其他位置的注意力权重接近0),这会导致大部分路径上的梯度变得极小。由于梯度是参数更新的关键依据,过小的梯度意味着模型难以有效调整其权重以适应训练数据,从而可能导致训练停滞或者学习速度显著减慢。
上面的例子,未缩放的情况
softmax ( Q K ⊤ ) ≈ [ 0.001 0.018 0.981 0.000 0.002 0.998 0.000 0.000 1.000 ] \text{softmax}(QK^\top) \approx \begin{bmatrix} 0.001 & 0.018 & 0.981 \\ 0.000 & 0.002 & 0.998 \\ 0.000 & 0.000 & 1.000 \end{bmatrix} softmax(QK⊤)≈ 0.0010.0000.0000.0180.0020.0000.9810.9981.000
在这种情况下,我们可以观察到第三行的注意力权重几乎完全集中在最后一个位置(即权重为1.000)。这意味着对于第三个位置,它几乎不会考虑来自其他位置的信息,这不仅限制了模型捕捉长距离依赖的能力,而且由于Softmax输出接近1,其梯度也将非常小。具体来说:
- 对于第三行,Softmax输出为[0.000, 0.000, 1.000],这意味着在反向传播过程中,对于第一和第二位置,由于它们的注意力权重接近0,所以从损失函数回传到这两个位置的梯度也非常小。
- 同样地,对于那些获得较高注意力权重的位置(如第三个位置),尽管它们会接收到来自后续层的一些梯度信息,但由于Softmax在其输出接近1的区域几乎是平坦的,因此这部分梯度也非常有限。
这种现象在整个网络中传播时,会导致前面的层接收到的梯度信号极其微弱,进而导致梯度消失问题,使得模型难以有效地更新其参数。
八、为什么是除以 d k \sqrt{d_k} dk,不是其他其他变量或者数字
在Transformer模型中,将查询(Q)和键(K)的点积结果除以 d k \sqrt{d_k} dk的主要原因是为了控制点积的方差,防止因维度 d k d_k dk增大导致Softmax函数输入值过大而引发的梯度消失问题。
1. 数学推导:点积的方差分析
假设查询向量 Q Q Q和键向量 K K K的每个元素是独立同分布的随机变量,均值为0,方差为1:
E [ Q i ] = E [ K j ] = 0 , Var ( Q i ) = Var ( K j ) = 1. \mathbb{E}[Q_i] = \mathbb{E}[K_j] = 0, \quad \text{Var}(Q_i) = \text{Var}(K_j) = 1. E[Qi]=E[Kj]=0,Var(Qi)=Var(Kj)=1.
则点积 Q ⋅ K = ∑ i = 1 d k Q i K i Q \cdot K = \sum_{i=1}^{d_k} Q_i K_i Q⋅K=∑i=1dkQiKi的方差为:
Var ( Q ⋅ K ) = ∑ i = 1 d k Var ( Q i K i ) ( 独立项方差相加 ) = d k ⋅ E [ Q i 2 K i 2 ] ( 因 E [ Q i ] = E [ K i ] = 0 ) = d k ⋅ Var ( Q i ) Var ( K i ) ( 独立性 ) = d k ⋅ 1 ⋅ 1 = d k . \begin{aligned} \text{Var}(Q \cdot K) &= \sum_{i=1}^{d_k} \text{Var}(Q_i K_i) \quad (\text{独立项方差相加}) \\ &= d_k \cdot \mathbb{E}[Q_i^2 K_i^2] \quad (\text{因}\ \mathbb{E}[Q_i] = \mathbb{E}[K_i] = 0) \\ &= d_k \cdot \text{Var}(Q_i) \text{Var}(K_i) \quad (\text{独立性}) \\ &= d_k \cdot 1 \cdot 1 = d_k. \end{aligned} Var(Q⋅K)=i=1∑dkVar(QiKi)(独立项方差相加)=dk⋅E[Qi2Ki2](因 E[Qi]=E[Ki]=0)=dk⋅Var(Qi)Var(Ki)(独立性)=dk⋅1⋅1=dk.
结论:点积的方差与维度 d k d_k dk成正比,即维度越大,点积值的波动范围越大。
2. Softmax函数的敏感性
Softmax函数对输入值的绝对大小非常敏感。当输入值 z i z_i zi的绝对值较大时,输出会趋向于极端值(如0或1),导致梯度消失:
Softmax ( z i ) = e z i ∑ j e z j , ∂ Softmax ( z i ) ∂ z j = Softmax ( z i ) ( δ i j − Softmax ( z j ) ) . \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}, \quad \frac{\partial \text{Softmax}(z_i)}{\partial z_j} = \text{Softmax}(z_i)(\delta_{ij} - \text{Softmax}(z_j)). Softmax(zi)=∑jezjezi,∂zj∂Softmax(zi)=Softmax(zi)(δij−Softmax(zj)).
若某个 z i z_i zi远大于其他值, Softmax ( z i ) ≈ 1 \text{Softmax}(z_i) \approx 1 Softmax(zi)≈1,梯度趋近于零,阻碍参数更新。
3. 缩放因子的选择
为了稳定点积的方差,需将点积结果缩放,使其方差与 d k d_k dk无关。由于点积的方差为 d k d_k dk,标准差为 d k \sqrt{d_k} dk,因此选择除以 d k \sqrt{d_k} dk:
Scaled Dot-Product = Q K ⊤ d k . \text{Scaled Dot-Product} = \frac{QK^\top}{\sqrt{d_k}}. Scaled Dot-Product=dkQK⊤.
效果:
- 方差归一化:缩放后的方差为 d k ( d k ) 2 = 1 \frac{d_k}{(\sqrt{d_k})^2} = 1 (dk)2dk=1,与维度无关。
- 数值稳定:无论 d k d_k dk多大,点积值被限制在合理范围内,避免Softmax输入过大。
- 梯度保留:Softmax输出的分布更平缓,保留有效的梯度流动。
4. 为什么不是其他缩放方式?
-
除以 d k d_k dk:
- 方差变为 d k d k 2 = 1 d k \frac{d_k}{d_k^2} = \frac{1}{d_k} dk2dk=dk1,随维度增加急剧减小,导致数值过小。
- 引发梯度不稳定,尤其在高维度下。
-
使用常数(如2):
- 无法适应不同维度的模型,导致低维时缩放不足,高维时缩放过度。
-
其他函数(如 log d k \log d_k logdk):
- 缺乏数学依据,增加复杂性且无实际收益。
选择 d k \sqrt{d_k} dk的优势:
- 直接对应于点积的标准差,数学上自然。
- 保持方差恒为1,适应任意维度。
- 实现简单,计算高效。
5. 实际训练验证
- 未缩放时:当 d k = 64 d_k=64 dk=64,点积值可能达到数十或数百,Softmax输出接近one-hot,梯度消失。
- 缩放后:点积值被限制在 [ − 8 , + 8 ] [-8, +8] [−8,+8](假设原始值在 [ − 64 , + 64 ] [-64, +64] [−64,+64]),Softmax输出保留合理分布(如 [ 0.7 , 0.2 , 0.1 ] [0.7, 0.2, 0.1] [0.7,0.2,0.1]),梯度有效传播。
操作 | 数学意义 | 实际影响 |
---|---|---|
计算 Q K ⊤ QK^\top QK⊤ | 衡量相似度 | 生成原始注意力分数 |
除以 d k \sqrt{d_k} dk | 标准差归一化 | 稳定数值范围,防止梯度消失 |
应用Softmax | 概率归一化 | 生成注意力权重 |
关键结论:
除以 d k \sqrt{d_k} dk是唯一能同时满足以下条件的缩放方式:
- 方差稳定:控制点积方差为1,与维度无关。
- 计算高效:无需复杂运算,直接缩放。
- 训练友好:确保Softmax输入在合理范围,保留梯度流动性。
九、总结
自注意力机制让Transformer能够灵活地处理序列数据中的每一个元素,并且可以同时考虑整个序列的信息,这对于理解句子结构、捕捉长距离依赖关系等非常有帮助。此外,由于其并行化特性,相较于RNN/LSTM等序列模型,Transformer在处理长序列时更加高效。