1 Transformer
Transformer是Sequence-toSequence(Seq2Seq)的一个模型,我们之前在作一些实验的时候,当我们输入一个Sequence时,我们的输出也会是一个Sequence,而输入和输出结果的长度是一样的,当我们不知道输出结果是有多长时,我们便要机器自己决定要输出多长,这就会用到Seq2Seq,特别是在语音辨识及机器翻译中。
一般的Seq2Seq模型是由Encoder和Decoder组成,Encoder接受外界的输入,然后把输出的结果丢给Decoder,再由Decoder决定要输出的Sequence的大小
Seq2seq最早在14年的时候就有了,那时是长的很眉清目秀,后面就变得一言难尽了
Encoder
Encoder要做的事情就是输入一排向量然后输出一排长度相同向量,这个用RNN或者CNN都能做得到,Encoder用的是self-attention(在我第四篇笔记中有记录到,欢迎大家指正)
现在的Encoder会被分成很多个block,每一个block先做一个self-attention,接受一排向量的输入,考虑全部的资讯,然后输出一排向量,再把结果丢到全连接层再输出一排向量,这就是每一个block的输出,
实际上原来的transformer中,block做的事情更加复杂,在经过self-attention得到一排向量之后,并不会直接丢给全连接层,而是将输入加进来得到新的向量,当成新的output,这种架构叫做residual connection,再将得到的新output做layer normalization(不需要考虑batch),layer normalization在同一个feature中计算不同维度的mean,standard,用公式x’i = (xi - mean)/ std归一化,得到要输入到全连接层的结果,
同样的,全连接层里面也有residual connection的架构和normalization,然后才得到一个block的输出
Decoder
这里记录两种常用的Decoder
Autoregressive(AT)
语音辨识例子:
给Encoder吃入”机器学习“的一段语音,Encoder会输出四排向量;对于Decoder来说,他的输入就是encoder的输出,首先Decoder有一个代表开始的符号BEGIN,缩写是BOS
Decoder接受的每一个输入都可以用One-hot-vector来表示,然后Decoder会吐出一排向量,大小是一个字典的长度,比如说做的是中文的语音辨识,中文大概有三四千常用字,所以Decoder吐出向量的长度是三四千。在Decoder中,结果还会经过softmax,最终会给每一个文字一个分数,分数最高的为所需结果
同样的,第一个的输出再作为第二次的输入,进行同样过程。
我们能够发现Decoder的输出会被当成下一次的输入,这也会导致一个问题,就是当Deocder在某一次的输出错误的话就可能会导致后面的结果全部错误。接下来看一下Decoder的内层结果
可以看出,Decoder除了中间部分和结果处的softmax之外,跟Encoder是差不多的。还有一个地方就是在Decoder里面self-attention变成了Masked self-attention,Masked其实是对self-attention的一个限制,就是让网络由可以考虑全部的资讯变成只能考虑左边的资讯
例如下面,在输出b2时,只用第二个query和第一、二个的key相乘,而不考虑key3和key4
因为在Decoder中,输入不是一次性全部输入的,他是先有a1,再有a2,a3,a4,所以当你要输出b2时,是没有a3,a4的。开始的时候我们讲到Decoder是要有一个开始符号的,那类似的,Decoder也有结束的符号end
Non-autoregressive(NAT)
对于NAT Decoder,他是一次性吃一整排的向量,然后直接生成一个 句子,就很直接,
Encoder和Decoder之间的桥梁
Decoder通过产生一个query,到Encoder中抽取资讯,然后当作Decoder中的全连接层的输入,这个过程叫做Cross attention
Decoder的输入接下来的处理是一样的。
训练
我们还是用语音辨识的例子,假如输入的是”机器学习“,每一个字用一个独热向量表示,但我们经过Decoder得到第一个输出,这个输出是一个概率分布,我们会用”机“对应的独热向量跟输出进行cross entropy的计算
每一个输出都有一个cross entropy,而我们就要使总cross entropy loss越小越好,但是要注意的是,我们还要输出end(结束)向量
可以观察到我们在训练的时候,Decoder的输入都是正确的,这个叫Teacher Forcing:using the ground truth as input。但我们在测试时看的是自己的输入,可能有时候的输出是错误的,比如说将“器”输出成“气”,就可能导致后面全部错,所以我们在训练过程中需要给model加一些错误的信息让他去训练
这个叫做Scheduled Sampling。
2 结语
以上是我本人学习机器学习的学习笔记的第五篇,有错误的地方还望指出,共勉!