读完|图解Transformer,读完这篇就够了


读完|图解Transformer,读完这篇就够了
本文插图

作者 | Jay Alammar
编辑 | 龙心尘
来源 | CSDN 博客
Transformer由论文《Attention is All You Need》提出 , 现在是谷歌云TPU推荐的参考模型 。 论文相关的Tensorflow的代码可以从GitHub获取 , 其作为Tensor2Tensor包的一部分 。 哈佛的NLP团队也实现了一个基于PyTorch的版本 , 并注释该论文 。
在本文中 , 我们将试图把模型简化一点 , 并逐一介绍里面的核心概念 , 希望让普通读者也能轻易理解 。
Attention is All You Need:
https://arxiv.org/abs/1706.03762
从宏观的视角开始:
首先将这个模型看成是一个黑箱操作 。 在机器翻译中 , 就是输入一种语言 , 输出另一种语言 。
读完|图解Transformer,读完这篇就够了
本文插图

那么拆开这个黑箱 , 我们可以看到它是由编码组件、解码组件和它们之间的连接组成 。
读完|图解Transformer,读完这篇就够了
本文插图

编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起——数字6没有什么神奇之处 , 你也可以尝试其他数字) 。
【读完|图解Transformer,读完这篇就够了】解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的 。

读完|图解Transformer,读完这篇就够了
本文插图

所有的编码器在结构上都是相同的 , 但它们没有共享参数 。 每个解码器都可以分解成两个子层 。
读完|图解Transformer,读完这篇就够了
本文插图

从编码器输入的句子首先会经过一个自注意力(self-attention)层 , 这层帮助编码器在对每个单词编码时关注输入句子的其他单词 。 我们将在稍后的文章中更深入地研究自注意力 。
自注意力层的输出会传递到前馈(feed-forward)神经网络中 。 每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络) 。
解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层 。 除此之外 , 这两个层之间还有一个注意力层 , 用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似) 。
读完|图解Transformer,读完这篇就够了
本文插图

将张量引入图景:
我们已经了解了模型的主要部分 , 接下来我们看一下各种向量或张量(译注:张量概念是矢量概念的推广 , 可以简单理解矢量是一阶张量、矩阵是二阶张量 。 )是怎样在模型的不同部分中 , 将输入转化为输出的 。

像大部分NLP应用一样 , 我们首先将每个输入单词通过词嵌入算法转换为词向量 。
每个单词都被嵌入为512维的向量 , 我们用这些简单的方框来表示这些向量 。
词嵌入过程只发生在最底层的编码器中 。 所有的编码器都有一个相同的特点 , 即它们接收一个向量列表 , 列表中的每个向量大小为512维 。 在底层(最开始)编码器中它就是词向量 , 但是在其他编码器中 , 它就是下一层编码器的输出(也是一个向量列表) 。 向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度 。
将输入序列进行词嵌入之后 , 每个单词都会流经编码器中的两个子层 。
读完|图解Transformer,读完这篇就够了
本文插图

接下来我们看看Transformer的一个核心特性 , 在这里输入序列中每个位置的单词都有自己独特的路径流入编码器 。 在自注意力层中 , 这些路径之间存在依赖关系 。 而前馈(feed-forward)层没有这些依赖关系 。 因此在前馈(feed-forward)层时可以并行执行各种路径 。
然后我们将以一个更短的句子为例 , 看看编码器的每个子层中发生了什么 。
现在我们开始“编码”:

如上述已经提到的 , 一个编码器接收向量列表作为输入 , 接着将向量列表中的向量传递到自注意力层进行处理 , 然后传递到前馈神经网络层中 , 将输出结果传递到下一个编码器中 。
读完|图解Transformer,读完这篇就够了
本文插图

输入序列的每个单词都经过自编码过程 。 然后 , 他们各自通过前向传播神经网络——完全相同的网络 , 而每个向量都分别通过它 。
从宏观视角看自注意力机制:
不要被我用自注意力这个词弄迷糊了 , 好像每个人都应该熟悉这个概念 。 其实我之也没有见过这个概念 , 直到读到Attention is All You Need 这篇论文时才恍然大悟 。 让我们精炼一下它的工作原理 。
例如 , 下列句子是我们想要翻译的输入句子:


推荐阅读