返回博客列表

Untitled

理论推导

Self-Attention的Input,是一串的Vector,那这个Vector可能是你整个Network的Input,它也可能是某个Hidden Layer的Output,所以用 a 表示它:

image-20210404202435331

Input一排a向量以后,Self-Attention要Output另外一排b向量。每一个b都是考虑了所有的a以后才生成出来的,b^1 虑了a^1 \dots a^4b^2 虑了a^1 \dots a^4b^3,b^4 是一样,考虑整个input的sequence,才产生出来的。

关于如何产生b^1 个向量,这里有一个特别的机制,这个机制是根据 a^1 个向量,找出整个很长的sequence里面,到底哪些部分是重要的。

image-20210404202942477

每一个向量跟 a^1 关联的程度,用一个数值叫 \alpha 来表示。

image-20210404204458431

计算这个\alpha 数值有各种不同的做法

  • dot product:输入的这两个向量分别乘上两个不同的矩阵,左边这个向量乘上W^q 矩阵得到矩阵q,右边这个向量乘上W^k 矩阵得到矩阵k,再把q k 做dot product,就是把他们做element-wise 的相乘,再全部加起来以后就得到一个 scalar,这个scalar就是\alpha,这是一种计算\alpha 方式(Transformer)。

  • Additive:把同样这两个向量通过W^q W^k,得到q k,拼接这两个向量,然后输入到Activation Function,再通过一个Transform,然后得到\alpha

那你就要把这边的a^1 跟这边的a^2 a^3 a^4,分别都去计算他们之间的关联性,也就是计算他们之间的\alpha

image-20210404211656032

a^1 乘上W^qq^1,这个qQuery,它就像搜寻相关文章的关键字。接下来,a^2 a^3 a^4 要去把它乘上W^k,得到k 个Vector,k 个Vector叫做Key,那你把这个Query q^1,跟这个Key k^2,算Inner-Product就得到\alpha。我们这边用\alpha_{1,2} 代表说,Query是1提供的,Key是2提供的时候,1跟2他们之间的关联性\alphaAttention的Score,即Attention的分数,接下来也要跟a^3,a^4 计算

image-20210404211950882

a_3W^k,得到另外一个Key也就是k^3a^4W^kk^4,然后你再把k^3 个Key,跟q^1 个Query做Inner-Product,得到1跟3之间的关联性,得到1跟3的Attention,你把k^4 q^1 Dot-Product,得到\alpha_{1,4},得到1跟4之间的关联性。其实一般在实作时候,q^1 会跟自己算关联性

计算出a^1 每一个向量的关联性以后,接下来这边会接入一个Soft-Max

image-20210404212945356

这个Soft-Max跟分类的时候的那个Soft-Max是一模一样的,所以Soft-Max的输出就是一排\alpha,所以本来有一排\alpha,通过Soft-Max就得到\alpha',这边你不一定要用Soft-Max,用别的替代也没问题,比如说有人尝试过说用ReLU,结果发现还比Soft-Max好一点,Soft-Max是最常见的。接下来得到这个\alpha' 后,我们就要根据这个\alpha' 抽取出这个Sequence里面重要的资讯,根据这个\alpha 们已经知道说,哪些向量跟a^1 最有关系的,怎么抽取重要的资讯呢?

image-20210404213559086
  • 首先把a^1 a^4 每一个向量,乘上W^v 到新的向量,这边分别就是用v^1 v^2 v^3 v^4 表示

  • 接下来把这边的v^1 v^4,每一个向量都去乘上Attention的分数,都去乘上\alpha'

  • 然后再把它加起来,得到b^1


b^1=\sum_i\alpha'_{1,i}v^i

如果某一个向量它得到的分数越高,比如说如果a^1 a^2 关联性很强,这个\alpha' 到的值很大,那我们今天在做Weighted Sum以后,得到的b^1 值,就可能会比较接近v^2

所以谁的那个Attention的分数最大,谁的那个v 会Dominant你抽出来的结果

至此,从一整个Sequence 就得到了b^1

image-20210409092350116

从这一排 vector 得到 b^1,跟从这一排 vector 得到 b^2,它的操作是一模一样的。要强调一点是,这边的 b^1b^4,它们并不需要依序产生,它们是一次同时被计算出来的

怎么计算这个 b^2?我们现在的主角,就变成 a^2

image-20210409093744204
  • a^2 乘上一个 matrix,变成 q^2

  • 然后接下来根据 q^2,去对a^1 a^4 这四个位置,都去计算 attention 的 score

  • q^2k^1 做个这个 dot product

  • q^2k^2 也做个 dot product
  • q^2k^3 也做 dot product
  • q^2k^4 也做 dot product,得到四个分数

  • 得到这四个分数以后,可能还会做一个 normalization,比如说 softmax,然后得到最后的 attention 的 score,\alpha'{2,1} \space \alpha'{2,2} \space \alpha'{2,3} \space \alpha'{2,4} 我们这边用 \alpha' 示经过 normalization 以后的attention score

  • 接下来拿这四个数值,分别乘上 v^1 \space v^2 \space v^3 \space v^4

image-20210409094148657
  • \alpha'_{2,1}v^1
  • \alpha'_{2,2} 乘上 v^2
  • \alpha'_{2,3} 乘上 v^3
  • \alpha'_{2,4} 乘上 v^4,然后全部加起来就是 b^2


b^2=\sum_iα'_{2,i}v^i

同理就可以,由 a^3 乘一个 transform 得到 q^3,然后就计算 b^3,从 a^4 乘一个 transform 得到 q^4,就计算 b^4,以上说的是 Self-attention 它运作的过程。

矩阵形式的Self-Attention

我们现在已经知道每一个 a 都产生 q \quad k\quad v

image-20221125214408693

我们每一个 a,都乘上一个矩阵,我们这边用 W^q 来表示它,得到 q^i,每一个a 要乘上 W^q,得到q^i这些不同的 a 把它合起来,当作一个矩阵来看待

image-20210409100755718

一样a^2\space a^3\space a^4 都乘上 W^q 得到q^2 q^3 q^4,那你可以把 a1 到 a4 拼起来,看作是一个矩阵,这个矩阵我们用 I 来表示,这个矩阵的四个 column 就是 a^1a^4I 乘上 W^q 就得到另外一个矩阵,我们用 Q 来表示它,这个 Q 就是把 q^1q^4 这四个 vector 拼起来,就是 Q 的四个 column,所以我们从 a^1a^4,得到 q^1q^4 操作,其实就是I 这个矩阵,乘上另外一个矩阵 W^q,得到矩阵QI 这个矩阵它里面的 column就是我们 Self-attention 的 input a^1a^4W^q 是 network 的参数,它是等一下会被learn出来的Q 的四个 column,就是 q^1q^4

接下来产生 kv 的操作跟 q 是一样的

image-20210409101331347

所以每一个 a 得到q\quad k \quad v ,其实就是把输入的这个,vector sequence 乘上三个不同的矩阵。

下一步是,每一个 q 都会去跟每一个 k,去计算这个 inner product,去得到这个 attention 的分数

那得到 attention 分数这一件事情,如果从矩阵操作的角度来看,它在做什么样的事情呢

image-20210409102703364

你就是把 q^1k^1 做 inner product,得到 \alpha_{1,1},所以 \alpha_{1,1}q^1k^1 的 inner product,那这边我就把这个,k^1 背后的这个向量,把它画成比较宽一点代表说它是 transpose

同理 \alpha_{1,2} 就是 q^1k^2,做 inner product, \alpha_{1,3} 就是 q^1k^3 做 inner product,这个 \alpha_{1,4} 就是 q^1k^4 做 inner product

那这个四个步骤的操作,你其实可以把它拼起来,看作是矩阵跟向量相乘

image-20210409102832459

这四个动作,你可以看作是我们k^1k^4 拼起来,当作是一个矩阵的四个 row

那我们刚才讲过说,我们不只是 q^1,要对k^1k^4 计算 attention,q^2,q^3,q^4 要对 k^1k^4 计算 attention,操作其实都是一模一样的

image-20210409103622596

所以这些 attention 的分数可以看作是两个矩阵的相乘,一个矩阵它的 row,就是 k^1k^4,另外一个矩阵它的 column。

我们会在 attention 的分数,做一下 normalization,比如说你会做 softmax,你会对这边的每一个 column 做 softmax,让每一个 column 里面的值相加是 1,之前有讲过说,其实这边做 softmax不是唯一的选项,你完全可以选择其他的操作,比如说 ReLU 之类的,那其实得到的结果也不会比较差,通过了 softmax 以后,它得到的值有点不一样了,所以我们用 A',来表示通过 softmax 以后的结果。

我们已经计算出 A',那我们把这个v^1v^4 上这边的 \alpha 以后,就可以得到 b

image-20210409105513608

v^1v^4 成是V 这个矩阵的四个 column,把它拼起来,然后接下来你把 VA' 的第一个 column 以后,你得到的结果就是 b^1

如果你是用矩阵操作的角度来看它,就是把A' 的第一个 column 乘上 V,就得到 b^1,然后接下来就是以此类推

image-20210409105935046

就是以此类推,把 A' 的第二个 column 乘上 V,就得到 b^2A' 的第三个 column 乘上 V 就得到 b^3A' 的最后一个 column 乘上 V,就得到 b^4

所以我们等于就是把 A' 这个矩阵,乘上 V 这个矩阵,得到 O 这个矩阵,O 这个矩阵里面的每一个 column,就是 Self-attention 的输出,也就是 b^1b^4

整体回顾Self-attention的矩阵操作

image-20210409110638357
  • I 是 Self-attention 的 input,Self-attention 的 input 是一排的vector,这排 vector 拼起来当作矩阵的 column,就是 I

  • 这个 input 分别乘上三个矩阵,W^q W^kW^v,得到 Q K V

  • 这三个矩阵,接下来 Q 乘上 K 的 transpose,得到 A 这个矩阵,A 的矩阵你可能会做一些处理,得到 A',那有时候我们会把这个 A',叫做 Attention Matrix生成 Q 矩阵就是为了得到Attention的score
  • 然后接下来你把 A' 再乘上 V,就得到 OO 就是 Self-attention 这个 layer 的输出,生成V 为了计算最后的b,也就是矩阵O

所以 Self-attention 输入是 I,输出是 O,那你会发现说虽然是叫 attention,但是其实 Self-attention layer 里面,唯一需要学的参数,就只有 W^q W^kW^v 而已,只有W^q W^kW^v 未知的,是需要透过我们的训练资料把它找出来的。但是其他的操作都没有未知的参数,都是我们人为设定好的,都不需要透过 training data 找出来,那这整个就是 Self-attention 的操作,从 IO 就是做了 Self-attention。

评论