目录
摘要
本次对transforme展开学习,对于Encoder和Decoder作为本次学习的重点,旨在理解transforme框架的工作原理。
transforme简介
transforme其实是一种sequence-to-sequence model。
常用于:
语音辨识:输入语音信号,输出语音对应文字。(长度由model所决定)
机器翻译:读一个语言,输出另一种语言。(长度仍然由model所决定)
语音翻译:输入语言信号,输出这段语言对应的中文。
语言合成:输入文字,输出语音信号。
文字运用:训练一个聊天机器人。
除此之外在NLP上有着许多运用, 一个sequence-to-sequence model用于多种途径。
通过sequence-to-sequence model还能解决许多其它问题,比如文法剖析,这属于硬解方法。
Seq2seq for Multi-label Classification:同个东西可以属于多个类别。 输入一个文本文件,输出这个文件属于哪些类别的。
如何做Seq2seq
sequence-to-sequence model里面会分成两块,Encoder和Decoder。
将输入数据传进Encoder,Decoder决定输出的结果。
1、Encoder
给一排向量,输出另外一排向量,二者长度相同。
Encoder里有很多Block,每个Block都是接收一排向量,输出一排向量。
输入的信号首先通过一个输入嵌入成,即将信号转变为向量的形式。由于这些信号没有位置信息,则在后面加上位置编码,添加位置信息。之后通过multi-head attention层,再将上一步的输出加入一个残差再进行一个layer normalization,通过MLP层后,仍然将上一步输出加入残差在进行layer normalization。这就是完整的block工作流程,最后输出的就是一个block工作后输出的向量,这个block会重复N次。
2、Decoder
Decoder有两种,这里以语音辨识(输入一段语音。输出相应的文字)作为例子来进行分析。
Decoder-Autoregressive(AT)
在Encoder输出完后就轮到Decoder产生语音辨识的结果。在对Decoder的输入中前面加上一个BEGIN符号(一维是1,其它维是0),首先会经过softmax得出一个向量,向量会给distribution中每一个中文分数,分数最高的文字就是输出。之后将得到的输入当作Decoder的输入,再次得到一个新向量,之后得出新的输出。往复循环,直至完成。
特点:将输出当作自己新的输入,同样当某个输入是错误的,则会导致全部出错,一步错,步步错。
Encoder和Decoder的结构图相比,当将Decoder中间那块盖住,二者是相差不大的。只是最后在输出时加了个softmax将其变为概率。
在原来的self-attention和Masked Self-attention相比。当产生b1时只考虑a1,产生b2时只考虑a1和b1,即只考虑左边的,不考虑右边的。对Encoder而言,a1到a4是一下就产生的,而对于Decoder而言a1到a4是逐个产生的。
加Masled的原因:说明Decoder输出的是一个个产生的。
Decoder是自己决定输出sequence的长度,在Decoder中得加入一个特殊的符号END,用作停止运作的标准,防止无限循环下去。
Decoder-Non-Autoregressive(NAT)
不是一次产生一个字,而是一次产生一排字,在速度上跑得比AT快,比较可以控制输出的长度。
3、Encoder和Decoder二者如何传递资讯
cross attention连接Encoder和Decoder。从左边两个箭头,Decoder可以得到Encoder的输出。
cross attention的运作过程如下图所示。将Decoder输出的向量乘以一个矩阵,得到向量q,再将q与a1到a4产生的k1到k4去计算得到attention的分数。之后将α1、α2、α3乘上v1、v2、v3再加起来得到v,之后将v丢向FC。
Training:训练集是打上标签的,每一次Decoder产生一个字时都是做了一次分类问题,输出的字和正确的字存在一个cross entropy,而训练的目的是让所有cross entropy的和越小越好。
总结
学习了transforme框架中的Encoder和Decoder,以及二者之间的联系,对模型框架有了更深的了解。
transforme模型比传统的模型每层计算复杂度更优、可直接计算点乘结果,模型更具有解释性。但模型对于局部特征的捕捉能力基本没有以及在位置信息的设置上是值得优化的。