Attention-> Attention seq2seq -> Transformer
之前曾经手撕过Transformer的代码,但是时间太久了,目前忘的已经差不多了。
最近在重新回顾一些NLP的基础方法的时候,感觉自己的基础还是太过薄弱,所以打算用这段时间好好对这些方法进行总结,而Transformer作为这几年的集大成之作,就拿他作为这个系列的第一篇。
目前看到比较好的文章:
Seq2Seq模型:出现在输入和输出不一致的情况,属于encoder-decoder的一种:
decoder中一个词的状态和上一时刻状态、上一时刻输出和状态v都有关。
补充:今天老师上课讲了一个很有意思的观点,他认为实际上Transformer可以看作是一个图结构,因为self-attention计算的是每一个单词和整个句子里面单词的关系,实际上可以看作是一个全联接层,而RNN结构则是对按照单词顺序,从前到后。从这点也可以看出Transformer结构这几年如此之火的原因,因为他突破了之前的序列结构,更符合人神经元的认知,GNN类似的图神经网络一定是未来的一个趋势。
attention相比较RNN的不同点:
RNN是第一个单词计算完了,才计算第二个单词,这样计算会花上大量的时间;
Transformer是计算每一个单词,然后分别给他不同的权重,这样会缩短训练的时间
Transformer中运用到的self-attention机制是由attention机制演变而来的:
attention机制
第一步:获得每一个单词的隐藏状态的score
第二步:将每个score都送到softmax中跑
第三步:将每一个score乘softmax得到最后的得分。
第四步:把所有对齐的向量加起来
第五步:将上下文向量送到decoder中进行解码
图解:
layer normalization 和batch normalization的区别:
normalization的作用将取值范围强行拉到0到1之间到正态分布,以避免梯度消失的问题。
nlp中使用layer normalization更多一点,layer normalization是对每一条句子进行操作,batch normalization是对一组batch中的同一位置的单词进行操作。
另外几种Norm的比较:
batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化;
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
基础知识介绍后,下面就是正文部分,上文提到,Transformer和正常的Seq2Seq结构一样,有encoder和decoder层,本文从这两个部分分别介绍,先放一张Transformer的结构图,左半边就是encoder层,右半边是decoder层:
输入:Positional Encoding
上文提到attention和RNN最大的区别在于RNN是计算完一个词再计算下一个词,而attention是单独对每一个单词进行运算,所以自然就有一个问题:他忽略了文本序列中单词的顺序,为了解决这个问题他加入了一个新的位置向量:
Query:
Key:
Value: