ViT (Vision Transformer) ---- SimpleRNN + Self-Attention

首先attention第一次是在2015年应用在Seq2Seq模型上的,该模型有两个网络一个是Encoder,一个是decoder,后来研究者们发现,attention不仅仅可以应用到Seq2Seq模型上,还可以应用到所有的RNN模型上,该研究是在2016年发表的一篇文章,比attention晚一年(Cheng, Dong, & Lapata. Long Short-Term Memory-Networks for Machine Reading. InEMNLP, 2016),这篇论文是把attention应用到LSTM即自注意力机制,这里使用simpleRNN进行替换,方便理解原理和大意,这里需要注意的是,这是单个RNN模型,不是seq2seq模型。

ViT (Vision Transformer) ---- SimpleRNN + Self-Attention_第1张图片

上图是简单的RNN网络,其中计算输出的状态h_t是通过输入x_t和上一个输出状态h_t-1 concat,然后乘上矩阵A,在经过tanh激活函数获得h_t,那么使用自注意力机制如何做呢?

ViT (Vision Transformer) ---- SimpleRNN + Self-Attention_第2张图片

在没有注意力机制的simpleRNN就散输出状态的方法很简单就是通过把输入x_t和上一个状态的输出S_t-1进行concat,然后乘上参数矩阵A,在通过tanh激活函数就可以获得x_t的输出S_t了,那么增加注意力机制如何更新状态的呢?

其实很简单如上图的①,增加了一个额外的状态contextion 参数C_t-1和输入x_t进程concat,得到的向量乘上参数矩阵A,然后经过tanh激活函数就可以获取到当前的状态h_t了,和simpleRNN的唯一区别就是把状态h_t-1换为c_t-1,其他第一样。

算出当前状态h_t后,需要计算contextion 参数C_t,首选使用当前的状态h_t去和之前的所有状态h_1,h_2,h_3,,,,,h_t-1求相关性α如上图的②方式,获取每个状态的相关性后,在通过加权求和获取到C_t如③,那么这个求取相关系数的方法是什么呢?可以看上一篇文章。

同理按照上面的方法,分别求出所有的状态。

总结:

RNN 都具备遗忘的特性,

Attention 解决了遗忘,因为每个状态的输出都需要看一遍之前的状态,

例子:

ViT (Vision Transformer) ---- SimpleRNN + Self-Attention_第3张图片

红色单词是输入,蓝色部分是相关性的值,例如当输入run的时候,计算当前的C的时候,使用当前的h和之前的状态计算相关性,发现和FBI、a、on相关性比较大

你可能感兴趣的:(深度学习,transformer,深度学习,自然语言处理)