下面是一些常见的Seq2Seq的例子:
如下图所示:
我们常见聊天机器人(Chat bot)其实就是一种 Seq2Seq 模型。
Seq2Seq 在 文法解析 任务中也能得到应用,如下图所示,模型会得到一个句子的输入,模型需要输入出句子中每个词在句子中的词性分析。
综上,我们直到 Seq2Seq Model 是一个非常有用的model,是一个powerful 的model,在很多不同种类的任务下都有不错的表现。
一般来说,Seq2Seq‘s Model 由两部分组成:
如下图,接下来,我们依次学习 Encoder 和 Decoder。
如下图所示:
上图右边就是Transformer中Encoder的架构图,我们先不管这个复杂的架构,我们先从简单的方面讲讲它的架构。
在Encoder中,会分成非常多的Block,这些Block有以下特点:
如下图所示:
现在我们充分理解了每个Block内部的机制,我们再回过头来看之前复杂的Encoder架构图:
其中有两点值得注意的是:
Decoder 其实有两种:
首先,我们观察上图,左边是一个Encoder,刚刚已经讲解过了,现在我们只需要将其理解为一个输入一排向量,输出相同数量一排向量的模块即可。
Encoder的输入会以某种方式(现在暂时不用理解)将输入传递给Decoder。
Decoder 首先会获取第一个输入向量,这个向量是一个特别的token,代表句子的开始。
然后Decoder会输出一个向量,这个向量的长度是这个任务的词汇表的长度,每个位置代表该位置字的出现概率,是经过Softmax的输出。
之后,Decoder 会得到第二个输入,而第二个输入就是 (开始的Special Token + 刚刚输出的”机“)作为输入,然后产生第二个输出向量,而这个向量中,概率最大的是 ”器“ 这个字。
再然后,Decoder 会得到第三个输入,而第三个输入就是(开始的Special Token + 刚刚输出的”机“ + 刚刚输出的”器“)作为输入,然后产生第三个输出向量,这个向量中,概率最大的是”学“这个字。
依次类推,每次输入都是包含之前的输出。
注意点:每一次的输出都依赖于前一次的输出,这样可能会产生 Error Propagation 的问题,也就是”一步错,步步错“。
下面,我们来对比一下 Encoder 和 Decoder ,如下图所示:
我们发现,其实出了被灰色盖住的地方,Encoder 和 Decoder 的结构其实是差不多的,除了这个Masked。
下面我们介绍一下Masked Self-Attention
它的核心思想其实很简单,Self-Attention 是为了融合上下文信息的,Masked Self-Attention 其实就是只是融合之前的上下文信息,而不去融合之后的上下文信息,如下图所示:
按照之前一般的情况来说,输出b2,需要融合a1、a2、a3、a4 这4个向量的信息。
但是Masked Self-Attention 只会融合之前的信息,也就是对于输出b2,只会融合 a1、a2 的信息。
为什么需要Masked Self-Attention?
简单来说,刚刚提到一个Special Token表示句子开始,所以我们也可以设置一个Special Token作为结束,这个特殊字符放进Vocabulary中,当输出的向量中概率最大的是这个表示结束的特殊字符,即代表输出结束。
这里会有一个问题,NAT Decoder 怎么决定输出Sequence输出长度的呢?
NAT Decoder 优点:
但是,目前来说,AT Decoder 会比 NAT Decoder 要更好。
下面我们来学习 Encoder 和 Decoder 的具体联系。
在上图中,Encoder的输出在Decoder中间的一个Block处进行传递,主要是通过一种叫做Cross Attention的机制。
其中,Decoder经过Masked Attention会输出一个向量,这个向量需要和Encoder产生的向量融合上下文信息产生新的输出。
这就是 Cross Attention 机制的原理。
在原始Paper中,Decoder拿到的关于Encoder的输出向量是Encoder最终的输出,但是经过各个方面的改进,Decoder也可以拿到Encoder不同层次的输出进行融合上下文信息,如下图所示:
首先,我们需要一个训练资料,包含语音以及它的label。
对于第一个输出,它首先读取 BOS (Begin of Sentence)这样一个Special Token,然后产生一个向量,这个向量包含了所有可能输出字符的概率,也就是一个概率分布,而这个概率分布应该和 Ground Truth 越接近越好,也就是使真实值和预测值之间的 Cross Entropy 越小越好。
这个训练过程其实就是和分类问题的训练过程使一致的,都是通过Minimize Cross Entropy 来进行训练的。
一个值得注意的地方是:不要忘记最后一个表示 结束含义的Special Token。
下面是一些 Seq2Seq 训练的tips。
这种具有输入复制能力的模型:Pointer Network
但是,对于 ”发财发财发财发财“ 、”发财发财发财“、”发财发财“ 这样重复出现的词汇,机器可以非常正确的念出来,但是对于”发财“ 这样单独的一个词汇,机器反而出现问题,只念了一个 ”财“ 字。
这样的错误表明,输入的有一些东西机器忽略掉了,没有看到。
简单来说,机器的Attention需要被引导,也就是 Guided Attention,不然机器可能会产生一些乱七八糟的Attention顺序,以至于忽略掉一些重要的信息。
有没有可能在某些情况下, 舍弃当前最优解,而会获得全局最优解呢?
这个问题就是Beam Search所解决的问题。