Self-attention

dctwan / 2023-05-18 / 原文

1.问题提出

全连接神经网络(FCN),可以很好的处理输入为1个向量(特征向量)的情况,但是如果输入是一组向量,FCN处理起来不太方便

以词性标记的问题为例

image-20230518103805431

对于处于同一个句子中的相同的2个单词saw,词性不同,前者为动词(V),后者为名词(N)

如果尝试使用FCN去解决这个问题,将每个单词转化为向量输入FCN,对于相同的2个单词,FCN的输出应该是相同的,不能根据单词在句子中所处的不同位置做出判断,FCN只关注外表

2.Self-Attention

2.1 定义

整体结构如下

image-20230518104232849

这样的结构可以叠加多层

image-20230518104446870

Self-attention内部结构如下

image-20230518104715685

输入原始向量\(\vec{a}\),经过Self-attention后输出经过处理的向量\(\vec{b}\)是考虑所在向量序列的上下文的输出

2.2 工作原理

2个向量的关联程度\(\alpha\)计算如下,即attention score

image-20230518104944170

分别计算\(a^1\)\(a^1\)\(a^2\)\(a^3\)\(a^4\)的关联程度\(\vec{\alpha_1}\),再经过softmax得到\(\vec{\alpha_1^\prime}\)

image-20230518105140493

再求出\(\vec{v}\),和刚刚求得的\(\vec{\alpha_1^\prime}\)作内积(加权求和),即得输入\(\vec{a^1}\)考虑上下文之后得最终输出\(\vec{b^1}\)

image-20230518105523336

以上处理是对向量\(\vec{a^1}\)输出\(\vec{b^1}\)的处理过程,同理对\(\vec{a^2}\)\(\vec{a^3}\)\(\vec{a^4}\)也做类似的处理,可得\(\vec{b^2}\)\(\vec{b^3}\)\(\vec{b^4}\)

2.3 矩阵表示

由输入向量序列得到Q、K、V矩阵

image-20230518111818120

attention score计算

image-20230518111929315

输出计算

image-20230518112005961

整体结构如下

image-20230518112057550

2.4 直观理解

  • 理解1:针对某一个具体得问题,对于向量序列中的某一个向量,比如\(\vec{a^1}\),如果\(\vec{a^1}\)和另外一个向量\(\vec{a^i}\)的关联程度比较大,则计算出来的attention score就比较大,加权求和得到最后的输出向量,就和\(\vec{a^i}\)比较相近
  • 理解2:q(query)、k(key)、v(value)
    • q,可以理解为要查询当前向量,想要或者其和序列中哪个向量关系更紧密
    • k,可以理解为对其他向量提取了一个关键字,用于和q计算关联程度
    • v,可以理解为其他向量对于最后输出向量的贡献值,(k,v可以结合起来考虑,类比键值对的概念理解)

3.multi-head Self-attention

为什么需要multi-head Self-attention?

一组权重\(W^q\)\(W^k\)\(W^v\),对应了输入序列中的一中关系,可能存在多种关系,所有需要多组参数,称之为multi-head

image-20230518112205868

4.Positional Encoding

上述Self-attention并没有考虑当前输入向量在整个输入向量序列中的位置关系,考虑对输入向量加上一个位置向量

位置向量\(e^i\)可以是手工设计的,也可以是从数据中学习出来的

image-20230518112514824

5.Self-attention vs RNN

RNN也用来处理向量序列输入,和Self-attention相比,最主要的区别是RNN不能并行处理,输出之间存在依赖关系,而Self-attention可以用矩阵的方式表达,是可以并行处理的。此外,如果RNN要考虑第一个向量和最后一个向量之间的关系,要传递很多次memory,比较难,而Self-attention任意两个向量之间是通过计算attention score衡量联系程度的,所以远距离向量之间的关系比较容易得出。

image-20230518112653640