目录
二、Sequence-to-sequence(seq2seq)
4.Multi-label Classification(多标签分类问题)
一、Transformer
transformer 是一种seqence-to-sequence model。
二、Sequence-to-sequence(seq2seq)
1.Input a sequence , output a sequence.
2.The output length is determined by model
Seq2seq应用
1.Chatbot(训练聊天机器人)
2.QA(问答任务)
3.Syntactic Parsing(句法分析)
4.Multi-label Classification(多标签分类问题)
5.Object Detection
Seq2seq构成
通常Seq2Seq模型会分成两部分,一个是Encoder另一个是Decoder。
Encoder
Encoder(编码器)要做的事情就是给一排向量,输出一排向量。
像RNN、CNN等都能完成这个任务。而在Transformer中用的是Self-attention来实现的。
Transformer的Encoder乍看起来非常复杂,首先它是由很多个Block组成的,每个Block都是输入一排向量,输出一排向量。最下面的Block的输出又可以作为它上面那个Block的输入,这样叠加起来。最上面一个Block就会输出最终的向量序列。而每个Block里面是由好几层组成的。在Transformer的Encoder里面,每一个Block做的事情是,一排向量,输入到Self-attention中,然后得到另外一排向量,然后给全连接网络(FC),再得到Block的输出。
值得注意的是在self-attention这里有两个特殊的处理,分别是 residual 和 layer norm。residual的意思是把Transformer得到的输出向量a再加上原来的输入向量b得到一个新的向量,我们把这种操作叫做残差连接(residual connection)。layer norm 是计算输入向量的均值m和标准差,然后用公式就得到了新的输出,我们称之为层归一化(Layer Normalization)。
Decoder
Decoder有两种,一种是Autoregressive Decoder(AT),另一种是Non-autoregressive (NAT)。
我们首先来了解AT。以语音识别为例,输入机器学习的声音信号,输出是一排向量。然后,我们引入Decoder,它读入Encoder的输入,那Decoder这里如何产生一段文字呢,首先需要给它一个特殊的开始符号。接下来,Decoder就可以输出一个向量。这个向量的大小和词典大小一样,如果加上Softmax就可以看成是输出每个词汇的概率。然后一般取概率最高(GreedySearch)的当成此刻的输出,这里是“机”,然后将这个“机”输入到Decoder中,此时Decoder根据前面的两个输入又生成一个输出,取最最大概率对应的单词,假设是“器”,接着把“器”再输入到Decoder,又会产生一个新的单词,依此类推。
下面我们来看另一个关键的问题,就是Decoder必须自己决定输出的序列长度。比如,当它产生了“习”之后,可能接着将它作为输入,又会产生一个“惯”,还有可能继续生成下去。为了让它能停下去,输入给它一个特别的符号,让它输出了这个符号后,就停止了。这个特别的符号就是结束字符,除了开始字符,我们还要添加结束字符。那么我们希望在把“习”作为输入的时候,Decoder就要输出结束符号。
最后我们说一下AT和NAT的区别
AT现输入开始字符,然后输出一些词汇,最后输出结束字符。
而NAT Decoder它不是一次产生一个词汇,而是一次产生整个句子的词汇。它的输入是一排开始字符,然后一次输出一排词汇,就结束了。
那NAT如何决定输出的长度呢?有一些做法,比如:
另外用一个模型来预测输出长度输出很长的序列,而忽略结束字符后面的所有输出。NAT的优点是可以并行化,因为一次就可以产生所有的输出。
显然,NAT这种想法是有了Self-attention之后才有的。但是NAT的Decoder的表现往往不如AT,很多人想让它的表现和AT一样好,这样子利用它可以并行化的特性,可以极大地加快生成的效率。
Masked Self-attention
简单的说
我们原来的Self-attention的输出都是看过所有的输入得到的,那么加了Masked的意思就是现在不能看右边的输入。比如输出b2,就只考虑a1,2;不考虑a3,4.
那为什么需要加Masked呢?
这其实很直观,假设把Decoder当成生成模型的时候,它只能看到它生成过的东西,未生成的当然是未知的、看不到的。
就和Seq2Seq中Decoder采用的是从左到右的单向RNN而不是双向RNN一个道理。
Encoder-Dncoder
Encoder 是如何将信息传给Dncoder ?我们下面就来讨论一下cross-attention.
cross-attention
Cross attention,它是连接Transformer中Encoder和Decoder的桥梁。这一块有两个输入来自Encoder,一个输入来自Decoder。它的原理是,假设给定Encoder一排向量,得到一排输出,然后输入开始字符到Masked Self-attention,得到一个输出。然后接下来把这个向量乘上一个矩阵,得到q。然后q和a1,2,3的输出k1,2,3做运算,经过softmax得到1,2,3然后,1,2,3乘上对应的v1,2,3之后做加权得到结果v。这个过程就叫做Cross-attention.
三、Training
即输入一个序列,如何训练,得到另一排输出序列的。如果是做语言识别。首先我们要收集训练数据,我们要有一大堆语言和对应的文字数据。
那如何让机器做到语音识别呢?
我们知道,当输入“机器学习”这段语音,模型输出的第一个中文应该是“机”。所以当我们把开始符号输入给Decoder时,它的第一个输出应该要与“机”越接近越好。
如何让输出和“机”越接近越好?
目标词“机”会用one-hot向量来表示,而我们的输出经过Softmax之后,是一个概率分布,我们希望这个概率分布和这个one-hot向量越接近越好。
就变成计算它们之间的cross entroy(交叉熵),希望这个cross entroy的值越小越好。
现在,我们已经知道输出是“机器学习”这四个字,加上一个结束符。
我们希望Decoder的输出和这四个字的one-hot向量越接近越好,然后每个Decoder的输出都会和它的目标词的ont-hot向量计算交叉熵,这里加上结束符就会得到5个交叉熵。
我们希望这5个交叉熵越小越好,这样我们就确定了损失函数,就可以梯度下降。
这里还有一个技巧我们要知道,就是我们可以在训练的时候,给Decoder看正确答案。比如输入开始符之后,不管Decoder的输出是什么,强制输入“机”这个字进去,然后期望Decoder输出“器”。当然接着也可以不管它输出什么, 强制输入“器”进去,期望它输出“学”…
这个技巧叫Teacher Forcing。
tips
1.Copy mechanism
有些任务是希望Decoder从输入的序列里面复制出一些东西出来。
2.Guided Attention
如果在语音合成时,你发现机器看字的顺序是乱的,比如它先看最后面,再看最前面,最后看的是中间。显然此时有些问题,而Guided Attention做的事情就是强迫机器由左向右进行Attention。