当前位置:   article > 正文

Transformer学习笔记(一)_ich mochte ein bier

ich mochte ein bier

一、Transformer整体结构图

 transformer结构整体包含2个部分:Encoder(编码器)、Decoder(解码器),左边是Encoder结构、右边是Decoder结构,其中Encoder与Decoder均由6个小编码器和小解码器堆叠组成,如下图所示:

二、Transformer整体工作流程

 下面我们以翻译为例子,来介绍Transformer如何工作的。假设现在有一个翻译任务,需要将德语的“ich mochte ein bier P”翻译成英文的“i want a beer E”,我们来看一下Transformer是如何实现的。在Transformer模型中,需要2个输入,1个输出,如下图所示:

其中,Encoder的输入为源文本,也就是需要翻译的文本,而Decoder的输入要复杂一些,当Encoder接收到第一个词“ich”的时候,相当于Decoder并没有任何可以参考的上下文信息,所以Decoder会接收到一个特殊字符“S”,表示“开始”;当“ich”已经被翻译成“i”的时候,对于第二个词语“mochte”来说,就已经有了相应的上文参考信息,就是“S i”。所以当第二个词语“mochte”被输入到Encoder的时候,Decoder就会接收到相应的上文信息“S i”。依次类推,当第三个词语“ein”被输入到Encoder的时候,Decoder会接收到相应的上文信息“S i want”。这样就实现了,联合上文信息的目的。

接下来,来看输出,Decoder每次都会输出一个字符。当翻译完成后,会产生最终的识别结果,我们将它简称为result_text, 我们已知真实的翻译结果为“i want a beer E”,其中“E”表示“结束字符”,我们简称为label,将result_text与label对比,就可以评估翻译的效果了。

三、Transformer中的Encoder

下面我们来看一下,Transformer中的Encoder结构,在Encoder中包含输入的Embedding、位置编码、多头注意力机制、前馈神经网络。

 1.Embedding

在Embedding中并不是所有的字符都会被编码,这里会设置一个阈值,超过阈值长度的字符直接截断,小于阈值长度的字符进行补齐,如下图所示:

 接下来就要构建词表,这一步就相当于给字符分配特定的索引,用索引来表示字符,输入和输出的词表可以一起构建,但是要包含所有的字符。

比如:src_vocab = {'P': 0, '我': 1, '喜': 2, '欢': 3, '你': 4}

Embedding:用一个向量来表征一个单词或是一个句子,比如:将“我喜欢你”这句话做一个512维的embedding,如下图:

其中,d_model是可以自行设定的。

 2.位置编码

传统的循环神经网络RNN结构是共享一套参数的,而且不能并行解码,必须要等上一时刻输出结果后,才能进行下一时刻的解码。

ps:这里插一个面试小问题,RNN的梯度消失有什么不同?
连乘效应导致梯度消失放在RNN这里不是太准确,RNN的梯度是一个总的梯度和,它的梯度消失不单单是梯度和变为0,而是说总体的梯度被近距离梯度主导,被远距离梯度忽略不计,这才是RNN梯度消失的真正含义。

Transformer很好解决了这个弊端,实现了并行解码,提高了效率,但是为了体现位置信息,Transformer中引入了位置编码。位置编码的函数形式如下:

其中2i表示偶数位,2i+1表示奇数位,pos表示字符的位置,sin和cos函数本身就是一种非线形函数,其次是周期函数,非线形函数引入了非线形性质,周期函数在一定程度上体现了相对位置关系。 位置编码由句子的长度和d_model的维度决定的,和位置编码的值是没有关系的。

 位置进行编码之后,要和Embedding编码结果进行相加,如下图所示:

 ps:这里有一个小trick,就是在位置编码之前加一个缩放:
当emb和位置编码相加了之后,我们希望emb占多数,比如将emb放大10倍,那么在相加后的张 量里,emb就会占大部分。因为主要的语义信息是蕴含在emb当中的,我们希望位置编码带来的影响不要超过emb。所以对 emb进行了缩放再和位置编码相加。
在Encoder结构中,不难发现还有2个残差结构,引入残差结构的主要目的防治梯度消失。

3.多头注意力机制

什么是注意力机制呢?在Transformer中,注意力机制的公式如下:

这就好比当前时刻对于上文不同的信息关注度是不一样的,可以看下面的这个例子:

我们分析这样一个问题:婴儿在干什么?

下面我们用注意力机制来解决这个问题,是如何解决的呢?

 婴儿通过看不同的区域,最后来判断婴儿在做什么。

在文本任务中,现在有这样一个序列“我不爱你”,现在要看一下“爱”这个字和其他字之间的关系是如何的,计算一下“爱”和其他字符之间的注意力:

在TRM结构中,会使用矩阵计算的方式来实现注意力机制的计算:

其中X表示输入的字符,Wq、Wk、Wv表示Q、K、V矩阵的参数,输入分别和矩阵参数相乘得到相应的Q、K、V矩阵。

在TRM中,会用的多头注意力机制,这就相当于有多组不同的Q、K、V矩阵。

ps:为什么会有人说多头注意力机制效果要好?

多头相当于在不同的特征空间去提取信息,所以一般多头的效果要好一些

4.前馈神经网络

在Encoder中,有一层前馈神经网络,此外还有残差连接:

 在输入到Feed Forward网络中,会对自注意力结果做一次LayerNorm,为什么不做BatchNorm呢?我们来具体分析一下原因,LayerNorm相当于对同一批次样本的相同特征做归一化处理,比如:所有人的身高值,做归一化;如下图:

而BatchNorm相当于在一个样本中,对这个样本的所有特征做归一化,如下图红框所示

为什么不用BatchNorm方式呢?第一个,batch_size较小的时候,效果差。第二个缺点就是 BN 在RNN中效果比较差,这一点和第一点原因很类似,我们来看一下为什么:

 比如在上面这个图中,有9个样本的特征值数量为5,1个样本的特征值长度为20。所以,那9个样本缺失的特征值是没有办法处理的。所以,LN的效果要比BN的效果好很多。

四、Transformer中的Decoder

在TRM结构中,Decoder的结构主要包含1层Mask的注意力机制和1层多头注意力机制。如下图所示,在Encoder中已经详细介绍过了什么是多头注意力机制,现在我们来介绍一下,什么是Mask?

 

先来说一下为什么要mask,mask翻译过来的意思是“遮挡”的意思。在TRM结构中, Encoder输入源文本,Decoder输入目标文本。我们以文本翻译为例子,当将德语的“ich mochte ein bier P”翻译成英文的“i want a beer E

Encoder接收到“mochte”时候,Decoder不可以看到“want”之后的其他词语,这个时候就需要将“a beer E”进行mask。在TRM中,是通过矩阵来实现的,其中“0”表示不遮挡,“1”表示遮挡,如下:

S
S0111
0011
0001
0000

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/593660
推荐阅读
相关标签
  

闽ICP备14008679号