对于Attention机制中Q,K,V的一些理解

Q、K、V是什么

[PS:本文谈论的Q、K、V只限于seq2seq结构]

  • Q:指的是query,相当于decoder的内容
  • K:指的是key,相当于encoder的内容
  • V:指的是value,相当于encoder的内容

看到这里,是不是只想直呼卧槽,这什么鬼。不急,先看一个例子

例子

由于讨论的是seq2seq任务,于是来看看机器翻译。
假如我们要将我喜欢看电影翻译成I like watching movies,步骤则会如下

  • 使用一种编码方式(如LSTM、CNN、Transformer等)编码中文
  • 使用一种方式解码
    • 机器翻译这个任务中会在解码端给一个开始的标记,如</s>,我们根据这个标记传给解码端,开始生成英文,比如生成了I这个单词,下一步当然是需要生成’like’这个单词,于是这个I将会作为query集去查找,形象话说就是我们需要使用已经有的东西去询问一些事情。
    • 去哪里查找?当然是编码端,也就是那些可以被查找的信息,如果原文在编码中是字向量表示则是
    • 找到了返回啥的信息?返回编码端的信息,具体的会将做一个调整再回传。

到这里,对于使用Attention机制的seq2seq任务,这么理解我认为是没问题的

推荐资料

http://jalammar.github.io/illustrated-transformer/
另外,jalammar这位大神写了不少有意义的资料,推荐读一读
https://www.youtube.com/watch?v=gciHGREJdJ4
这个视频是对BERT的介绍,里面有提到对Attention机制的理解,本文的写作来自于这个人的视频。

### 查询(Query)、键(Key)和值(Value)的作用 在注意力机制中,查询、键和值是三个核心组成部分。它们共同作用于计算输出向量,这个过程通过将输入数据的不同部分进行加权组合来实现。具体来说,查询向量用于寻找与之相关的键向量,并根据这些相关性对值向量进行加权求和[^1]。 - **查询(Query)**:代表当前需要关注的信息或者说是问题本身。它用来和其他的键进行匹配,以确定哪些值应该被更多地注意。 - **键(Key)**:作为一组参考点,与查询相比较,用以决定从值中提取信息的相关程度。 - **值(Value)**:携带实际要被筛选和整合的信息。基于查询与键之间的匹配度,值会被赋予不同的权重并最终加总成一个上下文向量。 ### 工作原理 注意力机制的基本工作流程可以分为几个步骤: 1. **得分计算**:首先,使用某种兼容性函数来衡量查询向量与每一个键向量之间的相似度或相关性。这种计算通常采用点积形式,有时也会结合其他方法如加法等。对于缩放点积注意力机制,得分是通过对查询和键的转置矩阵做点积得到的,然后除以一个缩放因子$\sqrt{d_k}$,其中$d_k$是键向量的维度,这样做是为了保持梯度稳定[^3]。 2. **归一化**:接下来,应用Softmax函数到上述计算出的得分上,从而获得一组归一化的注意力权重。这一步骤确保了所有权重之和为1,使得它们能够表示概率分布。 3. **加权求和**:最后一步是利用这些注意力权重去乘对应的值向量,再对结果执行加总操作,生成最终的输出向量。这样做的效果就是让模型更加聚焦于那些被认为更重要的信息上[^2]。 自注意力机制特别之处在于它允许序列中的每个位置都直接连接到另一个位置,这意味着当处理某个位置时,它可以同时考虑整个序列的信息。这种方式增强了模型捕捉长距离依赖关系的能力,这对于许多自然语言处理任务至关重要[^4]。 ```python def scaled_dot_product_attention(query, key, value): # 计算查询与键的点积,并除以 sqrt(d_k) 来缩放 matmul_qk = tf.matmul(query, key, transpose_b=True) dk = tf.cast(tf.shape(key)[-1], tf.float32) scores = matmul_qk / tf.math.sqrt(dk) # 应用 Softmax 获取注意力权重 attention_weights = tf.nn.softmax(scores, axis=-1) # 使用注意力权重与值相乘并返回结果 output = tf.matmul(attention_weights, value) return output, attention_weights ``` 以上代码片段提供了一个简化版的缩放点积注意力机制实现示例。请注意,在实际应用中可能还需要包括掩码操作以防止解码过程中看到未来的信息,以及更复杂的多头注意力结构。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值