【ACT-Transformer学习笔记1】--注意力机制(Attention)

搞懂注意力机制(Attention)

注意力机制(Attention Mechanism)是深度学习中非常重要的技术,它最初来源于人类视觉系统的启发,能够让模型在处理输入时,自动地关注最相关的信息部分。注意力机制最广泛的应用场景是自然语言处理(NLP),尤其是在序列到序列(Seq2Seq)任务中,比如机器翻译、文本摘要、情感分析等。

1. 什么是注意力机制?

注意力机制的核心思想是:在处理输入数据时,每个输出并不是直接依赖于整个输入,而是依赖于输入的一个加权部分,即只关注(赋予更多权重)与当前任务最相关的输入部分。通过这种方式,模型可以高效地捕捉到不同位置的关联性。

例如,在机器翻译中,翻译一个句子中的某个词时,翻译模型不需要完全依赖于所有输入词,而是通过计算与目标词最相关的输入词(如通过加权计算不同词的相似度)来做出最合适的翻译。这个加权过程就是注意力机制的核心。

2. 注意力机制的核心概念

在标准的注意力机制中,我们通常会涉及三个重要的向量:

  • Query (Q): 查询向量,代表当前时刻要预测的内容。

  • Key (K): 键向量,与查询向量配对的输入信息。

  • Value (V): 值向量,包含键向量对应的信息。

注意力机制通过计算查询向量与键向量之间的相似度来决定权重,然后用这些权重对值向量进行加权平均,最终得到当前时刻的输出。

3. 计算过程

在常见的点积注意力(Dot-Product Attention)中,计算过程如下:

  • 计算相似度:首先计算查询向量 Q 与所有键向量 K 之间的相似度,一般是通过点积来计算:

score(Q,K)=Q\cdot K

这一步的目的是衡量每个键与查询的相关性。

  • 缩放相似度:为了避免点积值过大导致梯度消失的问题,通常会对点积结果进行缩放,使用缩放因子 \sqrt{d_{k}}​​,其中 d_{k} 是键向量的维度:

scaled_score(Q,K)= \frac{Q\cdot K}{\sqrt{d_{k}}}

  • 应用Softmax:计算出的相似度会通过Softmax函数进行归一化,使得所有权重之和为1。Softmax将相似度转化为概率分布,表示每个输入部分的相对重要性。

attention_weights=Softmax(scaled_score(Q,K))

  • 加权求和:最后,利用计算得到的注意力权重对每个值向量(Value)进行加权平均:

output=\sum (attention_weights\cdot V)

这个加权平均的结果就是当前时刻的输出,它综合了与查询相关的所有输入信息。

例子:机器翻译中的注意力机制

假设我们要将英文句子 "I love machine learning" 翻译成中文 "我 喜欢 机器 学习"。在传统的序列到序列模型(如RNN或LSTM)中,模型按顺序处理输入和输出,而在注意力机制中,我们让模型能够同时关注输入句子的所有部分

1. 输入和输出

  • 输入:["I", "love", "machine", "learning"]

  • 输出:["我", "喜欢", "机器", "学习"]

我们要翻译每一个中文词汇时,模型会根据当前翻译的词去计算每个英文词的权重,并且计算加权平均后得到一个新的表示。

2. 自注意力机制(Self-Attention)

在翻译“我”这个词时,模型需要确定“我”应该与输入句子中的哪些词相关。我们通过查询(Q)键(K)值(V)来计算注意力。

  • 查询(Q):当前要生成的输出词(在这里是“我”)。

  • 键(K):输入句子中的每个词的表示。

  • 值(V):与输入词关联的向量,通常就是词的表示。

假设我们的输入句子 “I love machine learning” 对应的词嵌入如下:

单词词嵌入向量(示例)
I[0.1, 0.2, 0.1]
love[0.3, 0.1, 0.4]
machine[0.4, 0.5, 0.2]
learning[0.5, 0.2, 0.6]

每个词嵌入是一个向量,表示这个词在语义空间中的位置。

3. 计算注意力权重

对于生成“我”这个词,模型需要计算输入句子中每个词与“我”之间的关系。假设“我”对应的查询向量 Q_{我}是 [0.2, 0.1, 0.3]。

我们通过计算查询向量和每个输入词的键向量的点积来评估它们的相似度。然后通过Softmax将它们转化为概率,作为每个词的权重。

计算点积:

缩放:我们通常会对点积结果进行缩放。假设我们使用的键向量维度为3,因此将点积结果除以 \sqrt{3}​,得到以下的缩放值。

应用Softmax:Softmax函数的作用是将得分转换为一个概率分布,使得所有权重之和为1。公式为:Softmax(x_{i})=\frac{e^{x^{i}}}{\sum _{j}e^{x_{j}}}

其中,xi​ 是每个得分,e^{x_i} 是其指数值,\sum _{j}e^{x_{j}}是所有得分的指数值之和。

首先,我们计算所有缩放后的得分的指数值:

然后,计算这些指数值的总和:

1.084+1.203+1.135+1.245=4.667

接下来,应用Softmax函数计算每个词的注意力权重:

通过Softmax归一化,我们得到了每个输入词的注意力权重:

  • 对“I”的权重 = 0.232

  • 对“love”的权重 = 0.258

  • 对“machine”的权重 = 0.243

  • 对“learning”的权重 = 0.267

这表明,当生成“我”这个词时,模型最关注的是“learning”这个词(权重为0.267),其次是“love”(权重为0.258),然后是“machine”(权重为0.243),最不关注的是“I”(权重为0.232)。这符合我们对自然语言的理解:生成“我”时,“learning”可能在上下文中比“I”更具相关性。

4. 加权求和

在获得了注意力权重之后,下一步是对每个输入词的值向量(Value)进行加权求和。每个值向量代表了输入词的特征,我们将每个词的值向量与其对应的注意力权重相乘,然后对结果进行加权求和,从而得到最终的输出。

假设我们有以下输入词的值向量(Value),它们与每个输入词的表示相关。以下是每个词的值向量示例:

单词值向量(示例)
I[0.2, 0.3, 0.1]
love[0.1, 0.4, 0.2]
machine[0.3, 0.5, 0.3]
learning[0.4, 0.2, 0.4]

计算加权求和

接下来,我们将每个词的值向量与其对应的注意力权重相乘,并将结果加起来。

这个加权求和后的向量 [0.252,0.3477,0.2545] 就是模型生成“我”这个词时,基于输入句子的上下文和注意力权重所得到的最终表示。

5. 输出

通过这种方式,模型就可以根据输入句子的上下文来生成每个输出词的表示,并最终翻译成“我”。这种机制帮助模型选择性地关注句子中的相关部分,而不是将注意力均匀分配给所有输入词。

4. 多头注意力(Multi-Head Attention)

多头注意力(Multi-Head Attention) 是 Transformer 架构中的一个重要机制,它通过并行地计算多个注意力头(Attention Head),让模型从不同的角度同时关注输入序列的不同部分。这种机制增强了模型捕捉多种信息的能力,尤其是在处理复杂数据时,它比单一的注意力机制具有更强的表达能力。

1. 多头注意力的计算流程

在单头注意力机制中,我们通过一个查询(Query)向量与键(Key)向量计算相似度,然后得到一个加权和。然而,单一的注意力头只能关注到序列中某一部分的信息。为了克服这个问题,多头注意力将多个“注意力头”并行使用,每个头可以关注序列中不同的信息。

计算步骤:
  1. 线性变换:将输入的查询(Q)、键(K)和值(V)分别通过不同的线性变换,生成多个子空间(即多个不同的查询、键、值的组合)。每个子空间都有自己的 Q,K,V 变换。

    • 对于 h 个头,每个头都有一组独立的查询(Q_{h}​)、键(K_{h}​)、值(V_{h})矩阵,它们由原始的 Q,K,V 通过不同的线性变换得到。

  2. 计算每个头的注意力:对于每个头,计算基于不同查询、键、值的自注意力(如上一节所述),得到每个头的输出。

  3. 拼接结果:将每个头的输出进行拼接。这样,通过多头注意力,模型能够在不同子空间上聚合信息。

  4. 线性变换:最后,对拼接后的结果进行一次线性变换,得到最终的输出。

数学表示

3. 优势与意义
  • 并行化:多头注意力的一个显著优点是它可以并行计算。每个注意力头在处理输入时,相互独立地计算,因此可以充分利用现代计算设备的并行计算能力。

  • 捕获不同的关系:每个头在计算时都有不同的查询、键、值变换,这使得每个头关注输入的不同部分。例如,一个头可能会关注句子中的语法信息,而另一个头可能会关注语义信息。通过这种方式,模型能够从多个角度捕获不同的语义和语法特征。

  • 增强的表达能力:单一的注意力头可能无法捕捉复杂的信息关系,而多头注意力通过多个头并行计算,能更好地学习和表示输入序列中的不同关系。多头注意力机制有助于模型进行更丰富的特征提取。

4. 举个例子

假设我们有以下输入句子:"I love machine learning"

对于多头注意力,假设我们使用 3个头,每个头有不同的权重和线性变换:

  1. 头 1:关注语法结构,可能更多地聚焦于单词之间的句法依赖,如“love”与“I”之间的关系。

  2. 头 2:关注句子的语义,可能专注于“machine”和“learning”之间的语义关系。

  3. 头 3:关注上下文,可能聚焦于整句话的意思,如何在生成输出时保持语义一致性。

每个头将计算各自的注意力,并根据不同的线性变换关注输入的不同部分。最终,所有的头的输出会被拼接,并经过线性变换得到最终的表示。

5. 代码示例

如果用 PyTorch 来实现多头注意力,可以使用 nn.MultiheadAttention 来进行计算。下面是一个简单的例子:

import torch
import torch.nn as nn

# 输入数据:假设我们有一个序列长度为5,特征维度为8的输入
batch_size = 1
seq_length = 5
embedding_dim = 8
num_heads = 2

# 输入词嵌入(Batch, Seq_len, Embedding_dim)
x = torch.randn(batch_size, seq_length, embedding_dim)

# 创建MultiheadAttention层
multihead_attn = nn.MultiheadAttention(embed_dim=embedding_dim, num_heads=num_heads)

# 输入到多头注意力层(query, key, value, need_weights=False)
output, attn_weights = multihead_attn(x, x, x)

print("输出:", output)
print("注意力权重:", attn_weights)

在这个例子中,x 是输入的词嵌入,multihead_attn 是一个具有 2 个头的多头注意力层。我们将输入传递给多头注意力层,它将计算多个头的注意力并返回拼接后的输出。

6. 总结
  • 多头注意力机制通过并行计算多个注意力头,允许模型从不同的角度关注输入序列的不同部分,从而增强了模型的表达能力。

  • 每个头通过不同的线性变换来生成独立的查询、键和值,并计算各自的注意力。

  • 最终,通过拼接这些头的输出,模型能够融合多个信息源,捕捉到更多的关系和特征。

这种机制使得 Transformer 在自然语言处理、图像处理等任务中取得了显著的性能提升,特别是在需要处理长序列和多模态数据的任务中。

5. 自注意力(Self-Attention)

自注意力(Self-Attention) 是一种特殊形式的注意力机制,其中查询(Query)、键(Key)和值(Value)都来自同一个输入序列。在传统的注意力机制中,查询和键/值分别来自输入序列和输出序列,而自注意力则在同一序列内部计算关系,因此每个词的输出会考虑整个序列中的其他词的信息。

自注意力机制允许模型在处理每个输入时,能够考虑到输入序列中所有位置的上下文信息,这使得它在处理长序列时特别有效。

1. 自注意力的工作原理

自注意力机制的主要目的是通过计算输入序列中每个词的表示,捕捉这些词之间的关系。通过这种方式,模型能够有效捕捉长距离的依赖关系,尤其是在长序列中。它的计算过程与常规的注意力机制相似,唯一的不同之处在于,查询、键和值都来自同一个输入序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值