本文引用和翻译自Fareed Khan的文章。
作为计算机的方面的从事人员,每个人应该或多或少的了解下Transformer。

我知道Transformer 架构可能看起来很可怕,您也可能已经在视频网站或博客上看到过各种各样的解释。然而,在我这里,我将尽可能的通过最简单的示例,一点点的来阐明Transformer的原理。通过这样做,希望能够简化我们对 Transformer 架构的理解。
让我们开始吧!
1. 输入和位置编码 (Inputs and Positional Encoding)

我们首先来解决最开始的部分,即确定Inputs和positional encoding。
步骤 1 (定义数据)
第一步是定义我们的数据集(即语料库)。

这里我们取自《权力的游戏》中的三段对话来作为我们的数据集。
尽管这个数据集看起来很小,但较小的数据集有助于我们更好的一步步通过数学方程推导出我们的结果。
步骤 2(计算词汇量)
为了确定词汇量大小,我们需要确定数据集中唯一单词的总数。

其中 N 是所有单词的列表,每个单词都是一个标记,我们将把数据集分成一个标记列表,即找到N。

获得标记列表(记为 N)后,我们可以应用公式来计算词汇表大小。

这里我们先将数据集进行了单词切分,然后对其进行去重并计数。最后得出,词汇量大小为 23,即给定列表中有 23 个唯一单词。
步骤 3(编码和嵌入)
我们为数据集的每个唯一单词分配一个整数,如下所示:

这个分配的数字,可以看做我们对数据集进行了编码。在编码后,是时候选择我们的输入了。
我们将从语料库中选择一个句子作为开头:
“When you play game of thrones”
将这个句子中的每个单词转换为编码的整数,并且每个相应的整数值都关联一个的Embedding(嵌入向量)。

这些Embedding嵌入可以使用Google Word2vec生成。在我们的例子中,我们假设每个单词所关联的的嵌入向量Embedding的默认值是,由随机的0 和 1之间浮点数填充。
原始论文使用512维的Embedding嵌入向量,这里为了举例,我们使用5维作为示例。

现在,每个单词都由维度为5的Embedding嵌入向量来表示,其中的数值是由RAND()随机器生成的。
步骤 4(位置嵌入)
让我们考虑第一个单词,即“When”,并计算它的位置嵌入向量(Positional Encoding)。
位置嵌入(Positional Encoding)有两个公式:

其中的pos为单词的位置,从0开始;i为Embedding数组中的索引下标,i的奇偶决定了使用哪个公式来计算PE值;dim为嵌入向量Embedding的维度。
第一个单词“When”的POS值将为零,因为它对应于序列的起始索引。维度值表示嵌入向量的维数,在本例中为 5。下面我们来看下如何进行计算:

通过Positional Encoding的公式,我们得出了“When”的位置Embedding,即10101。
接下来我们继续计算“you”这个单词,此时pos 值 1;后续的每个单词依次增加每个 pos的值。

生成位置嵌入Embedding后,我们可以将其与原始单词嵌入连接起来。

我们得到的结果向量是 e1+p1、e2+p2、…. 、e6+p6等的总和。

最后,我们将Transformer初始化部分的输出作为编码器的输入。
2. 编码器(Encoder)
在编码器中,我们将执行复杂的操作,其涉及queries, keys, and values这三个数值矩阵,我们简称Q、K和V。这些操作对于输入数据的转换和提取是非常有意义的。

如上图所示,在Encoder内部有multi-head attention,我们先来解释下attention机制。在单个attention layer由以下几个关键部分组成:

请注意,黄色框代表的模型机制是单个attention机制。multi-head attention 代表的是多个黄色框存在。这里我们为了这个示例简单,我们将仅考虑一个(即single-head attention)。
步骤 1 (执行single-head attention)
attention注意力层有3个输入矩阵:
Query
Key
Value
如上图所示,三个输入矩阵中,粉色矩阵表示从上一步将位置嵌入Embedding添加到词嵌入Embedding矩阵中获得的转置输出。
另一方面,线性权重矩阵,黄色、蓝色和红色代表attention注意力机制中使用的权重参数矩阵。这些矩阵可以具有任意数量的列维数,但行数必须与输入矩阵中的列数相同,因为他们之间要做乘法。
在我们的例子中,我们假设线性矩阵(黄色、蓝色和红色)包含是随机权重。这些权重通常是随机初始化的,然后在训练过程中通过反向传播和梯度下降等技术进行调整。
下面让我们计算一下(Q、K和V的值):

当我们在attention注意力机制中获得了Q、K和V矩阵,我们就可以进行下一步的的矩阵乘法计算。

现在我们将结果矩阵与我们之前计算的值矩阵相乘:

如果我们有multi-head attention,每个注意力attention都会产生一个维度 (6x3) 的矩阵,下一步会将这些矩阵连接concat在一起。

在下一步中,我们将再次执行类似于获取Q、K和V矩阵的过程的线性变换。该线性变换应用于从multi-head attention获得的级联矩阵。

由于文章已经变得很长,在下一部分中,我们将把重点转移到讨论编码器Encoder架构中下面部分的。
