Query, Key, Value——Token职责的分化
最后更新:
1.绪言
通过上一篇对Self-Attention的介绍,我们已经得知了这个Transformer架构中重要组成部分的原理
但是此时出现了一个新的问题,在自注意力的计算之中,我们到底应该如何去计算不同Token向量对其他Token向量的注意力?
直接内积?这无疑是不可行的,因为这样做的话,假如说有两个Token:AbelTomato和handsome,其中handsome对AbelTomato具有很高的注意力,但是AbelTomato显然不需要,因为这只是他众多优点中微不足道的一个,换而言之注意力是有方向的,而内积是无向的
这里的Token向量之间的双向注意力等同只是问题之一,真正的主要问题在于,我们现在对于一个Token只计算出一个Token向量,而一个Token所承担的职责却有三种:
- 首先是它需要表达自己想要找什么,比如
handsome要去关注谁是它的主语 - 其次是它要表达自己能够被什么样的查询匹配,就类似于特征,
tomato的特征是红色的,酸酸的,那么搜索这两个特征的时候,就需要对tomato分配注意力 - 最后则是当它被查询匹配之后,能够带给对方Token怎样的信息,比如
handsome找到了它的主语AbelTomato,那么AbelTomato需要传递回去的就是自己所具有的语义和特征,比如来自厦门大学,比如是人工智能专业,等等
所以现在的矛盾点在于,Token向量所承载的意义太多,模型很难通过一个单一的向量去在不同的任务中调整这三种关系
所以在Transformer架构中,它并不直接使用原始的Token向量来计算注意力,而是先将每个Token投影到三个不同的表示空间中,分别得到Query、Key、Value这三个维度的向量
2.Query, Key, Value向量计算
那么我们应该如何从单一的Token输入向量映射到这三种向量呢?这就需要用到我们经过训练得到的三个矩阵: , ,
这样一来,通过与矩阵相乘,经过线性投影变换,我们就可以得到三种新向量
具体来说,对于输入序列中的某个Token向量 ,通过这样的运算
从而得出新向量
3.Q和K:计算注意力分散
现在我们已经得到了每个Token的
其中 代表当前Token想找什么, 代表其他Token能被如何匹配,因此两者点积越大,说明匹配程度越高
现在假如我们有一个只有三个词语的输入序列
AbelTomato is handsome
拆分为三个Token,有Token序列
经过处理后得到 , ,
假设此时我们需要处理第一个词AbelTomato的自注意力,那么就要计算它与其他词相关的得分,通过点积进行运算,得到
这些 就代表了AbelTomato需要注意的其他词的程度
4.缩放与Softmax
但是这个分数我们不能直接拿来用,为什么?因为它可能非常大,以及可能乱七八糟,有正有负,没有统一的方便比较的标准
所以我们有标准公式:
这里的 是矩阵层面上的计算,与原来逐向量的计算是一样的
首先为什么需要把分数除以 ?就是解决计算得分太大的问题,梯度模糊,不利于模型的训练
然后 是什么?其实就是一种归一化的方法,能够让计算得分之和为 ,且均为正数,也就可以直接看作每个Token对于其他Token的注意力分配比例
5.V:根据权重收集信息
最后就是要应用到我们的 ,有
这一步的目的就是把其他每个Token的信息都收集回来汇总,得到最终的上下文表示方法
评论
评论会在审核后展示