李宏毅transformer学习总结(一)Self-Attention机制

@TOC
最近transformer在cv行业大火,在数据量充足的情况下,各项指标力压CNN。我比较好奇transformer是如何工作的,于是去看了李宏毅老师的机器学习课程,在此帖写下自己的感悟和心得。

Self-Attention机制

讲到transformer,就不得不先学习Self-Attention的机制。Self-Attention是为了语音识别和文字识别的功能而引出的,一种将前后文信息结合起来作为网络输入的机制。

上下文信息的引入

如图1,在没有Self-Attention的情况下,每个FC层的输入仅仅只有一个单词本身,这样会带来一个问题,I saw a saw(我看到了一把雨伞)这句话中出现了两次saw,如果没有提取上下文的信息,那么机器对两次输入的saw的映射应该是相同的,这跟我们的想要的结果不同,因此,我们必须在网络的输入中加入上下文的信息。如图2。
李宏毅transformer学习总结(一)Self-Attention机制_第1张图片

李宏毅transformer学习总结(一)Self-Attention机制_第2张图片

如何加入上下文信息

那么我们如何在网络中引入上下文信息呢?
我们把每个输入×三个矩阵,变成q1,k1,v1,算出q的目的是与其他输入(包括自己)的k矩阵做运算,得到其他输入的位置等信息a‘,然后再×v矩阵,并求和得到b矩阵,而b就是self-attention的输出。
李宏毅transformer学习总结(一)Self-Attention机制_第3张图片
用矩阵描述就是这样:I是SA(self-attention)层的输入,×三个矩阵变成Q,K,V,然后K的转置×Q,得到A,再经过一系列的变换变成A’,再V×A‘就得到了SA层的输出
李宏毅transformer学习总结(一)Self-Attention机制_第4张图片
上下文的信息其实也包括位置信息,因此SA层在上面的基础上还要加一个偏置(positional encoding)作为位置信息:
李宏毅transformer学习总结(一)Self-Attention机制_第5张图片
这个位置信息可以是多种多样的,也有很多人发了很多paper,提出了很多种ei的形式。

引入上下文带来的问题:计算量

当一句话有很多个单词的时候,我们想给每个输入都加上整句话的上下文信息,那么这个步骤的计算量是巨大的。因此,我们有一种解决方案:只给每个输入加上局部的上下文信息,这样既不会造成单一映射的情况,也不会增城计算量过大。
其实这种思想很像cnn里面的卷积核的思想,就是每个卷积核只负责很小的一个板块(目标的一小部分特征),并且卷积核提取的也是图片的一小部分,跟这里的Self-Attention机制很像。使用我们得出结论:cnn其实是Self-Attention的一种特例。

与其他神经网络的比较

CNN:

对于CNN来说,卷积核的大小是我们认为设定的,而对于Self-Attention来说,与某个像素有关的其他像素完全可以自己学习出来,也就是说,self-attention的’卷积核‘其实不必是一个矩形,可以是各种各样的形状,也有可能是离散的两个区域。
总体来说,如果数据体量很大,那么self-attention完全可以在指标上超越CNN,但是如果数据体量比较小,那么还是规定卷积核形状的CNN在指标上更甚一筹。

李宏毅transformer学习总结(一)Self-Attention机制_第6张图片

RNN:

与RNN相比,最大的不同在于输出的方式。RNN是把已有的输出作为输入,一环扣一环产生的,但是self-attention是并行产生的(前文中矩阵运算那张图,考虑了上下文的信息),比RNN更加有效率

总结

突然发现坑有点大,一上午连复习带码字,根据有些忙不过来了,先写这么多,有时间再继续整理。
总体来说,self-attention就是一种把上下文的信息也作为每个输入的一部分的结构,其输入是一串序列,输出也是一段序列,只不过这段序列已经带有了上下文信息。

你可能感兴趣的:(Transformer,深度学习,人工智能,机器学习)