当前位置: 首页 > news >正文

一文详解 transformer 中的 self-attention

无反馈,不学习 

要完全理解清楚transformer结构,就必须理解self-attention是怎么运作的。在transformer中,其最核心的改进就是引入了self-attention网络结构

一)self-attention网络结构

self-attention网络结构的作用如下图所示,其作用就是将输入的向量经过self-attention处理后输出相同数量,相同大小的向量。

但是需要注意的是,输出的b^{1} b^{2} b^{3} b^{4},并不是类似于普通的神经网络的处理和输出。 对应输出的b^{1} b^{2} b^{3} b^{4}是考虑了所有输入的全局信息得到的,可能是类似于语义信息等;暂且这里我们将其叫为是加了注意力的信息b^{1} b^{2} b^{3} b^{4}

1.1 如何给b^{1} b^{2} b^{3} b^{4}加注意力

self-attention给其加注意力信息。其做的第一件事情是计算了他们之间的相关性。

第一步:计算a^{1} a^{2} a^{3} a^{4}他们之间的相关性,至于怎么计算,这个问题先留着。

第二步:得到a^{1} a^{2} a^{3} a^{4}他们之间的相关性后的,以得到b^{1}举例,b^{1}的值就是被加入了注意力信息的值,b^{1}的值是根据a^{1} a^{1}a^{1} a^{2}a^{1} a^{3}a^{1} a^{4}之间的相关性(这里的相关性也被叫做注意力)去对应的a^{1} a^{2} a^{3} a^{4}中抽取信息,若a^{1} a^{2}之间的相关性(注意力)强,说明网络应该更加关注a^{2},即会根据得到的相关性抽取信息。至于如何抽取,也先留着。

1.2 计算a^{1} a^{2} a^{3} a^{4}他们之间的相关性

对于计算计算a^{1} a^{2} a^{3} a^{4}他们之间的相关性的方法有很多,这里讲解最常用的方式——Dot-product方式。

 假设要计算a^{1} a^{2}之间的注意力,首先第一步,将a^{1} ×上 W^{q} 矩阵 得到 q , 将a^{2} ×上 W^{k} 矩阵 得到 k,q 和 k 再进行点积运行算得到的就是a^{1} a^{2}之间的注意力。那 W^{q} 和 W^{k} 是什么呢?这里暂且默认W^{q} 和 W^{k}就是存在,通过上述运算就能得到二者的相关性。

1.3 如何根据注意力抽取重要信息

上诉只是得到了a^{1} a^{2}之间的注意力,我们继续来看下如何得到b^{1}

如上图所示, a^{1} a^{2} a^{3} a^{4}通过乘上 W^{q} 矩阵可以得到对应的q^{1} q^{2} q^{3} q^{4},同样的a^{1} a^{2} a^{3} a^{4}通过乘上 W^{k} 矩阵可以得到对应的k^{1} k^{2} k^{3} k^{4},得到了q 和 k 的值,进而通过Dot-product方式就可以计算得到对应的相关性,即a_{11}a_{12}a_{13}a_{14}。然后让 a_{11}a_{12}a_{13}a_{14} 通过softmax的处理,得到最后的相关性 a_{11}^{'}a_{12}^{'}a_{13}^{'}a_{14}^{'} 。 

 a^{1} a^{2} a^{3} a^{4}通过乘上 W^{v} 矩阵可以得到对应的v^{1} v^{2} v^{3} v^{4},这里暂且默认 W^{v}就是存在,这个时候就可以根据注意力 a_{11}^{'}a_{12}^{'}a_{13}^{'}a_{14}^{'} 去抽取重要信息 v^{1} v^{2} v^{3} v^{4} 了。

所以 b^{1} 计算公式如下:

 

同理,就也可以得到对应的b^{2} b^{3} b^{4}。 

至此,遗留的两个问题,计算a^{1} a^{2} a^{3} a^{4}他们之间的相关性和根据得到的相关性抽取重要信息已解决。现在我们唯一还不知道的是 W^{q} W^{k} W^{v} 到底是什么。其实还有一个小问题就是,在得到最后的注意力 a_{11}^{'}a_{12}^{'}a_{13}^{'}a_{14}^{'}的时候,我们是使用了一个softmax函数来进行处理,至于为什么要使用这个softmax函数来进行处理也是需要回答的,这里就不讲解了,只需要去深入了解一下softmax函数的作用即可理解。

二) 手动进行self-attention

以下三个输入向量,将其构成一个矩阵

X = [[1.0, 0.5, 2.0, 1.5],   # 猫[0.5, 2.0, 1.0, 0.0],   # 吃[1.5, 1.0, 0.5, 2.0]]   # 鱼

进行 self-attention的第一步就是计算输入向量对应的 k q v 。假设 W^{q} W^{k} W^{v} 如下所示。

W_q (4x3):[[0.5, 1, 0],[0,  0.5, 1],[1,  0,  0.5],[0.5, 0,  1]]W_k (4x3):[[1,  0,  0.5],[0.5, 1,  0],[0,  0.5, 1],[1,  0,  0.5]]W_v (4x4):[[0,  1,  0.5,  1],[1,  0.5, 0,  1],[0.5, 0,  1,  1],[0,  1,  0.5,  1]]

查询向量 q1 (输入向量为猫 [1.0, 0.5, 2.0, 1.5])

q1 = x1 * W_q

     = [1, 0.5, 2, 1.5] * [[0.5, 1, 0], [0, 0.5, 1], [1, 0, 0.5], [0.5, 0, 1]]

  • 计算第一个元素:1*0.5 + 0.5*0 + 2*1 + 1.5*0.5 = 0.5 + 0 + 2 + 0.75 = 3.25
  • 计算第二个元素:1*1 + 0.5*0.5 + 2*0 + 1.5*0 = 1 + 0.25 + 0 + 0 = 1.25
  • 计算第三个元素:1*0 + 0.5*1 + 2*0.5 + 1.5*1 = 0 + 0.5 + 1 + 1.5 = 3.0 

q1 = [3.25, 1.25, 3.0]

键向量 k1 (输入向量为猫 [1.0, 0.5, 2.0, 1.5]):

k1 = x1 * W_k 

     = [1, 0.5, 2, 1.5] * [[1, 0, 0.5], [0.5, 1, 0], [0, 0.5, 1], [1, 0, 0.5]]

  • 第一个元素:1*1 + 0.5*0.5 + 2*0 + 1.5*1 = 1 + 0.25 + 0 + 1.5 = 2.75

  • 第二个元素:1*0 + 0.5*1 + 2*0.5 + 1.5*0 = 0 + 0.5 + 1 + 0 = 1.5

  • 第三个元素:1*0.5 + 0.5*0 + 2*1 + 1.5*0.5 = 0.5 + 0 + 2 + 0.75 = 3.25

k1 = [2.75, 1.5, 3.25]

值向量 v1 (输入向量为猫 [1.0, 0.5, 2.0, 1.5])

v1 = x1 * W_v

    = [1, 0.5, 2, 1.5] * [[0, 1, 0.5, 1], [1, 0.5, 0, 1], [0.5, 0, 1, 1], [0, 1, 0.5, 1]]

  • 第一个元素:1*0 + 0.5*1 + 2*0.5 + 1.5*0 = 0 + 0.5 + 1 + 0 = 1.5

  • 第二个元素:1*1 + 0.5*0.5 + 2*0 + 1.5*1 = 1 + 0.25 + 0 + 1.5 = 2.75

  • 第三个元素:1*0.5 + 0.5*0 + 2*1 + 1.5*0.5 = 0.5 + 0 + 2 + 0.75 = 3.25

  • 第四个元素:1*1 + 0.5*1 + 2*1 + 1.5*1 = 1 + 0.5 + 2 + 1.5 = 5

v1 = [1.5, 2.75, 3.25, 5]

这里计算a_{11}的注意力 q_1 \cdot k_1 =  [3.25, 1.25, 3.0] \cdot [2.75, 1.5, 3.25] = 20.5625

同样的方式计算得到a_{12}a_{13}a_{14}的注意力,然后通过softmax的处理,得到最后的相关性 a_{11}^{'}a_{12}^{'}a_{13}^{'}a_{14}^{'} 。 然后在根据得到的相关性抽取重要信息 v^{1} v^{2} v^{3} v^{4}

在这里我们是假设了 W^{q} W^{k} W^{v} 矩阵的值,其实在真实的网络当中呢,其都是未知的参数,我们只定义它的大小,至于其内部的值都是作为未知参数待求的。

还有一个问题,为什么我们在假设 W^{v} 矩阵的时候,其大小是4×4的,而不是像 W^{q} W^{k}一样是4×3的呢?先说结论

由于输入向量是1×4的,为了能让矩阵能运算下去,其W^{q} W^{k} W^{v}必须是4行的,至于几列不影响能否计算,但W^{v}必须也是4列,因为要保证其输入向量经过self-attention处理输出后保持向量相同大小,至于为什么,是应为在transformer模型中,加入了残差连接,必须保证输入输出向量大小一致。

那为什么W^{q} W^{k} 可以是三列?其实对于W^{q} W^{k} 的列可以自由设定,但是W^{q} W^{k} 的列大小相同。

投影维度 (权重矩阵的列数)的影响
维度作用增大影响减小影响
W^{q} W^{k} 的列注意力分数的区分度✅ 提升细粒度关注能力
❌ 增加 QKᵀ 计算成本
⚠️ 可能丢失语义细节
✅ 降低内存占用
W^{v}  的列值向量的信息携带量✅ 增强上下文信息传递
❌ 增加输出计算量
⚠️ 可能压缩关键信息
✅ 加速输出生成

相关文章:

  • 数星星--二分
  • AI Agent全解析:定义、原理与B2B企业中的应用落地指南
  • 【Linux手册】进程终止:进程退出和信号的响应机制
  • C++面向对象-友元
  • CSS 与 JavaScript 加载优化
  • Java调用金蝶webApi保存接口修改数据
  • 无线USB转换器TOS-WLink的无线USB助手配置文件详细胡扯
  • Unreal引擎——Chaos物理引擎(不)详解
  • 【队列】----【Keep In Line】
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-116节(封装)
  • 国防科大刘丽教授团队提出了一种用于合成孔径雷达目标识别的解耦自监督子空间分类器|TGRS
  • C++11新库特性:从入门到精通
  • 《Opto-Electronic Advances》热点论文速览(2025)
  • 【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示
  • react + ant-design实现数字对比动画效果:当新获取的数字比之前展示的数字多或少2时,显示“+2”或“-2”的动画效果
  • A模块 系统与网络安全 第三门课 网络通信原理-2
  • 《二分枚举答案(最值问题)》题集
  • 3.web逆向之开发者工具调试
  • Spring Cloud 微服务(服务注册与发现原理深度解析)
  • VUE使用过程中的碰到问题记录