当前位置:   article > 正文

机器学习--Transformer 2_transfermer 2

transfermer 2

紧接上篇介绍一下Transformer的解码器

一、解码器

1.自回归解码器

在这里插入图片描述

语音识别为例,输入一段声音,输出一串文字。如上图所示,把一段声音(“机器学习”)输入给编码器,输出会变成一排向量。解码器把编码器的输出先“读”进去。要让解码器产生输出,首先要先给它一个代表开始的特殊符号 BOS,即 Begin Of Sequence,这是一个特殊的词元(token)。在词表(vocabulary)里面,在本来解码器可能产生的文字里面多加一个特殊的符号BOS。(就是加一个BOS的维度)

机器学习里面,假设要处理自然语言的问题,每一个词元都可以用一个独热向量来表示。其中对应维度是 1,其他都是 0,所以 BOS也是用独热向量来表示,其中对应维是 1,其他是 0。

接下来解码器会“吐”出一个向量,该向量的长度跟词表的大小是一样的。在产生这个向量之前,跟其他的分类任务一样,通常会先进行一个 softmax 操作。这个向量里面的分数是一个分布,该向量里面所有维度的值全部加起来,总和是1。

这个向量会给每一个维度对应一个分数,分数最高的维度对应的中文字就是最终的输出。“机”的分数最高,所以“机”就当做是解码器的第一个输出。
在这里插入图片描述

接下来把“机”当成解码器新的输入。
根据两个输入:特殊符号 BOS和“机”,解码器输出一个蓝色的向量。蓝色的向量里面会给出每一个维度对应中文字的分数,假设“器”的分数最高,“器”就是输出。解码器接下来会拿“器”当作输入,其看到了BOS、“机”、“器”,可能就输出“学”。解码器看到 BOS、“机”、“器”、“学”,它会输出一个向量。这个向量里面“习”的分数最高的,所以它就输出“习”。这个过程就反复地持续下去。

解码器的输入是它在前一个时间点的输出,其会把自己的输出当做接下来的输入,因此当解码器在产生一个句子的时候,它有可能看到错误的东西。
在这里插入图片描述

如果解码器有语音识别的错误,它把机器的“器”识别错成天气的“气”,接下来解码器会根据错误的识别结果产生它想要产生的期待是正确的输出,这会造成误差传播(error propagation)的问题,一步错导致步步错,接下来可能无法再产生正确的词汇。
在这里插入图片描述

Transformer 里面的解码器内部的结构如上图所示。类似于编码器,解码器也有多头注意力、残差连接和层归一化、前馈神经网络。解码器最后再做一个 softmax,使其输出变成一个概率。此外,解码器使用了掩蔽自注意力(masked self-attention),掩蔽自注意力可以通过一个掩码(mask)来阻止每个位置选择其后面的输入信息。
在这里插入图片描述

如图所示,原来的自注意力输入一排向量,输出另外一排向量,这一排中每个向量都要看过完整的输入以后才做决定。根据 a1 到 a4 所有的信息去输出 b1。
在这里插入图片描述

掩蔽自注意力的不同点是不能再看右边的部分,产生 b1 的时候,只能考虑 a1 的信息,不能再考虑 a2、a3、a4。产生b2 的时候,只能考虑 a1、a2 的信息,不能再考虑 a3、a4 的信息。以此类推。产生 b4 的时候,可以用整个输入序列的信息。
在这里插入图片描述

一般自注意力产生 b2 的过程如上图所示。
在这里插入图片描述

掩蔽自注意力的计算过程如上图所示,我们只拿 q2 和 k1、k2 计算注意力,最后只计算 v1 跟 v2 的加权和。不管 a2 右边的地方,只考虑 a1、a2、q1、q2、k1 以及 k2。输出 b2 的时候,只考虑了 a1 和 a2,没有考虑到 a3和 a4。

那我们现在思考一个问题为什么要使用掩蔽自注意力?
因为解码器的输出是一个一个产生的,所以是先有 a1 再有 a2,再有 a3,再有a4。这跟原来的自注意力不一样,原来的自注意力 a1 跟 a4 是一次整个输进去模型里面的。编码器是一次把 a1 跟 a4 都整个都读进去。但是对解码器而言,先有 a1 才有a2,才有 a3 才有 a4。所以实际上当我有 a2,要计算 b2 的时候,没有 a3 跟 a4 的,所以无法考虑 a3,a4。解码器的输出是一个一个产生的,所以只能考虑其左边的东西,没有办法考虑其右边的东西。

还有一个非常关键的问题:实际应用中输入跟输出长度的关系是非常复杂的,我们无法从输入序列的长度知道输出序列的长度,因此解码器必须决定输出的序列的长度。
给定一个输入序列,机器可以自己学到输出序列的长度。但在目前的解码器运作的机制里面,机器不知道什么时候应该停下来
在这里插入图片描述

如上图所示,机器产生完“习”以后,还可以继续重复一模一样的过程,把“习”当做输入,解码器可能就会输出“惯”,接下来就一直持续下去,永远都不会停来。
在这里插入图片描述

如上图所示,要让解码器停止运作,需要特别准备一个特别的符号 EOS(End of Sequence)。产生完“习”以后,再把“习”当作解码器的输入以后,解码器就要能够输出EOS,解码器看到编码器输出的嵌入、BOS、“机”、“器”、“学”、“习”以后,其产生出来的向量里面 EOS的概率必须是最大的,于是输出 EOS,整个解码器产生序列的过程就结束。

2.非自回归解码器

接下来说非自回归(non-autoregressive)的模型。

如图所示,自回归的模型是先输入 BOS,输出 w1,再把 w1 当做输入,再输出 w2,直到输出 EOS为止。假设产生是中文的句子,非自回归不是一次产生一个字,它是一次把整个句子都产生出来。非自回归的解码器可能“吃”的是一整排的BOS 词元,一次产生一排词元。比如输入 4 个 BOS的词元到非自回归的解码器,它就产生 4 个中文的字。因为输出的长度是未知的,所以当做非自回归解码器输入的 BOS的数量也是未知的,因此有如下两个做法。
1.用分类器来解决这个问题。用分类器“吃”编码器的输入,输出是一个数字,该数字代表解码器应该要输出的长度。比如分类器输出 4,非自回归的解码器就会“吃”4 个 BOS词元,产生 4 个中文的字。
2.给编码器一堆BOS 的词元。假设输出的句子的长度有上限,绝对不会超过 300 个字。给编码器 300 个 BOS,就会输出 300 个字,输出 EOS 右边的的输出就当它没有输出。

非自回归的解码器有很多优点。

第一个优点是平行化。自回归的解码器输出句子的时候是一个一个字产生的,假设要输出长度一百个字的句子,就需要做一百次的解码。
但是非自回归的解码器不管句子的长度如何,都是一个步骤就产生出完整的句子。所以非自回归的解码器会跑得比自回归的解码器要快。
非自回归解码器的想法是在有 Transformer 以后,有这种自注意力的解码器以后才有的。以前如果用长短期记忆网络(Long Short-Term Memory Network,LSTM)或 RNN,给它一排BOS,其无法同时产生全部的输出,其输出是一个一个产生的。

另外一个优点是非自回归的解码器比较能够控制它输出的长度。非自回归的解码器可以控制输出的长度,可以用一个分类器决定非自回归的解码器应该输出的长度。在做语音合成的时候,如果想要让系统讲快一点,就把分类器的输出除以 2,系统讲话速度就变为2倍速。如果想要讲话放慢速度,就把分类器输出的长度乘 2 倍,解码器说话的速度就变0.5倍速。因此非自回归的解码器可以控制解码器输出的长度,做出种种的变化。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号