自注意力机制

自注意力机制

O、前置知识——单词向量编码

在文字处理中,我们对单词进行向量编码通常有两种方式:

  1. 独热编码(one-hot encoding):用N位的寄存器对N个状态编码,通俗来讲就是开一个很长很长的向量,向量的长度和世界上存在的词语的数量是一样多的,每一项都表示一个词语,只要把其中的某一项置1,其他的项都置0,那么就可以表示一个词语,但这样的编码方式没有考虑词语之间的相关性,并且内存占用也很大

  2. 词向量编码(Word Embedding):将词语映射(嵌入)到另一个数值向量空间,可以通过向量空间内的距离(如点积)来表征不同词语之间的相关性。

独热编码的方式,基本被遗弃了,通过一个线性层,将一个单词映射为一个词向量,成为目前 LLM(Large Language Model) 主流的做法。

一、注意力机制

深度学习中的注意力机制通常可分为三类:软注意(全局注意)、硬注意(局部注意)和自注意(内注意)

  1. Soft/Global Attention(软注意机制):对每个输入项的分配的权重为0-1之间,也就是某些部分关注的多一点,某些部分关注的少一点,因为对大部分信息都有考虑,但考虑程度不一样,所以相对来说计算量比较大。

  2. Hard/Local Attention(硬注意机制):对每个输入项分配的权重非0即1,和软注意不同,硬注意机制只考虑那部分需要关注,哪部分不关注,也就是直接舍弃掉一些不相关项。优势在于可以减少一定的时间和计算成本,但有可能丢失掉一些本应该注意的信息。

  3. Self/Intra Attention(自注意力机制):对每个输入项分配的权重取决于输入项之间的相互作用,即通过输入项内部的"表决"来决定应该关注哪些输入项。和前两种相比,在处理很长的输入时,具有并行计算的优势。

二、自注意力机制

理解自注意力机制的关键在于,理解Q、K、V机制计算加权的方法。该部分应当了解四个矩阵 Wq,Wk,Wv,Wo.

1、自注意力机制的目标

注意力机制的最本质的思路是 “加权”,不论是软注意力还是硬注意机制,都是在输入模型真正逻辑结构之前,为输入的系列词向量加上权重。而自注意力机制,同样如此。下图是自注意力机制的目标:

image-20230718151238223

即有一系列词向量 {ai},输出的 {bi} 为各个词向量的加权结果:

(1)bj=iwijai

可以看出,此处的权重 wij 并不固定,还与 bj 的位置 j 有关。这是区别于软注意力和硬注意力机制最显著的地方,从现实情况看,所谓关注上下文的信息,也并不是关注上下文固定位置的信息,而是动态的观察周围单词的信息。

2、自注意力的 Q、K、V

自注意力机制,首先引出了三个矩阵:Wq,Wk,Wv.

矩阵 计算
Wq:query 矩阵 qi=Wqai
Wk:key 矩阵 ki=Wkai
Wv:value 矩阵 vi=Wvai

可以看出,三个矩阵分别与输入的单词向量相乘,获得对应的 q,k,v 向量。下面直接给出解释:

  • qi 向量:作为 ai 的 query 向量,用于与每个词向量 aj 的 key 向量相乘,获得相关性常数 αi,j
  • ki 向量:作为 ai 的 key 向量,用于被每个词向量的 query 向量相乘。
  • vi 向量:作为 ai 的 value 向量,用于表征 ai 的内容信息,同时也是 bi 的加权对象。

img

结合该图,可以很清晰的看出自注意力机制的计算过程(这里以计算 b1 为例):

  • 将向量 a1 的 query 向量与每个词向量的 key 向量相乘得到相关性得分
  • 对所有相关性得分 αi 归一化
  • 对向量 ai 的 value 向量使用相关性得分归一化的结果加权,得到 b1 向量

总的来说,自注意力机制基本完成了前文所述的目标,不过加权的并不是 ai 而是其 value 向量。所谓自注意力,其实从 q,k,v 三个向量的计算可以看出,都是从 ai 得来,这也是称之为自注意力的缘由。除此之外,具体到计算过程中,q、k、v向量的计算是可以并行的,即可以对多个单词向量 ai 同时计算其 qi,ki,vi ,因此实际上计算的是 Q,K,Vqi,ki,vi 计算的结果矩阵)。

3、多头自注意力

多头自注意力引出了 Wo .

从自注意力矩阵的思路,是利用了三个矩阵,将 ai 映射到不同的子空间中,并分别得到有用的 q,k,v 向量。多头自注意力的想法是,仅仅单个的 q,k,v 并不能将 ai 所在的空间信息完全的表达出来,因此对于每一个词向量 ai 都应用多个 Wq,Wk,Wv (原论文中为 8 个),同时并行进行上述的 q,k,v 操作。

image-20230718155937246

这就使得最终的输出有 8 个矩阵,但是输给前馈层仅需要一个矩阵就行,所以这里将这 8 个结果进行 concat,强行连接成为一个矩阵。为了契合维数的要求,在 concat 之后,将这个 “长长” 的矩阵进行投影,即乘以一个 Wo 将其压缩到需要的维度。这就是 Wo 的由来。

多头自注意力的思路,提高了模型关注不同位置的能力,因为 8 个头所关注的位置并不完全相同,提高了模型的鲁棒性。同时也为注意力层提高了多个“表示子空间”,能够更加充分的表征单词的距离、内容等信息。它也增加了模型的参数量,从而能够容纳更多信息。

这部分之后准备融到 transformer 论文的阅读里去~

posted @   tsyhahaha  阅读(314)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示