关于Encoder( 编码器 )和Decoder(解码器)以及其组合框架
基本概念
Encoder和Decoder是计算机领域中常用的术语,它们分别指的是编码器和解码器。在机器学习模型的应用中,编码器和解码器是一对相互配合的神经网络模块,用于将输入序列从一种形式转换为另一种形式。
(1)Encoder
Encoder(编码器)是将不定长的输入序列转换为定长的编码状态序列的神经网络模块。通俗地讲,在机器学习模型中,尤其是当我们把编码器和解码器组合起来使用的时候,编码器的作用其实是把一个长度可变的序列(编码器的输入)经过处理之后,获取一个长度固定的编码状态的序列(编码器的输出),序列长度可以理解为序列中元素的个数。
(2)Decoder
当Encoder(编码器)和Decoder(解码器)组合使用时,Decoder(解码器)是将经过Encoder(编码器)得到的定长的编码状态序列映射成不定长的解码状态序列的神经网络模块。即其可以对编码器编码后的得到的长度固定的序列(编码器的输出)进行解码,解码结果就是得到一个长度可变的解码状态的序列。
Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛,本身就值得非常细致地谈一下,但是因为本文的注意力焦点在AM(Attention Model)模型,所以此处我们就只谈一些关键内容。下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:
Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<X,Y>,我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。
- 而X和Y分别由各自的单词序列构成:
- Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:
- 对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词yi
- 每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。
总结
Encoder-Decoder是个非常通用的计算框架,至于Encoder和Decoder具体使用什么模型都是由研究者自己定的,常见的比如CNN/RNN/BiRNN/GRU/LSTM/Deep LSTM等,这里的变化组合非常多,很可能一种新的组合就能攒篇论文,比如我用CNN作为Encoder,你用BiRNN做为Encoder,就能称之为一个创新。
从某种角度而言,Encoder-Decoder是个创新游戏大杀器.一方面如上所述,可以搞各种不同的模型组合,另外一方面它的应用场景非常广泛,比如对于机器翻译来说,<X,Y>就是对应不同语言的句子,比如X是英语句子,Y是对应的中文句子翻译;再比如对于文本摘要来说,X就是一篇文章,Y就是对应的摘要;又比如对于对话机器人来说,X就是某人的一句话,Y就是对话机器人的应答。
需要注意的是,Encoder-Decoder的创新需要有实验数据和具体参数,不然,甲说Encoder可以是ABCD,乙说Decoder可以是ADFG,于是所有组合都可以要求权利了。