seq2seq发展介绍

seq2seq发展介绍

因为seq2seq相关介绍博客很多,之前只是通过博客学习,一直没有读过相关论文。虽然通过博客对seq2seq大体框架有所了解,但是对于实现细节和发展并不是很清楚。近日在学习copynet时看到使用了seq2seq作为模型的主体框架,便借此机会对细节发展进行详细了解。

传统的rnn对于输入一个字符预测一个字符这种情况有着不错的使用效果,但对于翻译任务而言,源句子和目标句子常常并不有着相同长度。在这种情况下,传统的rnn将难以胜任,为了解决这个问题,在Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation论文中提出encoder-decoder这种两个rnn模块结合的结构,encoder模块负责将输入序列映射到一个固定长度的概要向量c,decoder模块引入向量c并结合前一时间步的预测结果来进行目标序列的预测。后来因为源句子与目标句子的对齐问题,引入了注意力机制,将由encoder的编码向量直接得到的概要向量c变为根据decoder输入对encoder编码向量进行加权融合得到。之后因为rnn不利于并行计算,开始使用attention进行特征的提取得到输入序列的向量特征。

下面便具体介绍下seq2seq的变迁。

荷角初露

传统的rnn网络中,一直存在着这样一个问题,文本生成的输出结果必须要和输入一一对应(输入一个字符,预测一个字符)。这样在生成对联或者诗词这样长度一致的文本时还没什么问题,但当遇到文本摘要/文本翻译/语音识别这种输入序列和输出序列长度不一定相同的情况,就无能为力了。

到了2014年,在Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation中,创造性的提出encoder-decoder结构,由两个模块共同协作完成序列转换任务,一个模块负责编码输入序列的特征,因此将这个模块称为encoder(编码器)。另一个模块负责根据概要向量c进行解码预测目标序列,所以这个模块叫做decoder(解码器)。概要向量c是一个固定维度的包含输入序列上下文信息的向量,此时还没有引入attention(注意力),直接使用输入序列最后一个字符的encoder的隐层状态的非线性变换作为概要向量。

除了提出了encoder-decoder结构,在这篇文章也首次提出了GRU神经网络(模仿LSTM但减少了参数量和计算量)。

下面是encoder模块的具体计算方式:
h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ h ~ t z t = σ ( W z e ( x t ) + U z h t − 1 ) h ~ t = t a n h ( W e ( x t ) + U ( r t ⊙ h t − 1 ) r t = σ ( W r e ( x t ) + U r h t − 1 ) c = t a n h ( V h n ) \begin{aligned} h^t&=z^t\odot h^{t-1}+(1-z^t)\odot \tilde{h}^{t}\\ z^t&=\sigma (W_ze(x^t)+U_zh^{t-1})\\ \tilde{h}^t&=tanh(We(x^t)+U(r^t\odot h^{t-1})\\ r^t&=\sigma(W_re(x^t)+U_rh^{t-1})\\ c&=tanh(Vh^n) \end{aligned} htzth~trtc=ztht1+(1zt)h~t=σ(Wze(xt)+Uzht1)=tanh(We(xt)+U(rtht1)=σ(Wre(xt)+Urht1)=tanh(Vhn)
在上面公式中的 h t h^t ht表示t时间步的隐层状态向量, h n h^n hn表示输入序列最后一个字符的隐层状态,e表示字符嵌入向量(embedding), x t x^t xt表示序列的第t个字符, z t 和 r t z^t和r^t ztrt分别表示第t时间步的更新门(update gate)和重置门(reset gate), σ \sigma σ表示激活函数,此处使用sigmoid, ⊙ \odot 表示按位元素相乘。

decoder模块整体结构和encoder模块相似,但是在进行隐层状态计算时,除了使用前一时间步的隐层状态向量 h t − 1 h^{t-1} ht1和预测结果嵌入向量 e ( y t − 1 ) e(y^{t-1}) e(yt1),还会使用encoder得到的概要向量c。具体计算公式如下所示:
h ′ 0 = t a n h ( V ′ c ) h ′ t = z ′ t ⊙ h ′ t − 1 + ( 1 − z ′ t ) ⊙ h ′ ~ t z ′ t = σ ( W z ′ e ( y t − 1 ) + U z ′ h ′ t − 1 + C z c ) h ′ ~ t = t a n h ( W ′ e ( y t − 1 ) + r ′ t ( U ′ ⊙ h ′ t − 1 + C c ) ) r ′ t = σ ( W r ′ e ( y t − 1 ) + U r ′ h t − 1 + C r c ) \begin{aligned} h'^0&=tanh(V'c)\\ h'^t&=z'^t\odot h'^{t-1}+(1-z'^t)\odot \tilde{h'}^{t}\\ z'^t&=\sigma (W'_ze(y^{t-1})+U'_zh'^{t-1}+C_zc)\\ \tilde{h'}^t&=tanh(W'e(y^{t-1})+r'^t(U'\odot h'^{t-1}+Cc))\\ r'^t&=\sigma(W'_re(y^{t-1})+U'_rh^{t-1}+C_rc)\\ \end{aligned} h0htzth~trt=tanh(Vc)=ztht1+(1zt)h~t=σ(Wze(yt1)+Uzht1+Czc)=tanh(We(yt1)+rt(Uht1+Cc))=σ(Wre(yt1)+Urht1+Crc)
在上面公式中 . ′ .' .用于区分encoder和decoder的参数。 e ( y 0 ) e(y^0) e(y0)是全零向量, e ( y t ) e(y^t) e(yt)和encoder类似,表示使用预测词汇 y t y^t yt的onehot向量和embedding相乘得到的预测词汇嵌入向量,decoder的embedding和encoder中的embedding使用同一个embedding。

encoder-decoder在训练和预测时,使用<EOS>(end-of-sequence)作为输入序列的终止符,当输入序列出现标识符<EOS>(end-of-sequence)时终止encoder模块,开始执行decoder模块。

黎明前夜

上一节介绍的encoder-decoder已经解决了源序列和目标序列不等长的问题,但是在目标序列的生成效果方面仍然不尽如人意。

之后的论文Sequence to Sequence Learning with Neural Networks发现通过上面方法生成概要向量c在进行decoder解码预测阶段时会产生较大的时滞,例如目标序列生成的第一个词对应源序列的第一个词,但是使用的encoder的概要向量c距离源序列的第一个字符的编码向量会经过源序列长度的时间步n。在论文中提出使用倒序输入,正序预测的方式(例如源序列为A,B,C,目标生成序列为A’,B’,C’,则输入为C,B,A,最终得到CBA->A'B'C')来缩短目标序列生成最初几个token时概要向量c的时间步距离,确保目标序列最开始生成的正确性。

同时这篇论文发现使用深层网络进行encoder学习;encoder和decoder使用不同的模型权重和embedding会获得模型效果提升。另外可以在decoder阶段通过<EOS>标识符来结束deocder的解码过程,具体为预测到的字符为<EOS>时停止decoder模块。

横空出世

前面文章已经意识到源序列和目标序列存在时滞问题,同时提出使用倒序输入的方式来解决,但是倒序实际上只能解决目标序列最开始几个字符的时滞问题,对于后面字符的时滞问题依然无能为力。

所以在Neural Machine Translation by Jointly Learning to Align and Translate中认为问题关键在于每次decoder进行预测时都使用同一个概要向量c,在面对长序列时难以将完整的句子信息压缩到概要向量c中。针对这个问题,此文提出使用模型自动搜索的方式(attention)得到与待预测的目标词汇相关的源序列内容的概要向量 c i c_i ci,而不必强行关注整个输入序列的内容得到概要向量c。

下面我们就具体介绍下如何使用attention来实现动态概要向量 c i c_i ci的生成。
c i = ∑ j = 1 T α i , j h j α i , j = e x p ( e i , j ) ∑ j = 1 T e x p ( e i , j ) e i , j = v α ⊤ t a n h ( W α s i − 1 + U α h j ) c_i=\sum_{j=1}^{T}\alpha_{i,j}h_j\\ \alpha_{i,j}=\frac{exp(e_{i,j})}{\sum_{j=1}^Texp(e_{i,j})}\\ e_{i,j}=v_\alpha^\top tanh(W_{\alpha}s_{i-1}+U_\alpha h_j) ci=j=1Tαi,jhjαi,j=j=1Texp(ei,j)exp(ei,j)ei,j=vαtanh(Wαsi1+Uαhj)

h j h_j hj表示输入序列第j个字符对应的encoder的隐层向量表示, e i , j e_{i,j} ei,j是目标序列中第i个字符对源序列中第j个字符的注意力, α i , j \alpha_{i,j} αi,j是注意力计算后得到的注意力权重, c i c_i ci为将输入序列 h = [ h 1 , . . . , h T ] h=[h_1,...,h_T] h=[h1,...,hT]根据注意力加权求和得到的概要向量。 v α , W α , U α v_\alpha,W_\alpha,U_\alpha vα,Wα,Uα是随机初始化生成得到的形如 W α ∈ R n × n , U α ∈ R n × 2 n , v α ∈ R n W_\alpha \in \mathbb{R}^{n\times n},U_\alpha \in \mathbb{R}^{n \times 2n},v_\alpha \in \mathbb{R}^n WαRn×n,UαRn×2n,vαRn的数字矩阵。

上面n为模型隐层向量维度, U α ∈ R n × 2 n U_\alpha \in \mathbb{R}^{n \times 2n} UαRn×2n是因为 h j h_j hj使用双向编码,向量维度乘2。

除了使用注意力的方式得到概要向量 c i c_i ci,本文使用双向循环神经网络(BiRNN)的方式来对源序列进行编码。这样每个向量 h j h_j hj除了可以获取到源序列第j个字符以前的信息,也可以获取到源序列第j个字符以后的信息。

双向循环神经网络包含正向循环神经网络和负向循环神经网络。正向循环神经网络将源序列按照 x 1 − > x T x_1->x_T x1>xT顺序输入循环神经网络,得到正向隐层状态 ( h → 1 , . . . , h → t ) (\overrightarrow{h}_1,...,\overrightarrow{h}_t) (h 1,...,h t)。负向循环神经网络将源序列按照 x T − > x 1 x_T->x_1 xT>x1顺序输入循环神经网络得到负向隐层状态 ( h ← 1 , . . . , h ← T ) (\overleftarrow{h}_1,...,\overleftarrow{h}_T) (h 1,...,h T).我们将正向隐层状态 h → j \overrightarrow h_j h j和负向隐层状态 h ← j \overleftarrow h_j h j拼接到一起得到源序列字符 x j x_j xj的表达向量 h j = [ h ← j ⊤ ; h → j ⊤ ] ⊤ h_j=[\overleftarrow h_j^\top;\overrightarrow h_j^\top]^\top hj=[h j;h j]

通过使用attention机制,有效的解决了seq2seq结构中概要向量c和目标序列 x i x_i xi不匹配的问题,使得seq2seq在长序列转换时也可取得不错的效果。后续谷歌也逐渐将翻译模型从传统统计模型转换成神经网络模型。seq2seq+attention的方式也开始在各个领域开始广泛使用。

下面我们详细介绍下模型细节:

输入和输出:
x = { x 1 , . . . , x T x }    x i ∈ R K x y = { y 1 , . . . , y T y }    y i ∈ R K y \textbf{x}=\{x_1,...,x_{T_x}\} \ \ x_i \in \mathbb{R}^{K_x}\\ \textbf{y}=\{y_1,...,y_{T_y}\} \ \ y_i \in \mathbb{R}^{K_y} x={x1,...,xTx}  xiRKxy={y1,...,yTy}  yiRKy
x , y \textbf{x},\textbf{y} x,y分别是输入句子的onehot编码组成的序列,输出句子的onehot编码组成的序列。 K x , K y K_x,K_y Kx,Ky分别为源句子语言和目标句子语言的字典尺寸大小。 T x , T y T_x,T_y Tx,Ty分别时表示源句子和目标句子的长度。

编码器:

编码器使用双向的循环神经网络进行特征提取。

下面是其中正向状态的计算方式, h → 0 \overrightarrow{h}_0 h 0初始状态为0,后续 h → i \overrightarrow{h}_i h i h → i − 1 \overrightarrow{h}_{i-1} h i1 h → i ‾ \underline {\overrightarrow h_i} h i加权得到。
h → i = { ( 1 − z → i ) ⊙ h → i − 1 + z → i ⊙ h → i ‾ i > 0 0 i = 0 \overrightarrow h_i=\left\{ \begin{array}{rcl} (1-\overrightarrow z_i) \odot \overrightarrow h_{i-1}+\overrightarrow z_i\odot \underline {\overrightarrow h_i} & & {i>0}\\ 0 & & {i=0}\\ \end{array} \right. h i={(1z i)h i1+z ih i0i>0i=0

h → i ‾ = t a n h ( W → E x x i + U → [ r → i ⊙ h → i − 1 ] ) r → i = σ ( W → r E x x i + U → r h → i − 1 ) z → i = σ ( W → z E x x i + U → r h → i − 1 ) \underline {\overrightarrow h_i}=tanh(\overrightarrow{W}E_xx_i+\overrightarrow{U}[\overrightarrow{r}_i\odot \overrightarrow{h}_{i-1}])\\ \overrightarrow{r}_i=\sigma(\overrightarrow{W}_rE_xx_i+\overrightarrow{U}_r\overrightarrow{h}_{i-1})\\ \overrightarrow{z}_i=\sigma(\overrightarrow{W}_zE_xx_i+\overrightarrow{U}_r\overrightarrow{h}_{i-1}) h i=tanh(W Exxi+U [r ih i1])r i=σ(W rExxi+U rh i1)z i=σ(W zExxi+U rh i1)

E x ∈ R m × K x E_x \in \mathbb{R}^{m \times K_x} ExRm×Kx 是词嵌入矩阵, W → , W → z , W → r ∈ R n × n , U → , U → z , U → r \overrightarrow W,\overrightarrow W_z,\overrightarrow W_r \in \mathbb{R}^{n\times n},\overrightarrow{U},\overrightarrow{U}_z,\overrightarrow{U}_r W ,W z,W rRn×n,U ,U z,U r是权重矩阵。 ⊙ \odot 为按位元素相乘, σ \sigma σ为激活函数sigmoid。m和n分别表示词嵌入矩阵的维度和隐层状态的维度。

反向状态的计算方式和正向状态计算方式类似,在正向和反向计算中共享词嵌入矩阵 E x E_x Ex,但是计算时用到的权重矩阵不做共享。

最终合并正向和反向状态得到最终的信息表达 ( h 1 , . . . , h T x ) (h_1,...,h_{T_x}) (h1,...,hTx),

h i = [ h → i ; h ← i ] h_i=[\overrightarrow h_i;\overleftarrow h_i] hi=[h i;h i].

解码器:

解码器使用单向循环神经网络,其网络的隐层状态 s i s_i si计算方式如下:
s i = ( 1 − z i ) ⊙ s i − 1 + z i ⊙ s i ‾ s i ‾ = t a n h ( W E y y i − 1 + U [ r i ⊙ s i − 1 ] + C c i ) r i = σ ( W r E y y i − 1 + U r [ r i ⊙ s i − 1 ] + C r c i ) z i = σ ( W z E y y i − 1 + U z [ r i ⊙ s i − 1 ] + C z c i ) s_i=(1-z_i)\odot s_{i-1}+z_i\odot \underline{s_i}\\ \underline{s_i}=tanh(WE_yy_{i-1}+U[r_i\odot s_{i-1}]+Cc_i) \\ r_i=\sigma(W_rE_yy_{i-1}+U_r[r_i\odot s_{i-1}]+C_rc_i)\\ z_i=\sigma(W_zE_yy_{i-1}+U_z[r_i\odot s_{i-1}]+C_zc_i) si=(1zi)si1+zisisi=tanh(WEyyi1+U[risi1]+Cci)ri=σ(WrEyyi1+Ur[risi1]+Crci)zi=σ(WzEyyi1+Uz[risi1]+Czci)
上式中 E y E_y Ey是目标语言词嵌入矩阵,如果目标语言和源语言一样,则 E x = E y E_x=E_y Ex=Ey. W , W r , W z ∈ R n × m , U , U r , U z ∈ R n × n , C , C r , C z ∈ R n × 2 n W,W_r,W_z \in \mathbb{R}^{n\times m},U,U_r,U_z \in \mathbb{R}^{n\times n},C,C_r,C_z\in \mathbb{R}^{n\times 2n} W,Wr,WzRn×m,U,Ur,UzRn×n,C,Cr,CzRn×2n均表示权重矩阵。m和n分别表示词嵌入矩阵的维度和隐层状态的维度。初始化的隐层状态 s 0 = t a n h ( W s h ← 1 ) , W s ∈ R n × n s_0=tanh(W_s\overleftarrow{h}_1),W_s\in \mathbb{R}^{n\times n} s0=tanh(Wsh 1),WsRn×n

概要向量 c i c_i ci每个时间步的计算方式为:
c i = ∑ j T x α i , j h j α i , j = e x p ( e i , j ) ∑ k T x e x p ( e i , k ) e i , j = v α ⊤ t a n h ( W α s i − 1 + U α h j ) c_i=\sum_j^{T_x}\alpha_{i,j}h_j\\ \alpha_{i,j}=\frac{exp(e_{i,j})}{\sum_k^{T_x}exp(e_{i,k})}\\ e_{i,j}=v_\alpha^\top tanh(W_\alpha s_{i-1}+U_\alpha h_j) ci=jTxαi,jhjαi,j=kTxexp(ei,k)exp(ei,j)ei,j=vαtanh(Wαsi1+Uαhj)
h j h_j hj为输入句子第j个字符的向量表达, v α ∈ R n × n ′ , W α ∈ R n ′ × n , U α ∈ R n ′ × 2 n v_\alpha \in \mathbb{R}^{n\times n'},W_\alpha \in \mathbb{R}^{n' \times n},U_\alpha \in \mathbb{R}^{n' \times 2n} vαRn×n,WαRn×n,UαRn×2n

**注意:**当固定 c i = h → T x c_i=\overrightarrow h_{T_x} ci=h Tx时,整个模型便退化成Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation中提出的encoder-decoder模型。

通过解码器的隐层向量 s i − 1 s_{i-1} si1,概要向量 c i c_i ci和上一步生成的字符 y i − 1 y_{i-1} yi1,我们可以定义目标字符 y i y_i yi的概率。

p ( y i ∣ s i , y i − 1 , c i ) ∝ e x p ( y i ⊤ W o t i ) p(y_i|s_i,y_i-1,c_i)\propto exp(y_i^\top W_ot_i) p(yisi,yi1,ci)exp(yiWoti)

其中 t i t_i ti为使用单层maxout的隐层,

t i = [ m a x { t ~ i , 2 j − 1 , t ~ i , 2 j } ] j = 1 , . . . , l ⊤ t_i=[max\{\widetilde t_{i,2j -1},\widetilde t_{i,2j}\}]^\top_{j=1,...,l} ti=[max{t i,2j1,t i,2j}]j=1,...,l

t ~ i , k \widetilde t_{i,k} t i,k是向量 t ~ i \widetilde t_i t i的第k维元素,向量 t ~ i \widetilde t_i t i的可以通过如下方式计算,

t ~ i = U o s i − 1 + V o E y y i − 1 + C o c i \widetilde t_i=U_os_{i-1}+V_oE_yy_{i-1}+C_oc_i t i=Uosi1+VoEyyi1+Coci

当训练时使用 y i = s o f t m a x ( W o t i ) y_i=softmax(W_ot_i) yi=softmax(Woti)作为预测值进行训练,输入的字符则使用 y i = a r g m a x ( y i ) y_i=argmax (y_i) yi=argmax(yi)的onehot编码输入到下一个字符的预测当中。

参考

Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

Sequence to Sequence Learning with Neural Networks

Generating Sequences With Recurrent Neural Networks

NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

Attention Is All You Need

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值