SEQ2SEQ
Seq2seq是机器学习里用于自然语言处理的一个算法簇,主要应用于语言翻译,画像字幕,会话模型和文本摘要提取。起初是谷歌发明用于机器翻译的算法。2019年提出了用其求解符号数学的问题,包含函数微分,一阶常微分方程,二阶常微分方程等复杂问题。
目前主流的Seq2seq模型包括:
- RNN, Recurrent Natural Network
- LSTM, Long-Short Term Memory
- GRU, Gated recurrent unit
Seq2seq模型的输入是一系列的单词,输出是被翻译过后的另外一系列单词。
该模型主要分为两部分:
- 编码阶段:在编码阶段,Seq2seq模型的编码器(Encoder)将输入的序列编码为一个隐藏层向量。
- 解码阶段:在解码阶段,解码器(Decoder)将隐藏层的向量解码为输出序列()一个英文句子
seq2seq中的RNN
将上图中的RNN cell进一步透明化,表示RNN模型中的一个神经元细胞。每个神经元细胞的输入包括两部分:input和hidden state #0;输出同样包含两部分:output和hidden state #2。对于RNN而言,每一个神经元的输入hidden #t,是上一个神经元t-1的输出。
当输入和输出都是不定长序列时,我们可以使用(encoder-decoder)模型。该模型中的两部分本质上都用到了循环神经网络,分别叫做编码器和解码器。编码器用来分析输入序列,解码器用来生成输出序列。这两个循环神经网络是共同训练的。
例:使⽤编码器—解码器将英语句子翻译成法语句子
在训练集中,我们可以在每个句子后附上特殊标点符号"“表示序列终止。编码器每个时间步的输入依次为英语句子中的单词、标点、特殊符号。下图使用了编码器在最终时间步的隐藏状态作为输入句子的表征或编码信息。解码器在各个时间步中使用输入句子的编码信息和上一个时间步的输入以及隐藏状态作为输入。我们希望解码器在各个时间步能正确依次输出翻译后的法语单词、标点和特殊符号;解码器在最初时间步的输入用到了一个表示序列的特殊符号”"
编码器的作用是把一个定长的输入序列变换成一个定长的背景变量c,并在该背景变量中编码输入序列信息。常用的编码器是循环神经网络。
考虑批量大小为1的时序数据样本。假设输入序列是 x 1 , . . . , x T { {x}_{1}},...,{ {x}_{T}} x1,...,xT,例如 x i { {x}_{i}} xi是输入句子中的第i个词。在时间步t,循环神经网络将输入的特征向量 x t { {x}_{t}} xt和上个时间步的隐藏状态 h t − 1 { {h}_{t-1}} ht−1变换为当前时间步的隐藏状态 h t { {h}_{t}} ht。我们可以用函数f表达循环神经网络隐藏层的变换:
h t = f ( x t , h t − 1 ) { {h}_{t}}=f({ {x}_{t}},{ {h}_{t-1}}) ht=f(xt,ht−1)
接下来,编码器通过自定义函数q将各个时间步的隐藏状态变换为背景向量:
c = q ( h 1 , h 2 , . . . , h T ) c=q({ {h}_{1}},{ {h}_{2}},...,{ {h}_{T}}) c=q(h1,h2,...,hT)
以上的编码器是一个单向的循环神经网络,每个时间步的隐藏状态只取决于该时间步及之前的输入子序列。我们也可使用双向循环神经网络构造编码器。编码器每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列,并编码整个序列的信息。
解码器输出的是北背景变量c编码了整个输入序列 x 1 , . . . , x T { {x}_{1}},...,{ {x}_{T}} x1,...,xT的信息。给定训练样本中的输出序列 y 1 , y 2 . . . , y T ′ { {y}_{1}},{ {y}_{2}}...,{ {y}_{T'}} y1,y2...,yT′,对每个时间步骤 t ′ t' t′,解码器输出 y t ′ { {y}_{t'}} yt′的条件概率将基于之前的输出序列 y 1 , y 2 . . . , y t ′ − 1 { {y}_{1}},{ {y}_{2}}...,{ {y}_{t'-1}} y1,y2...,y