
从今天开始,我会再看一遍Transformer(这是第3遍了吧……)。
这次是依据Transformer 模型的 PyTorch 实现进行学习,再梳理一下Transformer模型的重点,最后用Pytorch实现。
本来想用AllenNLP一步到位,但是前天敲了一天发现不行,我对Pytorch不懂,同时还是不了解AllenNLP,干脆从头再来。
7. Position-wise Feed-Forward network
除了attention子层之外,encoder和decoder中的每个层都包含一个完全连接的前馈网络(Feed-forward network),该网络分别和相同地应用于每个位置。这包括两个线性变换和一个ReLU激活。
虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述这种情况的方法是两个内核大小为1的卷积。输入和输出的维数是512,而中间层维度为2048。
8. Embeddings和Softmax
与其他序列转导模型类似,我们使用学习嵌入(learned embeddings)将输入标记和输出标记转换为维度dmodel的向量。我们还使用通常学习的线性变换和softmax函数将decoder输出转换为预测的下一个token的概率。
模型中在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。在嵌入层中,我们将这些权重乘以。
9.位置编码Positional encoding
在处理完模型的各个模块后,开始关注数据的输入部分,在这里重点是位置编码。与CNN和RNN不同,Transformer模型对于序列没有编码,这就导致无法获取每个词之间的关系,也就是无法构成有意义的语句。
为了解决这个问题。论文提出了Positional encoding。核心就是对序列中的词语出现的位置进行编码。如果对位置进行编码,那么我们的模型就可以捕捉顺序信息。
论文使用正余弦函数实现位置编码。这样做的好处就是不仅可以获取词的绝对位置信息,还可以获取相对位置信息。
其中,pos是指词语在序列中的位置。可以看出,在偶数位置,使用正弦编码,在奇数位置,使用余弦编码。
相对位置信息通过以下公式实现
上面的公式说明,对于词汇之间的位置偏移k,可以表示成
和
的组合形式,这就是表达相对位置的能力。
10. 模块的整合
这部分是为了凑整,其实就是代码实现整合。
网友评论