通俗理解Transformer(自注意力, self-attention)

本文通过实例详细讲解了Transformer中的self-attention机制,展示了如何通过计算key、query和value来捕捉全局信息及并行计算。重点介绍了注意力得分的计算过程和softmax的应用,强调了Attention在NLP和CV中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原作者:Raimi Karim   出处:Towards Data Science 

原译者:Black先森       出处: 个人博客 

本文对部分丢失的图片进行了补全,其他内容均全文转载自原译者个人博客。


谷歌在2017年发表了一篇论文《Attention Is All You Need》,论文中提出了transformer模型,其核心就是self-attention的架构,这一突破性成果不仅洗遍了NLP的任务,也在CV中取得了非常好的效果,有大道至简的感觉。本文通过一个通俗易懂的例子[1]来介绍self-attention。

介绍

接下来将通过以下几个步骤来介绍:

  1. 预处理输入数据
  2. 初始化权重
  3. 计算key,query 和value
  4. 计算输入值的注意力得分
  5. 计算softmax层
  6. 注意力得分与value相乘
  7. 对6中结果加权求和,并得到第一个输出值
  8. 重复4-7,计算其余输入数据的输出值

预处理输入数据

本例中我们选择三个输入值,已经通过embedding处理,得到了三个词向量。

Input 1: [1, 0, 1, 0] 
Input 2: [0, 2, 0, 2]
Input 3: [1, 1, 1, 1]

初始化权重

权重包括三个,分别是query的W_{q},key的W_{k}以及value的W_{v},例如这三个权重分别初始化为

W_{k}矩阵为: 

[[0, 0, 1],
 [1, 1, 0],
 [0, 1, 0],
 [1, 1, 0]]

W_{q}矩阵为: 

[[1, 0, 1],
 [1, 0, 0],
 [0, 0, 1],
 [0, 1, 1]]

W_{v}矩阵为:

[[0, 2, 0],
 [0, 3, 0],
 [1, 0, 3],
 [1, 1, 0]]

计算key,query 和value

有了输入和权重,接下来可以计算每个输入对应的key,query 和value了。

第一个输入的Key为:

               [0, 0, 1]
[1, 0, 1, 0] x [1, 1, 0] = [0, 1, 1]
               [0, 1, 0]
               [1, 1, 0]

第二个输入的Key为:

               [0, 0, 1]
[0, 2, 0, 2] x [1, 1, 0] = [4, 4, 0]
               [0, 1, 0]
               [1, 1, 0]

第三个输入的Key为:

               [0, 0, 1]
[1, 1, 1, 1] x [1, 1, 0] = [2, 3, 1]
               [0, 1, 0]
               [1, 1, 0]

用矩阵的乘法来计算输入的Key为:

               [0, 0, 1]
[1, 0, 1, 0]   [1, 1, 0]   [0, 1, 1]
[0, 2, 0, 2] x [0, 1, 0] = [4, 4, 0]
[1, 1, 1, 1]   [1, 1, 0]   [2, 3, 1]

同理我们计算value的结果为:

               [0, 2, 0]
[1, 0, 1, 0]   [0, 3, 0]   [1, 2, 3] 
[0, 2, 0, 2] x [1, 0, 3] = [2, 8, 0]
[1, 1, 1, 1]   [1, 1, 0]   [2, 6, 3]

最后我们计算query的结果:

               [1, 0, 1]
[1, 0, 1, 0]   [1, 0, 0]   [1, 0, 2]
[0, 2, 0, 2] x [0, 0, 1] = [2, 2, 2]
[1, 1, 1, 1]   [0, 1, 1]   [2, 1, 3]

计算输入值的注意力得分 

注意力的得分是通过query与每个key结果相乘。例如对于第一个query(红色)分别与三个key(橙色)相乘,得到结果(蓝色)就是注意力得分。

计算结果为:

            [0, 4, 2]
[1, 0, 2] x [1, 4, 3] = [2, 4, 4]
            [1, 0, 1]

计算softmax层

softmax函数直接对上一步中的注意力得分做归一化处理。

softmax([2, 4, 4]) = [0.0, 0.5, 0.5]

得分与value相乘

得到的每个得分值与自身的value直接相乘

1: 0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]
2: 0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]
3: 0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]

对6中结果求和,并得到第一个输出值

上一步骤中输出结果求和就得到第一个输出值

  [0.0, 0.0, 0.0]
+ [1.0, 4.0, 0.0]
+ [1.0, 3.0, 1.5]
-----------------
= [2.0, 7.0, 1.5]

重复4-7,计算其余输入数据的输出值

重复计算4-7,分别得到第二个和第三个输出值


 

于是三个输入经过self-attention模块,得到了三个输出值。这就是attention模块做的事情,是不是很简单。《Attention Is All You Need》论文中的attention计算公式:

attention最厉害的地方在于能够捕捉到全局信息,经过这个模块的输出结果,是通过输入结果两两运算得出了权重,再对输入进行加权求和得到了。除了捕捉全局信息,还能并行计算,这就比之前的RNN和CNN厉害多了,怪不得谷歌给这篇论文起名叫做Attention Is All You Need,有这个attention就够了。

参考


  1. https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a



 


原作者:Black先森
链接:https://www.jianshu.com/p/c6a090af4b30
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### Transformer模型的基本原理 Transformer 是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,其设计目的是高效处理序列数据,如自然语言文本。以下是关于 Transformer 工作原理的核心概念及其直观解释: #### 数据预处理阶段 在翻译任务中,原始输入是一个英文句子:“Apple company designed a great smartphone.” 首先会经过 **Tokenization** 和 **Embedding** 处理[^1]。具体来说: - 句子被分割成一系列标记(Tokens),例如 ["Apple", "company", "designed", ...]。 - 每个标记会被映射到一个高维向量空间中的嵌入表示(Embedding Vector)。这些嵌入向量捕捉了单词的意义以及上下文信息。 #### 自注意力机制的作用 Transformer 的核心在于引入了一种称为 **自注意力机制** 的技术[^2]。该机制使得模型可以动态调整对不同位置的关注程度,从而更好地理解整个序列的信息。通过计算查询(Query)、键(Key)和值(Value)三者之间的相似度得分,模型能够评估当前词与其他词语的相关性,并据此加权组合它们的特征表示。 #### 编码器与解码器结构 Transformer 架构由两大部分组成——编码器(Encoder)和解码器(Decoder): - **编码器** 负责接收源语言句子并将其转换为连续的语义表征; - **解码器** 则依据目标语言的历史生成情况逐步预测下一个可能的目标词汇。 两者之间存在多层堆叠的设计模式,在每一层内部均包含了多个平行操作单元来增强表达能力。 ```python import torch.nn as nn class MultiHeadedAttention(nn.Module): def __init__(self, h, d_model, dropout=0.1): super().__init__() assert d_model % h == 0 self.d_k = d_model // h self.h = h self.linears = clones(nn.Linear(d_model, d_model), 4) self.attn = None self.dropout = nn.Dropout(p=dropout) def forward(self, query, key, value, mask=None): ... ``` 上述代码片段展示了如何实现一个多头注意组件的部分逻辑流程。 --- ### 直观解释 假设我们要把一句话从英语翻成法语,“Apple company designed...”。当传统RNN类方法逐字读取时可能会丢失远距离依赖关系;而借助于transformer里的attention score矩阵,则可以让每一个时刻都看到全局范围内的其他所有token的重要性权重分布图谱,进而做出更优决策。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值