《Attention Is All You Need》注意力机制公式中Q,K,V的理解

一、概述

《Attention Is All You Need》是一篇关于注意力机制里程碑的文章,从2017年发表至今2020年7月已经获得了上万的引用。该文的两大亮点一是提出了一个几乎仅依靠注意力来完成机器翻译的模型Transformer,推动了NLP的发展,另外一个亮点是改进了点积注意力(Dot-Product Attention),加入了一个缩放因子,提出了可伸缩点积注意力(Scaled Dot-Product Attention)。本人在阅读了《Attention Is All You Need》和《Illustrate the Trasformer》两篇文章后,发现文中对点积注意力的解释都不够具体,让很多读者难以理解。Q(一组query集合组成的矩阵),K(一组key集合组成的矩阵),V(一组value集合组成的矩阵)具体含义是什么,如何去理解。本人在经过思考以后,有一些自己的想法和见解在此提出,希望能对有相同困惑的同学一些帮助,如果有理解不对的地方,也希望大家在评论区提出指正共同探讨。

二、向量相关性

为了对点积注意力机制有一个比较好的理解,首先需要理解如何度量两个向量之间的相关性。由线性代数相关的知识我们可以知道,对于相同维度的两个向量,可以通过点积的方法来获得其相关性。
两个垂直的向量
上图中的两个向量,点积就是对应位置相乘再相加,所得结果为0,可以说这两个向量是线性无关的,也就是垂直的。如果点积不为0,则是相关的,如下图点积结果为3。
在这里插入图片描述

三、点积注意力

### 关于 'Attention is all you need' 论文中公式的详解 #### 公式背景 在 'Attention is all you need' 的论文中,核心部分是注意力机制的实现方式——Scaled Dot-Product Attention(缩放点积注意力)。该方法通过矩阵运算高效地实现了自注意力机制的核心功能[^2]。 #### 主要公式及其解释 1. **Query, Key 和 Value 的定义** Query ($ Q $), Key ($ K $) 和 Value ($ V $) 是三个重要的向量集合。它们分别代表查询、键和值的概念。这些向量由输入嵌入经过线性变换得到: \[ Q = XW_Q,\quad K = XW_K,\quad V = XW_V \] 其中 $ W_Q $, $ W_K $, $ W_V $ 是可训练参数矩阵,$ X $ 表示输入序列的嵌入表示[^3]。 2. **注意力分数计算** 注意力分数衡量的是 Query 和 Key 之间的相似度。具体来说,使用点积作为相似度函数,并对其进行缩放操作以稳定梯度: \[ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V \] 上述公式中,$ d_k $ 是 Key 向量的维度大小,$\sqrt{d_k}$ 被用来调整点积的结果范围,防止 softmax 函数因数值过大而导致梯度消失问题[^1]。 3. **Softmax 层的作用** Softmax 将点积后的结果转化为概率分布形式,使得每个位置上的权重总和为 1。这样可以更清晰地表达哪些位置更重要: \[ \alpha_i = \text{softmax}(\frac{\langle q,k_i\rangle}{\sqrt{d_k}}) \] 4. **最终输出** 输出是由加权求和的方式获得,其中权重来源于 softmax 结果,而实际的内容来自 Value 向量: \[ z = \sum_{i=1}^{n} \alpha_i v_i \] 此处 $ n $ 表示序列长度,$ z $ 即为当前时刻的上下文表示[^2]。 #### 实现细节 以下是基于 PyTorch 的简单代码实现: ```python import torch import torch.nn as nn class ScaledDotProductAttention(nn.Module): def __init__(self, dim_key): super(ScaledDotProductAttention, self).__init__() self.scale_factor = torch.sqrt(torch.tensor(dim_key, dtype=torch.float)) def forward(self, query, key, value): attention_scores = torch.matmul(query, key.transpose(-2, -1)) / self.scale_factor attention_probs = torch.softmax(attention_scores, dim=-1) output = torch.matmul(attention_probs, value) return output ``` 此代码片段展示了如何利用矩阵乘法来完成 scaled dot-product attention 的前向传播过程。 --- ####
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值