第六节 Self-attention

第六节 Self-attention

这个self-attention想要解决的问题是什么呢?

到目前为止,我们的network的input都是一个向量,不论是在预测中还是影像处理上,regression输出是一个scalar,classification的输出可能是一个class。

但若是遇到了更加复杂的问题呢?假设输入为一排向量a set of vectors呢,而且输入的向量是会改变的呢vectors may change length。每次给model输入的sequence的数目和sequence的长度都不一样的话呢?

scalar 标量。

Vector Set as Input

eg1: 词汇识别

在语义识别里,如果我们的输入是一个句子的话,每个句子的长度都不一样,词汇数目也不一样。将句子里面的每一个词汇描述为一个向量,用向量来表示的话,那么我们model的输入就会是一个vector set一组向量,而且这个set的大小每次都会不一样,因为句子长度不一样。

将词汇表示为一个向量的最简单的做法就是one-hot coding。但是向量的长度需要和全体词汇的总数相同,每一个维度对应一个词汇。

但是one-hot编码是假设所有类别之间没有关系的,应用到词汇的例子里就会是默认所有词语之间没有关系。但是事实上是存在关系的,比如cat, dog都是animal, 关系就比较近,但是与apple的关系就比较远。

另外一个方法叫Word Embedding.(词嵌入)。Word Embedding也是给每一个词汇一个向量,但是这个向量是有语义上的信息的。相似的词汇的向量间的距离会比较接近。

将词汇编成向量后,一个句子就是一排长短不一的向量。

eg2: 语音识别

一段的声音信号其实就是一排向量。将一段声音信号取出一段范围(这个范围叫做window),把这个window里的信息描述为向量。这个向量就叫做一个frame。在语音识别上一个向量vector被称为frame。

通常一个window的长度是25毫秒(minisecond)通过一些采样等手段将其化为frame。

为了描述完整这个声音信号,通常会把这个window再往右移动一点,通常10ms。这样的话1秒有1000毫秒,如此就需要1000/10个frame来描述一秒的信号。

eg3: Graph

一个图也是一堆向量。例如社交网络social network。在这个网络上的每个结点就是一个人。节点和节点之间的edge就是他们的关系。而每一个结点可以看作是一个向量,表示他profile(简介)的信息。

eg4: 分子

每一个分子可以看作是一个graph,分子上的原子视为向量,例如one-hot coding

Output 输出是什么

  1. 输入一组向量,每一组向量都带有一个label。所以模型的输入是多少向量,输出就是多少label。例如输入一个句子判断它的每个词的词性。
  2. 或者输入一组向量输出一个label,例如输入一个句子判断句子是正面含义还是负面含义。或者输入一个分子输出是否有毒。
  3. 输入一组向量,model自行决定输出多少label,这种任务又称为seq2seq,例如翻译,属于一种语言的句子,输出另一种语言的句子。

1. Sequence labeling 输入与输出数目相同

即给Sequence中的每个向量标注一个label。

不能使用原来的方法将向量单独的输入到只接受一个向量输入的模型中逐个计算label。因为这样会使得句子失去词语之间的前后联系。例如:I saw a saw。对于这种model来说两个saw含义相同,但事实并非如此。

所以要如何让一个fully connected network考虑到上下文的信息呢?

把向量按照顺序串联起来再输入。可以像上文中提到的语音辨识的window一样,给fully connected network一个window的向量使得他可以考虑上下文。但是这有极限。很难解决一整个sequence的问题,因为sequence的长短并不一样。但是如果开一个超级大的window,那样的话整个network将需要非常多的参数,不仅运算量大,还容易over fitting。

Self-attention就可以解决这些问题!

self-attention的输入是整个sequence。input几个vector输出就是几个vector。

在这里插入图片描述

图中的FC是fully connected network。

输出的四个vector是考虑了整个输入sequence的后得到的再把经过考虑得到的vector输入到FC中计算输出应该是什么。

这样通过self-attention处理后,fully connected network所考虑到的就是整个sequence的信息。

self-attention 不止能用一次。可以在FC之后得到FC的输出再做一次self-attention,重新考虑整个sequence的信息,在输入给另一个FC来得到最终结果。

attention相关最知名文章就是attention is all you need。其中提出了transformer

2. self-attention的运作机制

他的input就是一串vector。他可能是整个网络的输入也可能是某个hidden layer的输出。

他的输出需要考虑所有的输入。

产生 b 1 \bm{b^1} b1这个向量的步骤:

  1. 根据 a 1 \bm{a^1} a1找出sequence中所有与 a 1 \bm{a^1} a1相关的、能帮助判断 a 1 \bm{a^1} a1是什么label向量。每一个向量与 a 1 \bm{a^1} a1关联的程度用一个数值scalar标量 α \alpha α表示。
  2. 分别计算与

计算 α \alpha α的模组module(模块)将两个向量作为输入, α \alpha α作为输出。内部计算方法有很多,较为常见的是dot-product:将两个向量分别乘上不同的矩阵,得到 q , k \bm q, \bm k q,k两个向量,再把 q , k \bm q, \bm k q,k做dot-product,即把 q , k \bm q, \bm k q,k的每个元素对应相乘再相加。所得到的scalar就是 α \alpha α

还有一种方法叫additive:将两个向量分别乘上不同的矩阵,得到 q , k \bm q, \bm k q,k两个向量,再把 q , k \bm q, \bm k q,k串联成一个向量,然后经过一个activation function然后再通过一个transform矩阵得到 α \alpha α

最常用的还是dot-product。也是用在transformer中的方法。

具体计算方法如下图:

在这里插入图片描述

其中向量 q \bm q q叫query, k \bm k k叫key。

原始输入向量与 W q , W k \bm W^q, \bm W^k Wq,Wk矩阵相乘得到向量 q , k \bm q, \bm k q,k。将所得目标向量的 q \bm q q与自己和其他向量的 k \bm k k做内积inner product。得到自己和对应向量的对应 α \alpha α。这个 α \alpha α叫做attention score。

计算出所有的 α \alpha α后,通过一个activation function,得到 α ′ \alpha' α。图中所用为soft-max,但也可以用relu等。

得到 α ′ \alpha' α后,通过得到 α ′ \alpha' α来获取这个sequence的重要信息。根据 α ′ \alpha' α可以知道哪些向量与当前向量(图中示例为 a 1 \bm{a^1} a1)的相关性。

在这里插入图片描述

再用一个矩阵 W v \bm{W^v} Wv与各个向量相乘,得到向量 v \bm v v,然后将向量 v \bm v v与对应 α ′ \alpha' α相乘再求和,就得到了 b 1 \bm{b^1} b1

注意:图中的 W \bm{W} W都是参数,learn出来的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结self-attention计算过程(从矩阵角度)

在这里插入图片描述

3. self-attention进阶版:multi-head self-attention

head数量也是hyper parameter

为什么需要比较多的head呢?

在寻找向量之间的相关性的时候,使用q与别的k做运算。但是相关有很多种形式,所以需要多个q来表示不同种类的相关性,比如都是狗,和都是哺乳动物。

做法就是把向量 a \bm a a乘上矩阵得到 q \bm q q,再让 q \bm q q乘上另外两个矩阵分别得到 q 1 , q 2 \bm {q^1, q^2} q1,q2

同理得到 k 1 , k 2 , v 1 , v 2 \bm {k^1, k^2, v^1, v^2} k1,k2,v1,v2

在这里插入图片描述

在这里插入图片描述

最后将两个b经过矩阵transform得到最终输出b

但是通过上面的计算可以看出,self-attention没有向量之间的位置信息,谁前谁后不知道。

3. positional encoding

为了能识别位置信息,为每一个位置设定一个vector。叫做positional vector e i \bm{e^i} ei。上标i代表位置。不同的位置vector不同。然后将这个 e i \bm{e^i} ei与对应的 a i \bm{a^i} ai相加即可。这个 e i \bm{e^i} ei是通过一个function获得的,它可以是手动添加的,也可以是model学习得来的。
(如何得到这个positional encoding这是一个尚待研究的问题,还不知道哪个最好)

transfer和bert都有应用self-attention,被广泛应用在自然语言处理中。

应用

也不光可以用在nlp上,语音辨识也可以。

所计算的attention matrix的复杂度是长度的平方。想要得到 A ′ A' A需要L*L次的inner product。如果L很大,对计算量和存储器的要求都很高。

而语音辨识中一句话所包含的向量非常多,L非常大,这里利用truncated(缩短的) self-attention,即只看一个小范围.

self-attention也可以用在图像识别中. 一张图片也可以看作一组向量. 把每个图片的每一个pixel(像素)看作一个通道数维度的向量, 例如rgb图像的每个pixel就是一个三维向量.

应用self-attention在图像识别中的例子:self-attention GAN, DEtection Transformer(DETR)

Self-attention 与 CNN 的差异和联系

在这里插入图片描述

RNN v.s.self-attention

什么是RNN: 与self-attention一样要处理一组向量的输入sequence

self-attention for graph

在已知不同结点之间是否有edge的情况下,self-attention只需要计算有edge相连的两个代表结点的向量之间的关系即可.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值