最近在看注意力机制,开始是从Google 2017年的那篇Attention is all you need的论文读起,在大概了解了自注意力机制以后,还是有很多疑问,所以就查阅了很多资料,试图梳理一下注意力机制的发展脉络。下面列出的参考资料都是我认为很不错的内容,统一在开篇列出。本文并不涉及太多深入的讲解,更多的是想从宏观的角度出发,对注意力机制的发展过程做一个简要的梳理,比如每一个阶段遇到什么问题?是如何解决的?解决的方案本身又存在什么问题?正是这些问题推动了它的进一步的发展。
参考资料:
-
论文:
① [attention is all you need] https://arxiv.org/abs/1706.03762
② [A Survey on Visual Transformer] https://arxiv.org/abs/2012.12556
③ [Attention Mechanism. 2015.ICLR] https://arxiv.org/pdf/1409.0473.pdf
-
文章:
① https://mp.weixin.qq.com/s/hn4EMcVJuBSjfGxJ_qM3Tw
② https://samaelchen.github.io/deep_learning_step6/
③ https://www.jianshu.com/p/b2b95f945a98
④ https://zhuanlan.zhihu.com/p/50915723
⑤ https://blog.csdn.net/qq_32241189/article/details/81591456
⑥ https://blog.csdn.net/u014595019/article/details/52826423
⑦ http://jalammar.github.io/illustrated-transformer/
⑧ https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html#self-attention
⑨ https://samaelchen.github.io/deep_learning_step6/
-
视频:
① https://www.bilibili.com/video/BV1Wv411h7kN?p=23
② https://www.bilibili.com/video/BV1Wv411h7kN?p=24
③ https://www.bilibili.com/video/BV1Wv411h7kN?p=27
1. Background:
对于卷积神经网络CNN来说,不论是图像分类、目标识别或者其他任务,每个输入的数据都是独立的,不同输入之间是没有联系的。但是在某些场景中,我们的数据就可能是有相互依赖关系的,这就是序列数据,比如在机器翻译中,语音识别或者视频处理等任务中,数据的前后会存在一定的依赖关系。
针对这种有上下文依赖关系的数据,提出了RNN这种网络结构,RNN的核心思想即是将数据按时间轴展开,每一时刻数据均对应相同的神经单元,且上一时刻的结果能传递至下一时刻。至此便解决了输入输出变长且存在上下文依赖的问题。
1.1 RNN:
最简单的RNN示例图:
其网络结构本质上是一个小的全连接循环神经网络,它的训练过程与一般的DNN网络训练方法类似,采用BP算法完成权重参数更新。而且需要注意的是 对于RNN网络来说,不同输入的对应的参数是共享的。
![image-20210512161549727](https://cdn.jsdelivr.net/gh/IYoreI/PicGo@main/img/image-20210512161549727.png)
1.2 Deep RNN:
深层循环神经网络(Deep RNN)是循环神经网络的一种变种。为了增强模型的表达能力,可以在网络中设置多个循环层,将每层循环网络的输出传给下一层进行处理。对于普通的RNN,每一时刻的输入到输出之间只有一个全连接层,即在输入到输出的路径上是一个很浅的神经网络,因此从输入中提取抽象信息的能力将受到限制。而对于Deep RNN如下图所示,在每一时刻的输入到输出之间有多个循环体,网络因此可以从输入中抽取更加高层的信息。和卷积神经网络类似,每一层的循环体中参数是一致的,而不同层中的参数可以不同。
![image-20210511195311618](https://cdn.jsdelivr.net/gh/IYoreI/PicGo@main/img/image-20210511195311618.png)
1.3 Bidirectional RNN:
对于一般的RNN网络,在t时刻的输出是考虑前面t-1个时刻的输入以及当前时刻的输入