注意力机制解析

背景
注意力机制早在2014年便被首次用于计算机视觉领域,试图理解神经网络进行预测时正在观察的位置。2015年注意力机制开始用于NLP领域,后于2017年被加入Transformer网络中用于语言建模。Transformers解决了RNN存在的长程依赖、梯度消失和梯度爆炸、所需训练开销和无法并行计算等问题,取代了RNN在NLP领域的统治地位,成为该领域最受欢迎的技术。
词嵌入 (embedding)
对于自然语言文本,计算机难以直接使用,因此在NLP中第一步都是将自然语言的单词转化为等长的向量,这个过程叫做嵌入。向量的每个维度都有其潜在的含义,只不过在具体实践中难以对每个维度的含义做具体解释。
词嵌入并无普遍标准,同一个词的嵌入也会因为任务、神经网络、训练阶段的不同而不同。初始嵌入为随机值,在训练期间会不断调整从而最小化神经网络的误差。
举个例子,我们要将这句话输进计算机做处理:
句子被输入计算机时,程序将该字符串分为若干个token
而当我们分析句中单词的语义时会发现单词间的关联程度并不和它们之间的距离直接相关,例如will和tomorrow的关联程度明显比其与come的关联程度更高。因此词语之间的关联程度需要根据上下文的语境决定。接下来我们试图调整tokens的词嵌入,使其包含上下文信息。
缩放点积注意力的推导
如图,
对于求
求出
则注意力分数为查询向量和键值向量的点积
这里求
这个步骤可以简单理解为:在搜索引擎中输入的内容为
该步骤的激活函数并非必须为softmax,使用其他激活函数(如RELU,GELU等)也可,并且可能达到更好的效果。
得到
其余
使用向量形式可以非常简洁地表述上述过程。假设:
- 查询矩阵
( 表示查询的个数, 是查询向量的维度) - 键矩阵
( 表示键的个数) - 值矩阵
每个查询
其中
最终注意力的输出值是值
即
其中
值得注意的是,作者在原论文中提出了缩放因子:
其原因是:点积值的大小随着
最终我们得到了完整的注意力机制公式:
整个过程只有矩阵
在机器翻译或文本生成的任务中,通常需要预测下一个单词出现的概率,这类任务要求注意力只能放在下一个词,不能放在更往后的词上。简而言之,注意力矩阵不能有非平凡的超对角线分量。这时我们可以通过添加掩码矩阵
其中,
利用神经网络结构表示注意力机制如下图所示:
如何更好地理解注意力机制中的Q,K,V?
多头注意力机制
有时,只用一个注意力头可能无法很好捕捉多个词在语境上复杂的关联。因此,可以添加更多线性层作为键、查询和值。这些线性层在每轮并行训练,彼此权重独立,每层都各提供一个输出,从而各算出独立的权重。每一层被称为一个“头”。可以有任意数量
仿照上述的向量表示方法,多头注意力可以表示为
其中
缩放点积注意力的Pytorch实现
使用类ScaledDotProductAttention
实现该注意力机制的模型:
1 | import torch |
接下来设置参数并尝试运行:
1 | batch_size, n_heads, seq_len, d_k, d_v = 1, 1, 5, 6, 3 |
对于其中各个参数和输出结果含义的解释:
batch_size
可理解为句子的数量(一次处理多少个句子)n_heads
代表注意力头的数量seq_len
代表一个句子中包含多少个词元(tokens)d_k
设置了query和key的维度d_v
设置了value的维度output
表示在输入的序列中,每个词元的value根据其他词元的相关性加权之后的结果,作为每个位置的最终表示attn_weights
是注意力分配给每个位置的权重,决定了查询i
在计算输出时,从键j
的值V[j]
获取信息的程度
输出结果:
1 | torch.Size([1, 1, 5, 3]) |
- Title: 注意力机制解析
- Author: Jachin Zhang
- Created at : 2025-02-19 16:14:33
- Updated at : 2025-02-19 17:24:18
- Link: https://jachinzhang1.github.io/2025/02/19/AttentionAnalysis/
- License: This work is licensed under CC BY-NC-SA 4.0.