--- created: 2025-08-03 21:19:11 tags: - "Research" - "基础" - "Transformer" - "Self-Attention" - "注意力机制" --- #Attention #Transformer ## 0. 参考资料 \[1][全网最通俗易懂的 Self-Attention自注意力机制 讲解\_self attention机制-CSDN博客](https://blog.csdn.net/qq_38890412/article/details/120601834)(非常好的博客, 凭借这篇博客对SA有了新的认识) \[2][深度学习:自注意力机制(Self-Attention)\_self attention-CSDN博客](https://blog.csdn.net/lsb2002/article/details/134877842) \[3][Attention注意力机制与self-attention自注意力机制](https://zhuanlan.zhihu.com/p/265108616) \[4][Illustrated: Self-Attention. A step-by-step guide to self-attention… | by Raimi Karim | Towards Data Science](https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a) \[5][Attention机制详解(二)——Self-Attention与Transformer](https://zhuanlan.zhihu.com/p/47282410) ## 1. 解决的问题 例如之前学过的[[CNN-卷积层, 池化层 与 全连接层|CNN]], 它只能提取到一定[[感受野(receptive field)|感受野]]大小的特征, 而对于计算范围之外的特征, 它很难考虑到. 想要获取更大的特征, 就需要叠加多个卷积层来扩大感受野 而SA允许模型**在处理 *序列数据* 时**, (话说图像怎么转化为序列?) **关注序列内部 *不同位置之间的关系* , 捕捉内部的复杂依赖关系.** 因此, SA能够建立 **全局的**依赖关系, **扩大图像的感受野**, 这意味着SA可以获取更多的上下文信息. ## 2. 优势 SA在 *序列处理* 领域中有着非常好的改进 (相较于以往的RNN和LSTM而言). - 能够捕获**长距离**依赖: 自注意力机制不受序列长度的限制,可以更好地处理长序列数据。 - **并行计算**: 允许并行处理序列中的所有元素,提高计算效率。 - 动态权重: 自注意力机制为每个输入位置生成不同的权重,这些权重是动态计算的,基于输入序列的当前内容,使得模型能够自适应地关注重要的输入部分。 ## 3. 实现方法 首先来看在论文中提到的Attention的核心公式: $$Attention(Q,K,V)=softmax(\frac {QK^T} {\sqrt {d_ {k}}})V$$ 抛开细节而言, 就是两个向量相乘, 然后做一个类似是 *normalization* 的操作, 也就是除以一个向量的平方根, 将算出来的向量进行一个 *softmax* 处理, 最后再和另一个向量相乘. 如果我们先抛开$QKV$这三个莫名其妙的矩阵不谈, 那么就可以抽象成这个样子: $$softmax(XX^T)X$$ (为啥吧除以$\sqrt d_k$给去掉了? 因为他在这里起到的是一个normalization的作用, 将我们的结果投射到一个更好的范围内, 而没有参与本质的计算, 但是其也是有作用的, 后面会提到) ### 3.1 内积 首先, $XX^T$, 一个矩阵乘以它的*转置*, 会得到什么呢? 我们知道, 矩阵可以看作由一些向量组成, 一个矩阵乘以它自己的转置的运算, 就可以看作 *这些向量与其他向量计算**内积*** . (对于两个向量$\overrightarrow {a}=(a_{1}, a_{2},\cdots ,a_{n})$和$\overrightarrow {b}=(b_{1}, b_{2},\cdots ,b_{n})$,它们的内积(也称为点积或数量积)定义为 $\overrightarrow {a} \cdot \overrightarrow {b} = \sum _{i=1} ^n= a_{1}b_{1}+ a_{2}b_ {2}+ \cdots + a_{n}b_ {n}$) 第一行乘以第一列、第一行乘以第二列......矩阵转置以后第一行不就是第一列吗?这是在计算**第一个行向量与自己**的内积,第一行乘以第二列是计算**第一个行向量与第二个行向量的内积**第一行乘以第三列是计算**第一个行向量与第三个行向量的内积**..... 然后回到上面提出的问题, **向量的内积**, 它的 *几何意义* 是什么? A: *两个向量的**夹角***, *一个向量在另一个向量上的**投影***. 我们假设$X=[x^T_1 \cdot x^T_2 \cdot x^T_3]$ , 其中$X$为一个二维矩阵, $X_i^T$为一个**行向量**(为了在示例中方便理解所以选用行向量). 首先,行向量$X^T_i$分别与自已和其他两个行向量做内积,得到了一个新的向量。我们回想前文提到的向量的内积表征两个向量的夹角,表征一个向量在另一个向量上的投影。那么新的向量有什么意义呢?是行向量在自己和其他两个行向量上的投影。**投影值大或小**又有什么意义呢? 投影值大, 说明**两个向量相关度高**. 更进一步,这两个向量是词向量,是词在高维空间的数值映射。词向量之间相关度高表示什么?是不是在*一定程度上*(不是完全)表示,在关注词A的时候,**应给予词B更多的关注**? 上面只是计算出了一个行向量, 那么$XX^T$计算出来的新矩阵的意义是什么呢? 矩阵$XX^T$是一个方阵,我们以行向量的角度理解,里面保存了每个向量和自己与其他向量进行内积 运算的结果。 (具体计算的示例可以参考[博客里的计算](https://blog.csdn.net/qq_38890412/article/details/120601834)) ### 3.2 Softmax 得到了$XX^T$的意义, 我们现在再来探究一下套在它外面的softmax有什么作用. 首先我们都知道, softmax的意义就是**归一化** ![image.png|313](https://raw.githubusercontent.com/student-zsbd/myImageHost/master/softmax.png) 结合上图的理解,softmax之后,这些数字的和为1了,那么attention的核心机制是什么?那不就是**加权求和**么?那么权重怎么来的呢?就是这些归一化之后的数字。当我们关注“早”这个字的时候,我们应该分配0.4的注意力(attention)给它本身,剩下0.4的注意力给“上”,最后的0.2的注意力给“好”。 然而, 在Attention的公式中, 在softmax之后的矩阵, 我们还乘以了另一个$X$矩阵, 这又表示了什么呢? 具体的实例还是参考一下[这篇博客](https://blog.csdn.net/qq_38890412/article/details/120601834), 观察其示例的图, 行向量与$X$的第一个列向量相乘, 得到一个新的行向量, 且这个行向量与$X$的维度相同. 在新的向量中, 每一个维度的数值都是由(示例中的)三个词向量在这一维度的数值加权求和得来的. 所以这个新的行向量就是"早"这个词向量**经过注意力机制加权就和之后的表示**. ### 3.3 QKV矩阵 由于$XX^T$所代表的两向量的投影更能代表所谓注意力的本质, 所以在上面的分析中并没有涉及到$QKV$矩阵. 实际上, $QKV$矩阵都分别来源于$X$与$W^i$矩阵的乘积, 本质上都是$X$的 *线性变换* . (所以上面用$X$直接代替$QKV$矩阵不会影响我们的分析). 那么为什么要对$X$进行线性变换呢? 当然是为了提升**模型的拟合能力**, 矩阵$W^i$都是 **可以训练** 的, 起到一个 *缓冲* (?) 的效果 ![image.png|500](https://raw.githubusercontent.com/student-zsbd/myImageHost/master/QKV_matrix.png) 加入了$QKV$之后的计算可以参考[这篇博客中的示例](https://jalammar.github.io/illustrated-transformer/), 再结合上面提到的 *向量内积和相关性* 的思想, 可以有更加具体且清晰的认识 ### 3.4 $\sqrt d_k$的意义 假设$Q,K$都服从均值为0,方差为1的*标准高斯分布*,那么$A^T=Q^TK$中元素的均值为0,方差为d。 当d变得很大时,A中的元素的方差也会变得很大, 那么$Softmax(A)$的分布就会变得陡峭结(分布方差大,分布集中在绝对值大的区域) 总结一下就是$Softmax(A)$的分布会和d有关。因此A中每个元素除以$\sqrt d_k$后,方差又变为了1。这使得$Softmax(A)$的分布的陡峭程度和d成功解耦,从而使得Transformer在训练过程中的梯度值保持稳定。 ~~嗯, 完全没有看懂~~