本笔记整理自:https://blog.csdn.net/longxinchen_ml/article/details/86533005
宏观视角
input Embedding:对输入的语句进行一个类似于one-hot的编码操作
Positional Encoding:由于并没有rnn以及卷积来记住序列中的一些远距离依赖,所以需要对每个单词的位置进行一个编码这样可以将单词间的联系量化。
Multi-Head Attention:多头注意力,目的就是作为RNN的替代
Add&Norm:剩余连接以及规范化
Feed Forward:前馈网络
输入一种语言,输出另一种语言,怎么转换的就是transfomer做的事情
由 编码组件——>解码组件组成,其中有6个编码组件叠加以及6个解码组件,这六个组件的关系是叠加的,即上一个输出是下一个的输入
编码器
编码器分为:自注意力——>前馈神经网络
- 位置计算:由于模型不包含递归和卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列中记号的相对或绝对位置的信息。为此,我们在表1中的5个输入嵌入中添加了“位置编码”:最大路径长度、每层复杂度和不同层类型的最小顺序操作数。
- 多层自注意力:帮助编码器在对每个单词编码时关注输入句子的其他单词。注意力函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出以值的加权和的形式计算,其中分配给每个值的权重由查询与相应键的兼容函数计算。
- 前馈神经网络:每个位置的单词都对应一个自己的一维卷积神经网络。翻译的时候每个词都有自己的词向量,512维
多头注意力(多个自注意力)
自注意力的原理就是我自己通过建立一些联系把自己搞明白,比如一个句子中某些代词就需要明确指代的是谁。每当都不同的单词时我们会将所有相关单词的理解融入到我们正在处理的单词中。
计算步骤:
- 每个词将会被编为512维的词向量,注意力一次性将会接收多个词(一个句子)即一个向量列表。
- 将每个输入的向量列表(二维)通过计算生成三个64维向量(查询向量(输入X1与WQ权重矩阵相乘),键向量(X1与WK矩阵相乘),值向量(X1与WV矩阵相乘))
- 计算得分,输入中的每个单词都对一个单词进行打分,这个分数决定了其他单词对着一个单词的重要程度。算法是:每个单词的键向量与这个单词的查询向量相点积。
- 将计算得分除以8,为了更稳定一点,然后使用softmax传递结果。这个softmax分数决定了每个单词对编码当下位置的贡献。
- 对加权值向量求和(即对每一个单词都用上面算出的分数求和得到一个向量),即得到自注意力层在该位置的输出,传入前馈网络
多头注意力机制 - 由于一个自注意力并不能很好的把单词之间复杂的关系表示清楚,比如一个单词与多个单词都有很高的关联性,那么既然如此我们就重复利用不同随机化的权重矩阵来对自身多学习几遍。
- 每个“头”都保持自己的独立的查询/键/值权重矩阵,同上我们会直接拿X在不同的权重矩阵中计算各自的查询/键/值权重矩阵
- 由于前馈神经网络并不需要八个矩阵只需要一个,所以我们直接把这八个矩阵拼接在一起,然后用附加的权重矩阵WO与他们相乘。
使用位置编码表示序列的顺序
transfomer为每个输入的单词添加一个位置向量表示词与词之间的距离。原来的X+位置编码=基于时间步的词嵌入
那么位置编码怎么求的呢?利用正弦函数
解码器
编码器通过处理输入序列开启工作。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适:在完成编码阶段后,则开始解码阶段。解码阶段的每个步骤都会输出一个输出序列(在这个例子里,是英语翻译的句子)的元素
接下来的步骤重复了这个过程,直到到达一个特殊的终止符号,它表示transformer的解码器已经完成了它的输出。每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。另外,就像我们对编码器的输入所做的那样,我们会嵌入并添加位置编码给那些解码器,来表示每个单词的位置。
而那些解码器中的自注意力层表现的模式与编码器不同:在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。
这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。
最后将一个浮点数变为单词就是通过线性变换层将解码组件产生的向量投射到一个比它大得多的被称为对数几率的向量里,每一个单元格里表示单词的得分,softmax将分数变为概率,概率最大的单词就是当前时间步该输出的对应的单词。