从零构建transformer(以一句话的中译英为例,完整的呈现transformer的构建与工作)

一、词嵌入层

词嵌入层(一般也为输入层)的工作是确定一个词汇表(例:10万单词收录量),由整数索引表示,例如:“小猫” = 90711。此时,该层会再分配给这个索引对应的词一个固定维度的随机向量,因为是从零构建transformer,我们得对其训练,使该向量包含这个词的各种性质。

当transformer进行翻译工作时,假设翻译内容是“猫追老鼠”,我们将得到三个固定维度的向量(假设300维度),分别是“猫”对应的向量,“追”对应的向量以及“老鼠”对应的向量。

为了让机器认识到这三个词所具有的顺序性,  我们需加入位置编码。(否则机器将无法区分“你爱我”和“我爱你”这样的问题)。

位置编码计算公式:

PE(pos,2i) = sin(pos/10000^{2i/d\textup{ model}})

PE(pos,2i+1) = cos(pos/10000^{2i/d\textup{ model}})

通过这样的公式,我们能得到一个与词嵌入向量维度相同的向量(300维度)。之后,计算机将每个词的嵌入向量与对应的位置编码向量逐个元素相加得到最终向量x

二、自注意机制

(一)单头自注意机制

目的:将“通用词义表示”转化为“特定角色语义表示”。

w_K(300*300矩阵):该词能做什么。(“猫”可以抓、爬、跑等)

w_q(300*300矩阵):该词可以和什么词搭配。(“猫”可以和“抓”、“挠”等词搭配)

w_v(300*300矩阵):该词的核心含义是什么。(“猫”是一种动物)

利用300*300矩阵同向量x叉乘可以保证所得向量仍是300维度。以x1(“猫”)为例,我们得到Q1K1V1三个300维度的向量。接着,我们进行如下公式得到x1x2(“追”)和x3(“老鼠”)的相似度。

\alpha (Q,K,V) = softmax(Q1Ki^{T}/\sqrt{d})

附注:d是向量维度,除以\sqrt{d}的目的是进行归一化,降低\alpha大小。

我们利用以上公式算出Attention = \sum \alpha i * Vi 并输出Attention的值。

(二)多头自注意机制

运用多头自注意机制,究其原因是为了增加机器理解词汇的维度(角度),增加了翻译准确性。

多头自注意机制的构建使用了线性投影,将原本通过w_k、w_q和w_v得到的K1Q1V1(均为300维)分别分割成若干相同维度的小向量。

      R^{1*m} = R^{1*n} * R^{n*m}(n > m)

举例,如要将300维度K1分割成三个100维度的K_1、K_2和K_3需要w_k1、w_k2和w_k3三个300*100维度的矩阵与之叉乘,从而实现线性投影。

三、编码器和解码器的交互

编码器和解码器的交互结构图

(一)Masked Multi-Head Attention的功能介绍

当我们要实现一句话从语音到文字的转换,语音中的先后顺序很重要,尽管我们对句子中的词汇注入了位置信息,但机器同时读入所有语音信息仍然会对说话者的意思输出产生误差,比如,说话者在读入语音的过程中存在思考行为,说话者所说的前一段话和后一段话意思可能发生转变,如果一并读入分析就会造成语义丢失和理解偏差,此时便需要使用Masked Multi-Head Attention机制。

Masked Multi-Head Attention的机制就是分部份进行自注意运算。比如有a1、a2、a3和a4这四个输入,在对a1进行自注意运算时只要考虑自身,a2则要考虑a1和自身,以此类推,a4则要考虑所有资讯。这样可以避免后面的信息内容对前面的信息输出产生影响。

(二)编码器和解码器的交互逻辑

当我们的中文句子进入编码器时,解码器也被输入一个begin向量。begin向量同编码器的输出一同参与多头自注意运算得到部分词汇的翻译,然后再将其一同输入解码器,周而复始直至end向量输入解码器。我们由此可以得到想要的翻译。

(三)残差问题的解决

当我们多次利用梯度下降求参数时,梯度可能出现衰减乃至消失,此时机器将无法进一步学习。我们则需要在每次多头自注意运算结束后,将输出结果同对应的输出逐项相加,避免梯度消失。我们还要使用Layer Norm函数进一步保持参数。该函数公式如下:

x_{i}^{'} = (x_{i} - m)/\sigma

利用此公式便可将原向量中元素一一转化得到新向量。

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐