【cv炼丹炉】史上最简单的视觉transformer介绍(一)
2021快过半了,transformer在视觉方向的文章层数不穷。 搞得好像如果你还没搞transformer,就不是一个算法团队似的。transformer就好比是电动车,现在缺陷还比较明显,你现在不想开它,但是你知道他未来一定会来的,而且是巅峰性的,内卷促使它改进的速度比想象的还要快。
所以呢,在福报的空隙,你就得花时间研究他。博客准备分四篇完成:
- 首先介绍下transformer的基本单元:self-attention
- transformer网络结构
- 然后介绍下vision transformer的代表性工作,vision transformer ViT & swin transformer
- 最后解读下好的工程实现代码
———————-------— 假装是分割线 ——————————————
self-attention
attention is all u need, 这篇文章2017年首次在NLP提出来的经典模型 transformer,现在比较火热的Bert也是基于此。Transformer模型使用了self-attention机制,彻底抛弃了RNN的顺序结构,是的模型可以并行训练。
1. 学姐们如何处理序列数据?
我没有学长,只有学姐
在学校的时候,主要的研究方向就是时间序列,那时候要处理一个sequence,常用的就是RNN,像下图所示,输入是vector sequence,输出也是,看上去很完美。但是RNN的缺点,是不容易并行化。假设我们要得到b4,就要先看a1 看a2 看a3 看a4,最终得到了b4。对这个问题,也有人想到了,用CNN代替RNN,有兴趣去看下李宏毅的ML课程。
备注:以下图片全部来自李宏毅老师胶片
来源:https://zhuanlan.zhihu.com/p/171875438
既然我们的题目叫self attention,那今天的重点是,我们要设计一个新的layer,取名字叫self-attention,输出、输出和RNN保持一致,并且可以解决RNN最大的问题,并行化计算。
来源:https://zhuanlan.zhihu.com/p/171875438
2. self-attention具体要怎么做呢?
具体的做法就不说了,到知乎上查查吧,看图也行。这里只想讲讲为什么要这么做?
首先从x1-x4到a1-a4 ,经历了一次word embeding 或者 随机初始化,比如 x1-x4 是 “天才少年” ,那么 a1-a4就是四个512维的vector
然后a1-a4又分别乘以三个不同的矩阵(transformer matrix),得到q k v,那么问题来了,q k v是干嘛的的?
来源:https://zhuanlan.zhihu.com/p/171875438
先看公式(请忽略字母大小写):
忽略大小写,以下每个操作都能和上面这个公司对应起来。q 点乘 k 是能代表两个向量的相似度,衡量两个向量相似度有多少(点乘),就是attention,你品,你细品。所以上图中每个q 会对每个k 去做attention,也就是点乘。另外,除以dimension相当于归一化。因为,点乘和 q 和 k 的维度呈正比。
然后进行softmax操作,然后和v1-v4都乘,然后加起来,最终得到b1,你看看,这样一来,计算b1的过程中,用到了整个sequence的信息。同样的,得到了b2-b4。
来源:https://zhuanlan.zhihu.com/p/171875438
那为什么说这个过程是可以并行的呢,因为整个计算都是可以依靠矩阵表述的。见下图:
来源:https://zhuanlan.zhihu.com/p/171875438
好 Q K V是学习得到的参数,实际用的时候,其实是多套参数,也就是Q1 Q2 Q2;K1 K2 K3;V1 V2 V3, 即multi-head attention。最终得到 多个b系列,即多个attention head,把这些b contat起来,再乘以一个matrix,得到最终的b 和输入维度保持一致。
为啥要这样做呢:
1. 效果好
2. 猜测原因:把word映射到不同的子空间,捕捉到更细节的信息。
3. positional encoding
上面的attention layer 没有考虑位置信息,换句话说,生活欺骗了你 和 你欺骗了生活 效果一样,因为没有考虑位置信息。所以 ,为了解决这个问题:
引入了位置编码(position embeding, PE),先看公式
假设 天才少年 四个字,假设pos 代表 天,那么 天 的位置编码是:
2i 表示偶数位,2i+1 表示基数位
还记得前面说的么,每个字,embeding到一个512维的vector。同样的,天 的位置编码 也是一个512维的向量。然后把embedding和PE加起来,得到最终的vector
问题来了,位置编码 为什么要用sin cos表示呢?仔细看下面这段话,没看懂就多看几遍。
4. 下期预告
理解了self attention基本单元,transformer的网络结构就超简单
- 点赞
- 收藏
- 关注作者
评论(0)