transformer 的个人理解
看了两天的transformer,网上大部分的讲解感觉不是很透彻,感觉很多都是生硬的翻译论文。在此写一下个人的理解,可能有理解不对的地方,欢迎指正。

encoder
这是 transformer 最经典的图,左边的部分是 encoder,右边的部分是decoder。主要的过程就为:input 一些词语,进行embedding向量化,然后进行 positional encoding,这个 positional encoding 的主要作用就是对这些词语进行位置向量编码,位置编码通常用正弦和余弦函数来生成,这样可以捕捉到相对位置信息。通俗来讲就是让一个句子中的单词有位置信息,如果没有位置信息的话这个句子的单词之间没有关系,就比如 I am fine == fine I am == fine am I 很不对劲。
下一步的框框就是进行多头注意力机制。我的个人理解为:如果使用单头的,对这个句子的理解可能不是很充分。多头的注意力机制,可以从多个视角进行处理输入,捕捉更多的信息。并且是在多个子空间 学习更多的特征。最主要的优点就是泛化能力强。缺点就是计算复杂度高一些。

然后下一步 add & Norm,这一步是进行残差链接和层归一化。残差链接的主要好处就是可以避免梯度消失,前段时间因为毕设有看过一下 LSTM,都是可以让网络可以训练的更深。层归一化可以确保每一层输出的数值分布更加稳定,可以提高训练过程的稳定性。
之后把输出的向量传送到feedforward层。这个层是一个两层的全连接,第一层是使用 relu,第二层不使用激活函数。这层的主要作用就是为了增强模型的表达能力和非线性转换。
decoder
这里第一步是把输入的 token 转换为词向量(和上面一样),之后进行Masked Muti-Head Attention这里主要是处理 decoder 部分的输入和之前已经生成的词的关系,使用 masked 机制,就是在计算注意力的时候,只能关注当前和之前的词语,不能看到未来的词语。
然后说一下第二个多头注意力,这个头和 encoder 的头的主要区别就是 encoder 的头可以捕获序列中各个单词的上下文关系。decoder 的头输入又有 encoder 的输出,又有上一层的输出。所以它又计算序列内部的关系,还捕捉源语言和目标语言之间的联系。
小总结:
Encoder 的自注意力机制:捕捉输入序列内部的上下文关系。
Decoder 的自注意力机制:掩码自注意力机制,捕捉目标序列内部的上下文关系,但不能关注未来的单词。
Decoder 的交叉注意力机制:捕捉源语言和目标语言之间的联系。
最后使用线性变换和 softmax,把向量映射到词汇表的大小,然后使用 softmax 进行概率化,生成下一个可能生成的单词。
版权声明: 本文为 InfoQ 作者【Z C C C L】的原创文章。
原文链接:【http://xie.infoq.cn/article/e8e89183ae216e75cfa2cb529】。文章转载请联系作者。
评论