Self-attention + transformer 和其他一些总结


首先感谢台大李宏毅老师和[b站up主凉饭爷上传的视频](台大李宏毅21年机器学习课程 self-attention和transformer_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili)。

之前自己也有看过原论文,看的懵懵懂懂,然后由于看到了CCnet(Criss-Cross Attention for Semantic Segmentation 十字交叉注意力机制),于是又回过头来看注意力机制。

于是就有了下面的自我总结的笔记吧。


首先transformer是首先应用于 NLP问题上的,自注意力机制是其中尤为关键的一个组成部分。

先简单介绍一下NLP是如何进行transformer的;

NLP的三种输出情况:

  1. 每一个词向量对应一个标签
    对于第一个例子,则是输入一句话得到句子中的所有词汇的词性。
    对于第二个例子,是输入一段音频,期望的输出是每一个的音标结果。
    第三个例子,则是通过用户画像的词向量,期望的输出是判断是否用户会购买。

  1. 一个完整的序列对应一个标签

  1. 让机器模型自行决定输出的结果.


具体实现过程

  1. 进行词编码,将词变成向量(下面的两种方法:

一种是全部所有的单词进行编码,假如有5000单词需要进行编码,那么就下面的one-hot Encoding 的编码长度就为5000.这样的编码方式很明显对算力的要求高,同时没有相关类别的语义关联信息

二是Word Embedding 词嵌入,在上一种方法的基础上进行改进的,将文本空间中的某个word,通过一定的方法,映射或者说嵌入(embedding)到另一个数值向量空间(之所以称之为embedding,是因为这种表示方法往往伴随着一种降维的意思。能够包含语义关联信息,如下图所示)

  1. 将一个连串的句子的词向量依次作为输入进入Self-attention模块,然后通过attention模块产生同样大小个数的包含了上下文语义信息的词向量序列。之后进行全连接层(FC)得到每一个向量对应的label.

Self-attention的具体内部执行:

以α1 为例:

通过进行矩阵运算,生成对应的query,key,value向量

q1 = Wq α1

k1 = Wk α1

v1 = Wv α1

然后计算α{1,2,3,4} 之间的相关性,通过 q1 与 k{1,2,3,4} 得到α1,1 α1,2 α1,3 α1,4 这些实际上就表示了 词向量α{1,2,3,4} 之间的相关性.

将其进行Soft-max 使其能够成为我们所需要的权重。

之后就通过上面得到的权重α'1,1 α'1,2 α'1,3 α'1,4 和 每一个词向量与Value矩阵运算得到的v{1,2,3,4}

运算得到 b1

同样的可以得到 b2 b3 b4 ,这就是self-attention模块了。

下面就是矩阵运算的表示了:

对于多头注意力机制:

​ 实际上就是 对于αi 与Wq 进行矩阵乘法之后 得到 qi ,然后将qi 与 N个不同的矩阵(N表示N头注意力机制) 相乘得到 qi,n

同样原理得到 ki,n v i,n

然后对应的上标进行运算 ,以此得到bi,1 bi,2 ... bi,n 然后 叠加在一起进行之后的运算。

位置编码(Positional Encoding):

1.位置编码出现的原因:在上面介绍的self-attention 中没有位置信息

2.每一个位置都有独一无二的位置向量ei

3.可以手工设置

4.也可以学习生成

self-attention vs rnn

接下来介绍Self-attention 在图像方面的应用

把一张三通道的rgb图像,把每一个像素点按通道方向考虑为向量,进行self-attention

Self-attention 和 CNN 的比较

CNN仅仅只能关注到人为设置的receptive field (感受野)

self-attention 能够学习整张图片的receptive field (感受野),通过权重 (如上面的α'1,1 α'1,2 α'1,3 α'1,4 )可以让机器自行选择感受野。

可以认为Self-attention 是复杂的CNN ,或者CNN是简化的Self-attention.

如何选择:


接下来就开始进行transformer 的总结:
推荐一篇好的博文:什么是Transformer

transformer的整体结构图

在trasformer中的normalization,不是传统的batch_normalization,而是layer_normalization

encoder层

Feed Forward Neural Network
由于在之前的Multi-Headed Attention中,我们初始化了多组q k v 矩阵进行运算,导致经过多头注意力模块之后产生了多个矩阵。(如下图所示)

所以我们需要一种方式,把 8 个矩阵降为 1 个,首先,我们把 8 个矩阵连在一起,这样会得到一个大的矩阵,再随机初始化一个矩阵和这个组合好的矩阵相乘,最后得到一个最终的矩阵。
这一操作就是FFN network

decoder层

从transformer的结构图中我们可以看到decoder层的self-attention比encoder中的描述多了一个Masked
实际上多了这个Masked 我们要从下图中了解为什么是这样。

在上图中,我们可以看到,首先Decoder层中同样有输入,刚开始的输入我们需要一个BEGIN来表示开始(同样也需要一个END词向量来表示结束,于是词编码处我们需要的编码是所有的词汇数+1(表示开始和结束))。
因此:

于是:要产生b1时 我们只需要 计算q1 和 k1 ,然后将b1 作为输入

这样就开始需要产生b2,这时我们需要计算 k1 k2 和 q2 ,然后将b2作为输入

Cross-attention:
对于Cross-attention模型:encoder模块传到Decoder模块的参数有两部分,表示的是q矩阵和v矩阵(实际上对于经过Encoder的向量来说,我们生成的仅仅只有一个b矩阵(下图中的a矩阵),于是将a矩阵同WkWv 进行运算得到decoder需要的两个矩阵K,V
于此同时decoder自身产生
q
矩阵


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM