目录
介绍
我根据台大李宏毅21年机器学习课程 self-attention和transformer_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili做的笔记
感叹:哇~这个老师讲解的果真好,通透,细致,醍醐灌顶,有些地方甚至妙绝!!~ 后面看看如果有时间考虑将所有的课程都看一遍
怕后面会遗忘,简单记录一下,方便以后翻翻看看~
这个课程是2021年的课程,老师说里面提到的论文也是比较新的论文
Self-attention
通俗理解
将self-attention和FC交替使用,self-attention处理全局信息,FC专注于处理局部的信息
下面只讲了得到b^1的过程,b^2~b^4同理可得
如何计算两两之间的α(关联性),下面有两种方式,课程以点积举例
自己和自己也会计算关联性α_i,i
做归一化(但这里不一定要做归一化,可以用别的东西,比如Relu)
基于attention score 提取信息
b^1~b^4并行得到
矩阵运算的角度
下面从矩阵乘法的角度重新讲一下self-attention的过程
先是q矩阵
同理可得k,v
接下来每一个q都会跟k做inner-product得到attention score
同理可得a_2与其他的attention score
得到全部两两的attention score
然后对每一个column做softmax
计算b^1(图片中有个错误,α^hat应该为α'才对)
得到整块全部的
完整的矩阵运算过程如下所示:
I:input matrix O: output matrix
self-attention 需要学习的参数只有这三个W:
Multi-head Self-attention
应该存在不同种类的相关性 ,让不同的q负责不同种类的相关性
下面以2个头为例
先和之前一样得到q^i,然后让q^i分别乘上两个矩阵W^q,1和W^q,2得到两个q
同理可得到两头的 k 和 v
然后同一个头内算attention score就可以了
而后 attention score (a'^i,1)和 v (v^i,1)做inner-product最后求和得到b^i,1
同理第二个头:
然后会将 b^i,1 和 b^i,2 做一个拼接,乘以一个矩阵,得到b^i,作为下层的输入
融合位置信息
但是到目前为止,self-attention layer缺少一个很重要的信息,位置信息 (想想看一个句子中单词出现是有顺序的,这个次序对于语义表达很重要)
下面就是改进这一点,加入位置信息,具体做法是把位置信息单独用一个向量e^i来表示,将e^i加到a^i上
最开始位置编码是人为设定的,通过一定的规则(sin cos)产生的,每一列代表一个位置信息/位置向量(position vector)
position encoding的方法不一定非要按照上面那样得出,也可以设计别的方法来实现,这个是尚待研究的一个点,这个位置信息甚至可以学习得到。
positional encoding的目前的技术方法
self-attention 的应用
1. NLP(Transformer 和 Bert···)
2.语音
它还可以用在语音问题上, 数据量很大
truncated Self-attention
3.图像
图像上的应用,图像可看做vector set
每一个pixel是一个3维向量,整张图片就是5×10个向量
这是用Self-attention做图像处理的最新工作
4.图、网络(graph)
只计算有连接的node pair的attention score
其他没连接的node pair(很可能暗示它们之间没关系),简单的做法是置位0,
当然也可以根据领域知识来构造Attention Matrix
老师说水很深,不细讲了,放出了下面二维码
Self-Attention v.s. CNN
(Self-Attention是对全局,CNN是对窗口,是局部的 )
-
CNN是简化版的Self-Attention
-
Self-Attention是对CNN的复杂化
Self-Attention在全局中找到相关的pixel,就好像CNN中的窗口(reception field)是自动学出来的一样
李宏毅老师在视频中说的这句话真哇塞,醍醐灌顶,简直妙绝!!!~~ 你品,你细品~
Self-Attention选择的范围是全局,他自己决定哪些pixel是重要的,非常相关的,所以它选择的窗口是隐形的,没有具体边界的,是学习出来的,不再像CNN那样需要人为设定了
这篇paper(19年的)里用数学严谨论证了CNN其实就是Self-Attention的特例
更flexible的model训练的时候需要的data量要大,否则会overfitting
Self-Attention更适合大数据集,CNN更适合小数据集
一篇论文做的实验,横轴是数据量,纵轴是性能,也验证了这一点
Self-Attention弹性比较大,需要比较多的训练数据
self-attention v.s. RNN
-
相同点:都是输入一串vector然后输出一串hidden vector,然后每个hidden vector都和 FC layer相连接
-
不同点:单向RNN每一步都只包含左边的信息,而self-attention考虑了全局信息,但如果是双向RNN,那么每个hidden vector也可以视为考虑了全局信息
但是两种结构如果都拿最后黄色hidden vector作比较的话还是有些不同,因为对于RNN来说,最左边的输入(红框框起来的紫色输入),必须经过长链一路不被遗忘,才可以将这部分信息携带进最后黄色hidden vector中去,所以它很难考虑到最左边的输入,而Self-Attention则不是这样。
还有一个不同点:RNN也不能并行计算,self-attention可以并行计算,计算速度更快
综上,所以现在很多work都抛弃RNN架构,将其替换成为Self-Attention来做了
下面这篇paper(20年6月)探究了Self-Attention加上什么东西后就变成了RNN,探究了两个之间的关系
Self-Attention 的变形
下面的文章,比较了不同Self-Attention的变形
Self-Attention最主要的问题是运算量非常大,怎样减少Self-Attention的运算量是未来研究的一个重点
Self-Attention现在的变形都叫做XXformer,最早的Self-Attention是用在Transformer上,现在的XXformer虽然运算速度快了,但是效果不如以前的好,怎样设计出一个又快又好的模型是Self-Attention研究的一个重点
真不戳!哈哈哈哈 嗝儿e~~
有时间把整套课程我感兴趣的其他部分再see see