Lectured by HUNG-YI LEE (李宏毅)
Recorded by Yusheng zhao(yszhao0717@gmail.com)
- 致力于解决输入为一组向量的深度学习任务。
例如👇)——作业一自然语言处理
作业二——声音讯息👇
作业三——图👇,每个节点都可以是一个向量,包含了人物的社交信息
分子也可以看作“Graph”:(这里化学元素每个原子用one-hot表示)
输出的形式多样:
每个vector各自输出一个label:比方说文字处理中的词性标注、语音音素分类、社交网络标签
一整个sequence输出一个label:比方说:情感分析、语者辨认、给一个graph输出一个label
模型自己决定输出label的数量——seq2seq任务,例如:翻译、完整的语音辩识
即上文输入和输出数目一样多的情形。
注意到,对于单个输入vector要关注它的上下文信息。但是,以某个vector为中心,为了cover整个sequence,开一个一定尺寸的窗口输入全连接层中——参数巨多而且有可能overfitting。Self-attention被用来化解这个困难。
FC = Fully Connected Layer
Self-attention考虑到整个sequence的信息,有多少输入self-attention就有多少输出。模型中经常使用FC和Self-attention交替使用。Attention is all you need
Self-Attention的每个输出都考虑了所有的输入。以为例:
首先根据找到跟相似的向量(找到整个sequence里面哪些部分是重要的哪些部分和同一个level、决定回归结果数值或者来分类结果class所需要的信息);每一个向量和关联性的值用表示
这个Self-attention的module怎样自动决定两个向量的相关性?以下给出计算两个向量相关性的模组。
上述比较常见的做法——Dot-product:输入的这两个向量(需要计算关联度)分别乘上两个不同的矩阵和,得到两个向量和,然后这两个向量做element-wise相乘,得到。
上述另一种计算方式——Additive:同样地把这两个向量(需要计算关联度)分别乘上两个不同的矩阵和(inner-product),得到两个向量和;再然后把这个两个向量串起来,扔进激活函数,然后通过一个Transform再得到。(是随机初始化的,然后训练出来的)
在本文中用到的方法默认为左边的Dot-product
在Self-attention中,分别用和、、求得对应的——attention score。求法如下:
再把算出来的通过处理:
:
不一定要用Softmax,只要是激活函数,有人用Relu效果也很好。
Extract information based on attention scores.根据这些去抽取出整个sequence中比较重要的咨询。
把乘上得到新的向量。然后,再把每个乘上,然后再把它们加起来。
上边谁的值最大,谁的那个Attention的分数最大,谁的那个就会dominant你抽出来的结果。举例说:上述中如果支计算出来的值最大,那么就最接近。
在做attention的时候,我们需要计算query()和某个key()的分数(相似度),常用方法有:
Self-attention就是一排input的vector得到相同数量的output的vector。计算中涉及到三个Transform矩阵是network的参数,是学习(learn)得来的,可以看作是带有权重的,以下认为是self-attention的矩阵运算。
每一个self-attention层只有一个矩阵。
然后为了得到得分,计算内积👇
同理👇
不是唯一的选项,也可以用其他激活函数。
接下来👇
这一串操作全是矩阵运算,不用加循环体,方便编程。把上述过程可以精简为👇
称之为Attention Matrix。在整个Self-attention中输入是,输出是,其中又只有是未知的,需要透过训练集(training data)学习得到。
self-attention进阶版——Multi-head Self-attention
为什么我们需要多一点的head呢?——关系中蕴含着不同种类的关联性,以下 2-head
为例:
我们需要两种不同的相关性,所以需要产生两种不同的head,都有两个,另外一个位置做相似处理。head 1和head 2相对独立,分开做,如上图,只和运算。
缺陷——self-attention少了关于位置(上下文)的资讯,因此一下介绍相关的完善方法。
这篇论文讨论了Positonal Encoding的生成方法。
inner product
,算力和memory的压力很大。Truncated Self-attention被设计用来在只看一个小的范围(范围由人设定)而非整句话,以加快运算速度。self-attention for Image:
一张图片可以看作是一个vector的set
例如上图:每个位置的pixel都可以看作是一个三维的vector,所以这张图片是一个的vectors set。self-attention处理图片的工作的例子:Self-Attention GAN、DEtection Transformer(DETR)
self-attention for Graph:
在Graph里,每个node看作一个向量(保存有相关的信息);另外,graph里还有edge的信息。哪些node相连——哪些node有关联性:因此,邻接矩阵表示了在做self-attention的计算时,只需要计算相连的node之间的关联性就好了。
没有相连的nodes之间就不用计算attention score了,可设置为0,因为这些可能是domain knowledge暗示下的这种nodes间没有关系。
由此,提出了一个很fancy的network:Graph Neural Network (GNN)图神经网络。老师表示水很深,把握不住,感兴趣可以另外自行学习。
CNN可以看作是一种简化版的Self-attention,它只关注于receptive field;而self-attention则关注整张图像。self-attention看作是复杂化的CNN,用attention找到有关联性的pixel,仿佛是network自动learn且决定自己的“receptive field”(不再是人工划定)
On the Relationship between Self-Attention and Convolutional Layers用数学的方式严谨的证明CNN是self-attention的一个特例。self-attention设定特定的参数就可以做到和CNN一样的事情。
由于self-attention相较于CNN更加flexible,为了避免过拟合,需要更多的数据才能达到更好的效果。而CNN在训练资料较少时表现相对较好,因为随着数据增多,CNN并没有得到更多好处。
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale这篇文章用self-attention处理影像,它把一张图像拆成个patch,把每个patch当作一个word处理。(当然这个数据集量一般研究者很难搜集到,这篇文章来自Google)
Conformer:一个CNN和Self-attention的混合体。
RNN:Recurrent Neuroal Network(循环神经网络)和self-attention一样都是处理input是一个sequence的状况,在第一个RNN里扔进input第一个vector,然后output一个东西hidden layerFCprediction,对于第二个RNN需要input第一个吐出来的东西以及input第二个vector再output东西,以此类推,如下图👇
当然,RNN可以是双向的。两者不同的地方:对于RNN而言,距离较远的两个vector,如果前者不被memory一直记忆到输入处理后者的网络,两个向量很难产生关联性;而再attention里,输入向量是平行的,输出向量是平行的,只要match到,就可以产生任意两个向量的关联性。——天涯若比邻,aha
所以目前来看attention优于RNN,许多RNN架构都改为attention了。进一步了解两者关系:Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention,attention加一点东西就会变成RNN。
Self-attention有非常多的变形:Long Range Arena: A Benchmark for Efficient Transformers、Efficient Transformers: A Survey
由于self-attention最大的问题就是运算量大,所以未来相关的问题很多关于如何变形以减少运算量,提高运算速度。如何使attention越来越好,也是未来尚待研究的问题。