一、网络的输入和输出
1、输入
输入是一个vector set,而且数量会变,比如下图一个句子
可以采用one-hot编码(不同的词看不到之间是否接近或比较远)
也可以采用word embedding(不同的词之间有远近和相互关系,这个关系怎么得到的不在这里讨论,总之在网上能下载到每个词的word embedding)
除此还有声音信号、图信号等。
2、输出有三种:
1)每个vector对应一个输出
如词性标注
I saw a saw(我看见一把锯),每个词有一个词性,名词还是动词
2)只有一个输出
如一个句子判断褒贬,听声识人
3)未定数量的输出,数量由机器自己决定(seq2seq,翻译,语音识别)
二、输出为N个label(和输入一样多)
比如说词性标注的问题,最直观的办法是每个输入通过FC,直接得到自己的输出。但这样做有很大的问题。如下图:
两个saw的输入完全相同,但前一个输出是动词,后一个输出是名词。这样的网络是做不到的。所以要考虑句子上下文之间的联系,
可以加一个window,但window过大参数会过多,并且要统计训练样本最长的句子取window,所以引用Self-attention机制。
三、Self-attention
图中增加了self-attention层。with context所对应的vector是输入vector在考虑了上下文后生成的。Self-attention也可以堆叠几次,Self-attention和FC交替使用,self-attention专注于处理整个seq信息,FC处理单个向量
self-attention中计算每一个向量之间的联系,相关性用表示
那么如何计算呢,最常见的方法如下图:
矩阵和分别与输入相乘,得到q和k。之后q和k做向量内积的到。
在Self-attention当中,要求输入的attention score时,计算方法如下图,分别用1的q和每一个的k做内积。
之后做一个softmax运算,归一化
每一个输出b可以用下图的计算得出
对于每个输入a,它的q、k、v都是、、分别乘以a得到。可以合并成矩阵表示,如下图:
根据每个attention的分数计算方法
其中从A到A’是每列进行softmax运算得到。
而最终输出的计算也可以用矩阵表示出来,如下图。
最终,整个self-attention运算可以用下面一张图表示出来
整个运算之中只有、和是未知的参数,需要用样本训练出来,其他的都是已知确定的。
四、多头自注意力
多头自注意力时自注意力的一种变种。
五、位置编码(positional encoding)的引入
输入在序列中的位置也包含一定的信息,不同的位置应该作为一种信息传入
方法是将位置i的位置编码向量和相加再输入网络,的确定可以是人工设定,也可以是从数据种学习得到。
六、Self-attention和CNN的对比
Self-attention可以考虑整个图像的信息,CNN只考虑周边一个领域的信息。CNN可以认为是简单化的self-attention,也是self-attention的一个特例。
self-attention是一个复杂化的CNN。CNN的范围是人工划定,self-attention是机器自己学出来的。
复杂的模型,如果训练数据量比较少,则容易产出overfit。而较小的模型,在较少的数据量时,也会有不错的结果。用不同的数据量来训练self-attention和CNN,下图能看出对比。
当数据量较少时,CNN效果比较好。随着数据量增加,self-attention的效果超过CNN。CNN的弹性比较小,数据少的时候结果好。但数据多时,它没有办法再提升得更多。self-attention弹性较大,需要比较多的数据才能训练出好的结果。
七、Self-attention和RNN的对比
RNN中距离较远得信息,常常被遗忘。Self-attention就没有这个问题。
RNN不能并行运算,Self-attention却能并行处理。