Encoder-Decoder、Seq2Seq、 以及Transformer之间的关系

结论写在前面:

Encoder-Decoder 是一种架构,范围非常广泛,只要是用一个编码结构一个解码结构的模型都是Encoder-Decoder 架构

seq2seq 和 Encoder-Decoder基本相同,只不过后者是一种抽象概念,前者是具体的模型,seq2seq可以看做是一种结构,有很多这种结构的模型。seq2seq有多种类型,N VS N,N vs 1, 1vs N, N vs M。最后一种应用最广。同时还有基于RNN的seq2seq,基于CNN的seq2seq,基于LSTM的seq2seq

而transformer模型师seq2seq结构的一种具体的模型,是完全基于Attention机制的seq2seq结构。

一、Encoder-Decoder 模型

首先我们来了解一下Encoder-Decoder 模型, Encoder-Decoder 主要是 NLP 领域里的概念,它并不特值某种具体的算法,而是一类算法的统称,称之为Encoder-Decoder结构更合适。Encoder-Decoder 算是一个通用的框架,在这个框架下可以使用不同的算法来解决不同的任务。Encoder-Decoder 这个框架很好的诠释了机器学习的核心思路:

将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。

Encoder 又称作编码器。它的作用就是“将现实问题转化为数学问题”:
Encoder
Decoder 又称作解码器,他的作用是“求解数学问题,并转化为现实世界的解决方案”:
Decoder
把两个环节连接起来,用通用的图来表达则是下面的样子:
en-de
关于 Encoder-Decoder,有两点需要说明:

  • 不论输入和输出的长度是什么,中间的“向量 C”长度都是固定的(这也是它的缺陷,下文会详细说明)
  • 根据不同的任务可以选择不同的编码器和解码器(可以是一个 RNN ,但通常是其变种 LSTM 或者 GRU )

只要是符合上面的框架,都可以统称为 Encoder-Decoder 模型。具体实现 Encoder-Decoder 的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。当然提到 Encoder-Decoder 模型就经常提到一个名词——Seq2Seq。其实Encoder-Decoder和Seq2Seq几乎就是等价的,只不过Encoder-Decoder是一种抽象的框架概念,Seq2Seq是具体的一种实现。

二、Seq2Seq(Sequence to Sequence) 模型

首先要知道为什么会提出 Seq2Seq模型,它是处理序列到序列问题的利器。传统的循环神经网络中是将一个序列转化成定长输出。而 Seq2Seq 可以将一个序列转化成一个不定长的序列输出(如机器翻译中,源语言和目标语言的句子往往并没有相同的长度)。

2.1 Seq2Seq

(1)从单层网络谈起
首先来了解一下最基本的单层网络,它的结构如图:
per
输入是x,经过变换Wx+b激活函数f得到输出y

(2)经典的RNN结构(N vs N)
在实际应用中,我们还会遇到很多序列形的数据:
seq
如:

  • 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
  • 语音处理。此时,x1、x2、x3……是每帧的声音信号。
  • 时间序列问题。例如每天的股票价格等等

序列形的数据就不太好用原始的神经网络处理了。为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:

nvn
图示中记号的含义是:

  • 圆圈或方块表示的是向量。
  • 一个箭头就表示对该向量做一次变换。如上图中h0和x1分别有一个箭头连接,就表示对h0和x1各做了一次变换。

在很多论文中也会出现类似的记号,初学的时候很容易搞乱,但只要把握住以上两点,就可以比较轻松地理解图示背后的含义。
h2
h2的计算和h1类似。要注意的是,在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记。

依次计算剩下来的h3、h4(使用相同的参数U、W、b):
h3h4
我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。

目前我们的RNN还没有输出,得到输出值的方法就是直接通过h进行计算。正如之前所说,一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1:
y1
剩下的输出类似进行(使用和y1同样的参数V和c):
y
OK!大功告成!这种输入序列长度为N且输出序列长度也为N的RNN就是最经典的RNN结构,我们像搭积木一样把它搭好了。它的输入是x1, x2, …xn,输出为y1, y2, …yn,也就是说,输入和输出序列必须要是等长的

由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:

  • 计算视频中每一帧的分类标签。因为要对每一帧进行计算,因此输入和输出序列等长。
  • 输入为字符,输出为下一个字符的概率。

(3)N VS 1
有的时候,我们要处理的问题输入是一个序列,输出是一个单独的值而不是序列,应该怎样建模呢?实际上,我们只在最后一个h上进行输出变换就可以了:
nv1
这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

(4)1 VS N
输入不是序列而输出为序列的情况怎么处理?我们可以只在序列开始进行输入计算:
1vN
还有一种结构是把输入信息X作为每个阶段的输入(右图省略了一些X的圆圈,是一个等价表示):
1vn
这种1 VS N的结构可以处理的问题有:

  • 从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子
  • 从类别生成语音或音乐等

(5)N vs M
下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c(context vector):
nvm
得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换,可以表示为下面三种方式:

  • c = h 4 c=h_4 c=h4​
  • c = f ( h 4 ) c=f(h_4) c=f(h4​)
  • c = g ( h 1 , h 2 , h 3 , h 4 ) c=g(h_1,h_2,h_3,h_4) c=g(h1​,h2​,h3​,h4​)

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:
decoder
还有一种做法是将c当做每一步的输入:
decoder
Decoder是Encoder的逆过程,每个状态由之前的状态和context vector决定,即:
h i ′ = f ( c , h 1 ′ , h 2 ′ , . . . , h i − 1 ′ ) h_i^{'}=f(c, h_1^{'}, h_2^{'},...,h_{i-1}^{'}) hi′​=f(c,h1′​,h2′​,...,hi−1′​)
y i = g ( h i ′ ) y_i=g(h_i^{'}) yi​=g(hi′​)

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

  • 机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译 - 领域最先提出的
  • 文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。
  • 阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
  • 语音识别。输入是语音信号序列,输出是文字序列。
  • ……

上面提到:Encoder 和 Decoder 之间只有一个「向量 C」来传递信息,且 C 的长度固定。这样做有两个弊端:

  • 一是语义向量无法完全表示整个序列的信息。
  • 二是当句子长度较大时,容易丢失信息。

针对信息丢失这个问题,后面提出了 Seq2Seq+Attention 的模型。

2.2 基于 RNN 的Seq2Seq 模型

最初Seq2Seq的Encoder和Decoder都是基于RNN的,但是传统的基于 RNN 的 Seq2Seq 模型不能并行计算,效率低。针对这个问题,后来提出了基于CNN的Seq2Seq 模型。

2.3 基于 CNN 的 Seq2Seq 模型

FaceBook提出了由CNN构成的Seq2Seq模型,完全采用堆叠的CNN来构建encoder和decoder,通过CNN的堆叠方式来回溯sequence中long-range dependencies关系,在decoder端采用了多层的attention机制(提出CNN+Seq2Seq的时候就引入了Attention机制)。堆叠CNN之间采用加入残差的GLU单元来连接,加快计算的同时最大限度保留输入sequence的信息。下面的【3.2】节会介绍更多内容。

三、Attention 机制

Attention 机制的提出就是为了解决「序列过长,信息丢失」的问题。原理详见Attention机制详解

3.1 基于 LSTM 的 Seq2Seq+Attention 模型

由于传统的基于RNN的Seq2Seq存在的序列过长,信息丢失的问题,后来提出了基于RNN的Seq2Seq+Attention模型,在decoder端,采用含一个隐含层的前向网络,采用自适应(adaptive)的方法来计算观测序列X中,每个word与输出标签Y的权重。

优点是可以自适应地计算一个权值矩阵W,权重矩阵W长度与X的的词数目一致,每个权重衡量输入序列X中每个词对输入序列Y的重要程度,不需要考虑输入序列X与输出序列Y中,词与词之间的距离关系。缺点还是和RNN一样,LSTM依赖t-1的历史信息来计算t时刻的信息,因此不能并行实现,计算效率比较低,特别是训练样本量非常大的时候

3.2 基于 CNN 的 Seq2Seq+Attention 模型

基于 CNN 的 Seq2Seq 模型提出来的时候超越了谷歌创造的基于LSTM机器翻译的效果。重要原因在于采用了很多的窍门,这些技巧值得学习:

  • 捕获long-distance依赖关系
    单层CNN的问题是难解决长依赖的序列, 解决办法是叠加多层的CNN。底层的CNN捕捉相聚较近的词之间的依赖关系,高层CNN捕捉较远词之间的依赖关系。通过层次化的结构,实现了类似RNN(LSTM)捕捉长度在20个词以上的Sequence的依赖关系的功能。

  • 效率高
    假设一个sequence序列长度为n,采用RNN(LSTM)对其进行建模 需要进行n次操作,时间复杂度O(n)。相比,采用层叠CNN只需要进行n/k次操作,时间复杂度O(n/k),k为卷积窗口大小。

  • 并行化实现
    RNN对sequence的建模依赖于序列的历史信息,因此不能并行实现。相比,层叠CNN对整个sequence进行卷积,不依赖序列历史信息,可以并行实现,特别是在工业生产,面临处理大数据量和实时要求比较高的情况下,模型训练更快。

  • 融合多层attention
    融合了Residual connection、liner mapping的多层attention。通过attention决定输入的哪些信息是重要的,并逐步往下传递。把encoder的输出和decoder的输出做点乘(dot products),再归一化,再乘以encoder的输入X之后做为权重化后的结果加入到decoder中预测目标语言序列。

  • gate mechanism
    采用GLU做为gate mechanism。GLU单元激活方式如下公式所示:
    f ( X ) = ( X ∗ W + b ) + O ( X ∗ V + c ) f(X)=(X*W+b)+O(X*V+c) f(X)=(X∗W+b)+O(X∗V+c)

  • 进行了梯度裁剪和精细的权重初始化,加速模型训练和收敛

在CNN和RNN用于NLP问题时,CNN也是可行的,且网络结构搭建更加灵活,效率高,由于RNN训练时往往需要前一时刻的状态,很难并行,特别是在大数据集上,CNN-Seq2Seq往往能取得比RNN-Seq2Seq更好的效果。

基于CNN的Seq2Seq模型除了具有基于RNN的Seq2Seq模型捕捉long distance dependency的能力,此外,最大的优点是速度快,效率高,可以并行化实现,效率比基于RNN的Seq2Seq模型高。缺点非常占内存,并且计算量与观测序列X和输出序列Y的长度成正比。参数太多,里面有很多的trick,大数据量上参数调整并不容易。

四、Transformer 模型

针对基于CNN和RNN的Seq2Seq模型存在的不足,《Attention is all you need》这篇论文提出了一种完全基于Attention Mechanism(Self Attention)的Transformer架构:抛弃CNN和RNN,基于Attention来构造Encoder和Decoder,搭建完全基于AttentionSeq2Seq模型。论文的详细阅读笔记:Transformer 模型详解

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。

相比于原始的Seq2Seq模型的Decoder中只通过同一个向量c去计算隐状态,Attention在Decoder部分的每个时间输入不同的c来解决这个问题,这就是它最核心的创新。下图是带有Attention机制的Decoder:
decoder
看一下最开始的Attention模型架构如下:
attention

  • 输入:( x 1 , x 2 , . . . , x M ) (x_1, x_2,...,x_M)(x1​,x2​,...,xM​)序列是待翻译的句子。
  • Encoder:双向的RNN或LSTM,计算得到每个位置的隐状态,下面用h i h_ihi​表示。
  • Decoder:对当前输出位置 t,使用Decoder中上一个隐状态 s t − 1 s_{t-1}st−1​与Encoder的结果(也就是向量 c t c_tct​)计算t位置的对应的y t y_tyt​。
  • 输出:( y 1 , y 2 , . . . , y T ) (y_1,y_2,...,y_T)(y1​,y2​,...,yT​)序列是翻译之后的句子。
 

 

  • 14
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
传统NLP方法主要使用规则和统计学习方法来处理自然语言文本,例如基于n-gram的语言模型、基于HMM的分词和词性标注算法等。这些方法需要手动设计特征和规则,并且通常难以处理长文本和复杂语法。 End-to-End Seq2Seq模型是一种基于神经网络的序列到序列模型,可以将一个序列映射为另一个序列。它广泛用于机器翻译、文本摘要、对话系统等任务。它通常由两个循环神经网络(RNN)组成,一个编码器将输入序列编码为固定长度的向量,另一个解码器将此向量解码为输出序列。 Encoder-Decoder模型也是一种基于神经网络的序列到序列模型,它与Seq2Seq模型类似,但它通常使用卷积神经网络(CNN)或递归神经网络(RNN)作为编码器和解码器。它常用于机器翻译、语音识别等任务。 Transformer模型是一种基于自注意力机制的神经网络模型,它可以在不使用RNN和CNN的情况下捕捉序列中的长期依赖关系。它广泛用于机器翻译、文本摘要、问答系统等任务,例如Google的翻译系统就是基于Transformer模型实现的。 BERT模型(Bidirectional Encoder Representations from Transformers)是一种基于Transformer模型的预训练语言模型,它可以在大规模无标注文本上进行预训练,然后在少量标注数据上进行微调,用于各种自然语言处理任务,例如文本分类、命名实体识别、机器翻译等。 GPT模型(Generative Pre-training Transformer)也是一种基于Transformer模型的预训练语言模型,它可以在大规模无标注文本上进行预训练,然后在特定的任务上进行微调,例如文本生成、对话系统等。与BERT不同的是,GPT是一个单向的语言模型,只能生成单向的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值