提到预训练模型,就绕不开Transfromer,它是Google于2017年提出的序列建模模型,一开始应用于机器翻译上,它摒弃了RNN和CNN,采用纯注意力计算,大幅提高了序列建模的有效长度,并且也提升了在机器翻译任务上的成绩。这一工作为后来预训练的崛起奠定了扎实的基础。
Transformer的模型架构非常新颖。如下图所示,整个模型分为Encoder和Decoder两个部分,二者分别由六个相同的Encoder层和Decoder层堆积而成。
而在Encoder层和Decoder层的内部,则是包含了多头注意力层(Multi-Head Attention)、前向传播层(Feed Foward)和残差归一化层(Add&Norm),如下图所示。
每个Encoder层内部包含了Multi-Head Attention和Point-Wise Fully Connected Feed-Forward Network两个子层,而在每个子层的输入和输出都设置了残差连接*,并加上了一个层归一化(Layer Normalization),于是对于每一个子层都有:
每个Decoder层和Encoder层包含的子层差不多,只是Decoder层多了一个Masked Multi-Head Attention子层,这里的Masked的作用就是防止在解码时注意力“看到”了当前预测位置后面的字符。
接下来将按照自底向上的顺序详细介绍Encoder层和Decoder层内部的各个模块。
输入和位置编码
由于摒弃了RNN和CNN,序列每个位置上仅仅输入token embedding会不可避免地缺失位置信息,于是Transformer把token embedding和位置编码(Positional Embedding)加在一起作为最终的Input