4.2 构建一些特殊模型
循环神经网络适合含时序序列的任务,如自然语言处理、语言识别等。基于循环神经网络可以构建功能更强大的模型,如Encoder-Decoer(编码器-解码器)模型、Seq2Seq模型等。在具体实现时,编码器和解码器通常使用循环神经网络,如RNN、LSTM、GRU等,有些情况也可以使用卷积神经网络,实现语言翻译、文档摘取、问答系统等功能。
4.2.1 Encoder-Decoder模型
Encoder-Decoder模型是一种神经网络设计模式,其架构示意图如图4-8所示。模型分为两部分:编码器和解码器。首先由编码器将源数据编码为状态,该状态通常为向量,然后,将状态传递给解码器生成输出。
图4-8 Encoder-Decoder模型架构示意图
对图4-8进一步细化,在输入模型前,需要将源数据和目标数据转换为词嵌入。对于自然语言处理问题,考虑到序列的不同长度及语言的前后依赖关系,编辑器和解码器一般选择循环神经网络,具体可选择RNN、LSTM、GRU等,可以一层,也可以多层,具体如图4-9所示。
图4-9 细化的Encoder-Decoder模型架构
下面以一个简单的语言翻译场景为例,输入为4个单词,输出为3个单词,此时Encoder-Decoder模型架构如图4-10所示。
图4-10 基于语言翻译的Encoder-Decoder模型架构
这是一个典型的Encoder-Decoder模型。该如何理解这个模型呢?
可以这样直观理解:从左到右,看作由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。假设这个句子对为<X,Y>,我们的目标是给定输入句子X,期待通过Encoder-Decoder模型来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成:
X=(x 1,x 2,x 3…x m) (11.1)
Y=(y 1,y 2,y 3…y n) (11.2)
Encoder,顾名思义就是对输入句子X进行编码,通过非线性变换将输入句子转化为中间语义表示C:
C=f(x 1,x 2,x 3…x m) (11.3)
对于Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y 1,y 2,y 3…y i-1来生成i时刻要生成的单词y i。
y i=g(C,y 1,y 2,y 3…y i-1) (11.4)
依次生成y i,那么看起来就是整个系统根据输入句子X生成了目标句子Y。Encoder-Decoder是个非常通用的计算框架,而Encoder和Decoder具体使用什么模型则由我们自己决定。常见的有CNN、RNN、BiRNN、GRU、LSTM、Deep LSTM等,而且变化组合非常多。
Encoder-Decoder模型的应用场景非常广泛,比如对于机器翻译来说,<X,Y>就是对应不同语言的句子,其中X是英语句子,Y就是对应的中文句子翻译;对于文本摘要来说,X就是一篇文章,Y就是对应的摘要;对于对话机器人来说,X就是某人的一句话,Y就是对话机器人的应答等。
这个框架有一个缺点,就是生成的句子中每个词采用的中间语言编码是相同的,即都是C。例如如下几个表达式,在句子比较短时,性能还可以,但句子稍长一些,生成的句子就不尽如人意了。那么,要如何解决这个缺点呢?
y 1=g(C) (11.5)
y 2=g(C,y 1) (11.6)
y 3=g(C,y 1,y 2) (11.7)
解铃还须系铃人,既然问题出在C上,就需要在C上做一些处理。引入一个注意力机制以有效解决这个问题。关于注意力的更多内容将在第5章详细讲解。
4.2.2 Seq2Seq模型
在Seq2Seq模型提出之前,深度神经网络在图像分类等问题上已经取得了非常好的效果。输入和输出通常都可以表示为固定长度的向量,如果在一个批量中有长度不等的情况,往往通过补零的方法补齐。但在许多实际任务中,例如机器翻译、语音识别、自动对话等,表示成序列后,其长度并不固定。因此如何突破这个局限,使其可以适应这些场景成为急需解决的问题,在探索的过程中,Seq2Seq模型应运而生。
Seq2Seq模型是基于Encoder-Decoder模型生成的,其输入和输出都是序列,如图4-11所示。
图4-11 Seq2Seq模型
Seq2Seq不特指具体方法,只要满足输入序列、输出序列的目的,都可以称为Seq2Seq模型。