李宏毅self-attention笔记

发布时间 2023-04-28 21:26:27作者: fxjwind

 

面对的问题是什么?

复杂输入,多个变长的向量

这里自然会想到RNN,后面会有比较

具体的场景,

可以是一段话,每个word一个向量,可以用one hot,但大多时候是用embedding

可以是一段印频,每25ms一个向量,按10ms滑动,可以看出音频的数据量是非常大的

也可以是一张图片。。。

输出当然有多种形式,这个和RNN也很像

但是我们这里只讨论第一种,输入n个向量,输出n个值

这种模型有多种选择,

最简单的,就是每个向量经过一个FC,得到一个值就好了,问题自然是没有上下文,比如例子I saw a saw,没法区分两个saw的不同

自然的改进,就是把上下文都传进FC,这里的window决定了context的大小,问题就在于window的大小如何选择

所以这里提出Self-attention模型

模型会对所有的向量,并给每个向量加上context,这个想法很直觉,问题是怎么做到的,参考Attention is all you need,名字霸气

注意模型是可以多层叠加的

首先定义attention

attention代表向量之间的相关性,有多种计算方法,最常用的是dot product,输入乘上参数矩阵后做点积

第一步,算attention score,query代表自己,key代表其他向量

第二步做归一化,soft-max是一种归一化方式,可以用其他

第三步根据attention值抽取各个向量信息,相关性越大attention越高,对应的向量在最终求和后的b中起的作用也越大

这样就把所有的context都融入到输入中,形成新的向量b

 这里只是把上面的过程,变成矩阵计算

最终需要学习的参数,只有那一组W

后面看下Self-attention相关的研究

Multi-head,多头,相关性可能有多种,所以要用多头来建模不同的相关性

Self-attention是所有向量一起算的,和RNN不同,后面还会讲到,这样高效

但是丢失了位置信息,所以这个研究希望加入positional encoding来建模位置信息

前面说了Speech,音频信息是非常大的

self-attention模型本身是计算量很大的,所以如果向量太长就有问题

所以这里的思路就是要truncated,就是要tradeoff,那准确率换性能

这里很有意思,和CNN比较

结论是,CNN是简化的self-attention,反之,self-attention是泛化的cnn

这个也很直觉,CNN只是考虑卷积范围内的context,而self-attention是考虑全部的context

越是泛化的模型,越是需要更多的数据集,所以后面的试验也证明Self-Attention需要更多的训练集来达到效果

 

这里比较和RNN,结论就是大部分情况下,Self-Attention是可以替换到RNN的,技术变化的真快,现在RNN已经是昨日黄花了

原因主要是,Self-Attention更高效,并行算的,而RNN是一个个算过去

RNN保留context的机制更加复杂,而Self-Attention是自然的获得所有的context

GNN,也可以用Self-Attention,这样只需要算有edge的节点间的attention,更高效

Self-Attention有很多的变种,因为它作为transformer的主要技术,变种都叫各种former

但是基本都是在准确率和计算效率之间做tradeoff