神经网络机器翻译(Neural Machine Translation, NMT)是最近几年提出来的一种机器翻译方法。相比于传统的统计机器翻译(SMT)而言,NMT能够训练一张能够从一个序列映射到另一个序列的神经网络,输出的可以是一个变长的序列,这在翻译、对话和文字概括方面能够获得非常好的表现。NMT其实是一个encoder-decoder系统,encoder把源语言序列进行编码,并提取源语言中信息,通过decoder再把这种信息转换到另一种语言即目标语言中来,从而完成对语言的翻译。

神经网络的seq2seq学习

序列对序列的学习,顾名思义,假设有一个中文句子“我也爱你”和一个对应英文句子“I love you too”,那么序列的输入就是“我也爱你”,而序列的输出就是“I love you too”,从而对这个序列对进行训练。对于深度学习而言,如果要学习一个序列,一个重要的困难就是这个序列的长度是变化的,而深度学习的输入和输出的维度一般是固定的,不过,有了RNN结构,这个问题就可以解决了,一般在应用的时候encoder和decoder使用的是LSTM或GRU结构。


如上图,输入一个句子ABC以及句子的终结符号< EOS>,输出的结果为XYZ及终结符号< EOS>。在encoder中,每一时间步输入一个单词直到输入终结符为止,然后由encoder的最后一个隐藏层hth_tht​作为decoder的输入,在decoder中,最初的输入为encoder的最后一个隐藏层,输出为目标序列词X,然后把该隐藏层以及它的输出X作为下一时间步的输入来生成目标序列中第二个词Y,这样依次进行直到< EOS>。下面看它详细的模型。
给定一个输入序列(x1,⋯,xT)(x_1,\cdots, x_T)(x1​,⋯,xT​),经过下面的方程迭代生成输出序列(y1,⋯,yT′)(y_1,\cdots, y_{T^{'}})(y1​,⋯,yT′​):
ht=f(Whxxt+Whhht−1)yt=Wyhht(1)h_t = f(W^{hx}x_t + W^{hh}h_{t-1})\tag{1}\\ y_t = W^{yh}h_t ht​=f(Whxxt​+Whhht−1​)yt​=Wyhht​(1)
其中,WhxW^{hx}Whx为输入到隐藏层的权重,WhhW^{hh}Whh为隐藏层到隐藏层的权重,hth_tht​为隐藏结点,$ W^{yh}为隐藏层到输出的权重。在这个结构中,我们的目标是估计条件概率为隐藏层到输出的权重。 在这个结构中,我们的目标是估计条件概率为隐藏层到输出的权重。在这个结构中,我们的目标是估计条件概率p(y_1,\cdots,y_{T{’}}|x_1,\cdots,x_T)$,首先通过encoder的最后一个隐藏层获得$(x_1,\cdots,x_T)$的固定维度的向量表示$v$,然后通过decoder进行计算$y_1,\cdots,y_{T{’}}的概率,这里的初始隐藏层设置为向量的概率,这里的初始隐藏层设置为向量的概率,这里的初始隐藏层设置为向量v$:
p(y1,⋯,yT′∣x1,⋯,xT)=Πt=1T′p(yt∣v,y1,⋯,yt−1)(2)p(y_1,\cdots,y_{T^{'}}|x_1,\cdots,x_T) = \Pi^{T^{'}}_{t=1}p(y_t|v,y_1,\cdots,y_{t-1})\tag{2}p(y1​,⋯,yT′​∣x1​,⋯,xT​)=Πt=1T′​p(yt​∣v,y1​,⋯,yt−1​)(2)
在这个方程中,每个p(yt∣v,y1,⋯,yt−1)p(y_t|v,y_1,\cdots,y_{t-1})p(yt​∣v,y1​,⋯,yt−1​)为一个softmax函数。
Sutskever等人在实际建模中有三点与上述描述不同:

  1. 使用两个LSTM模型,一个是用于encoder的,另一个用于decoder
  2. 由于深层模型比浅层模型表现要好,所以使用了4层LSTM结构
  3. 对输入序列进行翻转,即由原来的输入ABC变成CBA。假设目标语言是XYZ,则LSTM把CBA映射为XYZ,之所以这样做是因为A在位置上与X相近,B、C分别于Y、Z相近,实际上使用了短期依赖,这样易于优化
    #带注意力机制的seq2seq学习
    Bahdanau等人在Sutskever研究的基础上又提出了注意力机制,这种机制的主要作用就是在预测一个目标词汇的时候,它会自动的查找源语言序列中哪一部分与它相对应,并且在后续的查找生词中可以直接复制相对应的源语言词,这在后面再讲。
    ##Encoder
    Bahdanau等人使用的encoder是一个双向RNN(bi-directional RNN),双向RNN有前向和后向RNN组成,前向RNNf→\overrightarrow{f}f​正向读取输入序列(从x1x_1x1​到xTx_TxT​),并计算前向隐藏层状态(h1→,⋯,hT→)(\overrightarrow{h_1},\cdots,\overrightarrow{h_T})(h1​​,⋯,hT​​),而后向RNNf←\overleftarrow{f}f​从反向读取输入序列(从xTx_TxT​到x1x_1x1​),并计算反向隐藏状态(h1←,⋯,hT←)(\overleftarrow{h_1},\cdots,\overleftarrow{h_T})(h1​​,⋯,hT​​)。对于每个单词xjx_jxj​,我们把它对应的前向隐藏状态向量hj→\overrightarrow{h_j}hj​​和后向隐藏状态向量hj←\overleftarrow{h_j}hj​​拼接起来来表示对xjx_jxj​的注解(annotation,就还是个隐藏向量呗),例如hj=[hj→;hj←]h_j=[\overrightarrow{h_j}; \overleftarrow{h_j}]hj​=[hj​​;hj​​],这样,注解hjh_jhj​就包含了所有词的信息。由于RNN对最近的输入表达较好,所以注解hjh_jhj​主要反映了xjx_jxj​周围的信息。

Decoder

在这个新的结构中,定义条件概率:
p(y)=Πt=1T′p(yt∣{y1,⋯,yt−1},c)p(yt∣{y1,⋯,yt−1},c)=g(yt−1,st,c)(3)p(y)=\Pi^{T^{'}}_{t=1}p(y_t|\{y_1,\cdots,y_{t-1}\},c)\tag{3}\\ p(y_t|\{y_1,\cdots,y_{t-1}\},c)=g(y_{t-1},s_t,c)p(y)=Πt=1T′​p(yt​∣{y1​,⋯,yt−1​},c)p(yt​∣{y1​,⋯,yt−1​},c)=g(yt−1​,st​,c)(3)
其中,ggg为非线性函数,sts_tst​是decoder的隐藏状态,ccc是由encoder的隐藏序列产生的上下文向量,这个具体是什么等一会说。
把(3)式的条件概率写为:
p(yi∣y1,⋯,yi−1,x)=g(yi−1,si,ci)(4)p(y_i|y_1,\cdots,y_{i-1},x)=g(y_{i-1},s_i,c_i)\tag{4}p(yi​∣y1​,⋯,yi−1​,x)=g(yi−1​,si​,ci​)(4)
其中,sis_isi​是时间步iii的隐藏状态,可由下式来计算:
si=f(si−1,yi−1,ci)s_i = f(s_{i-1}, y_{i-1},c_i)si​=f(si−1​,yi−1​,ci​)
下面来说说这个cic_ici​是怎么出来的。上下文向量cic_ici​依赖于一系列的注解(h1,⋯,hT)(h_1,\cdots,h_T)(h1​,⋯,hT​),这些注解上面我们已经讲过。上下文向量是由这些注解hjh_jhj​加权求和算出来的:
ci=Σj=1Tαijhj(5)c_i = \Sigma_{j=1}^T\alpha_{ij}h_j\tag{5}ci​=Σj=1T​αij​hj​(5)
每个注解hjh_jhj​的权重αij\alpha_{ij}αij​由下式计算:
αij=exp(eij)Σk=1Texp(eik)(6)\alpha_{ij} = \frac{exp(e_{ij})}{\Sigma_{k=1}^Texp(e_{ik})}\tag{6}αij​=Σk=1T​exp(eik​)exp(eij​)​(6)
其中,eij=a(si−1,hj)e_{ij}=a(s_{i-1},h_j)eij​=a(si−1​,hj​)为对位模型(alignment model),由于它计算位置jjj周围的输入与位置iii的输出相匹配的得分,所以又称为得分函数。而向量αi=(αi1,αi2,⋯,αiT)\alpha_i=(\alpha_{i1},\alpha_{i2},\cdots,\alpha_{iT})αi​=(αi1​,αi2​,⋯,αiT​)为注意力向量,又为词对位向量。
整个过程的图示如下:

训练

训练集WMT’14 英语-法语,字典30000常用词,不在字典中的生词用[unk]表示,没有改变大小写,没有进行词干化。

  • 两个模型,一个RNN encoder-decoder模型(RNNencdec),另一个为建议模型(RNNsearch),训练两次,一次句子长度最大30,另一次最大50
  • RNNencdec的encoder和decoder各有1000个隐藏单元。RNNsearch的encoder前后向RNN各1000隐藏单元,decoder1000个隐藏单元
  • 输出使用maxout函数,L2正则化损失函数
  • 带有Adadelta(ϵ=10−6,ρ=095\epsilon=10^{-6},\rho = 095ϵ=10−6,ρ=095)的minbatch SGD,min-batch=80

Bahdanau与Sutskever的几点不同:

  1. 在结构上,Sutskever使用了单向的RNN,而Bahdanau使用了双向的RNN
  2. Sutskever使用了encoder的最后一个隐藏状态来作为decoder的输入并且后续的过程中不再把decoder的隐藏层作为下一时间步的输入,而Bahdanau使用了所有的encoder的隐藏状态并经过注意力机制与decoder的隐藏层一起作为decoder的初始输入,并且在后续中前一decoder的隐藏层和输出作为下一时间步的输入
  3. Bahdanau加入了注意力机制,获得了注意力向量αi=(αi1,αi2,⋯,αiT)\alpha_i=(\alpha_{i1},\alpha_{i2},\cdots,\alpha_{iT})αi​=(αi1​,αi2​,⋯,αiT​)
    ##注意力机制的改进
    在Bahdanau提出注意力机制后不久,Luong又在其基础上把注意力机制分为全局注意力(globale attention)机制和局部注意力(local attention)机制。简单的来说,是使用全部的encoder的隐藏层还是部分。要进行预测,首先还是要获得这个上下文向量ctc_tct​,这个上下文向量用来捕获源语言的相关信息来预测目标词yty_tyt​,然后把decoder的隐藏状态sts_tst​与这个上下文向量ctc_tct​拼接起来通过非线性函数产生注意力隐藏状态(attentional hidden state):
    ht~=tanh(Wc[ct;st])(7)\tilde{h_t} = tanh(W_c[c_t;s_t])\tag{7}ht​~​=tanh(Wc​[ct​;st​])(7)
    最后,使用softmax函数进行预测:
    p(yt∣y<t,x)=softmax(Wsht~)(8)p(y_t|y_{<t},x)=softmax(W_s\tilde{h_t})\tag{8}p(yt​∣y<t​,x)=softmax(Ws​ht​~​)(8)
    现在的重点还是怎么获得上下文向量ctc_tct​。
    ###Global Attention
    其实global attention与Bahdanau的一样,都是使用了全部的encoder的隐藏状态。在模型中,注意力向量αt=(αt1,αt2,⋯,αtT)\alpha_t=(\alpha_{t1},\alpha_{t2},\cdots,\alpha_{tT})αt​=(αt1​,αt2​,⋯,αtT​),每一个αtj=exp(etj)Σk=1Texp(etk)\alpha_{tj}=\frac{exp(e_{tj})}{\Sigma_{k=1}^Texp(e_{tk})}αtj​=Σk=1T​exp(etk​)exp(etj​)​,而
    etj={st′hj,dotst′Wαhj,generalvα′tanh(Wα[st;hj]),concat(9)e_{tj}=\begin{cases}s_t^{'}h_j, & dot\\ s_t^{'}W_\alpha h_j, & general\\ v_\alpha^{'}tanh(W_\alpha[s_t;h_j]), & concat \end{cases}\tag{9}etj​=⎩⎪⎨⎪⎧​st′​hj​,st′​Wα​hj​,vα′​tanh(Wα​[st​;hj​]),​dotgeneralconcat​(9)
    其中,etje_{tj}etj​就是上面所说的对应模型,也是得分函数,而st′s_t^{'}st′​为decoder第t时间步隐藏层状态的转置,hjh_jhj​为encoder的第jjj时间步的隐藏状态,$W_\alpha,v_\alpha 是可训练参数。最后算出是可训练参数。 最后算出是可训练参数。最后算出c_t$:
    ct=Σj=1Tαtjhjc_t = \Sigma_{j=1}^T\alpha_{tj}h_jct​=Σj=1T​αtj​hj​
    (这里注意一点,不要认为计算etje_{tj}etj​的时候应该用st−1s_{t-1}st−1​,因为这个模型在计算计算sts_tst​的时候没有用到ctc_tct​,要与Bahdanau的相区别)
    global attention的图示如下:

Local Attention

Local attention就是选择一个较小的上下文向量窗口,具体来说,模型在时间步ttt首先为每个目标词产生一个对应位置ptp_tpt​,而这个ctc_tct​就是在这个对应位置上下文窗口[pt−D,pt+D][p_t-D, p_t+D][pt​−D,pt​+D]中encoder的隐藏状态的加权平均,这个DDD是自己选择的(如果这个窗口到达了句子的边界,那么只考虑在窗口中词,忽略其他部分)。不同于global attention的αt\alpha_tαt​,local attention的αt\alpha_tαt​是一个固定维度的向量,即∈R2D+1\in R^{2D+1}∈R2D+1。而local attention又有两个变体:

  1. Monotonic alignment(local-m),即认为目标序列与源序列是单调对应的,所以设置pt=tp_t=tpt​=t,然后计算αt\alpha_tαt​
  2. Predictive alignment(local-p),此方法是预测一个对应位置:
    pt=L∗sigmoid(vp′tanh(Wpst))(10)p_t = L*sigmoid(v_p^{'}tanh(W_ps_t))\tag{10}pt​=L∗sigmoid(vp′​tanh(Wp​st​))(10)
    其中,Wp和vpW_p和v_pWp​和vp​是预测未知的参数,可用梯度下降法计算,LLL为源语言句子的长度,pt∈[0,L]p_t\in [0,L]pt​∈[0,L]。然后Luong使用了一个高斯分布来修正词对位权重αt\alpha_tαt​:
    αt=:αtexp(−(x−pt)22σ2)\alpha_t =: \alpha_texp(-\frac{(x-p_t)^2}{2\sigma^2})αt​=:αt​exp(−2σ2(x−pt​)2​)
    其中,设置的标准差为σ=D/2\sigma=D/2σ=D/2,注意,ptp_tpt​是一个实数,而xxx是以ptp_tpt​为中心窗口内的整数。
    具体的local attention结构表示图如下:

Input-feeding方法

其实这一步与Bahdanau的方法一样,是把最后的注意力隐藏状态ht~\tilde{h_t}ht​~​与输出拼接后作为下一时间步的输入,这样模型能有效获得前面的对位信息,图示如下:

训练

Luong的训练使用的是WMT’14训练集,两种语言字典大小50K,不在字典内的词用< unk>表示

  • 过滤掉超过50字的句子并进行混洗
  • 4层LSTM,每层1000个cell,1000维度的词向量
  • 参数使用均匀分布[-0.1,0.1]初始化
  • 使用SGD训练10轮
  • 首先用学习率1开始,5轮后,每轮对学习率减半
  • min-batch大小为128
  • dropout=0.2,使用dropout时,进行12轮,8轮后每轮对学习率减半
  • 对于local attention模型,设置D为10

Luong与Bahdanau模型的不同之处:

  1. 使用结构不同,Bahdanau使用双向RNN,而Luong又变为单向的RNN。
  2. Luong在Bahdanau的基础上把注意力机制分为global attention和local attention方法
  3. 在计算decoder的sts_tst​的时候,Bahdanau使用了st−1,yt−1,cts_{t-1}, y_{t-1},c_tst−1​,yt−1​,ct​,而Luong用了st−1,yt−1,h~t−1s_{t-1},y_{t-1},\tilde{h}_{t-1}st−1​,yt−1​,h~t−1​,没有用ctc_tct​,这在前面计算Luong的得分etje_{tj}etj​的时候也说了
  4. 在计算输出概率的时候,Bahdanau是把上下文向量ctc_tct​与decoder的隐藏状态sts_tst​直接作为参数经过非线性变换得到概率p(yt∣y1,⋯,yt−1,x)p(y_t|y_1,\cdots,y_{t-1},x)p(yt​∣y1​,⋯,yt−1​,x),而Luong是先把ctc_tct​和sts_tst​拼接在一起,经过非线性变换得到注意力隐藏向量ht~\tilde{h_t}ht​~​,最后再经过softmax函数进行预测
    ##神经网络机器翻译的几个问题
    神经网络机器翻译相比于其他统计机器翻译有很多的优势,例如NMT需要很少的领域知识,整个系统可以一起优化以及占用内存较小等。尽管有很多优点,但还有一些其他问题困扰着NMT,例如目标词汇数量可能受到限制,这是由于训练的复杂性而引起的。实践中大多使用的目标词汇为30000至80000,其他生词用[UNK]表示,但如果翻译后的目标语言中有[UNK]怎么处理呢。对于这个问题一般有两种解法:一是仍然使用大的目标词汇字典,但可使用不同的方法提高运算效率,把最后的softmax改成别的函数,如NCE(Noise Contrastive Estimation)、Hierarchical softmax等;二是仍然使用有限的字典,不过是要处理翻译出的[UNK],例如基于字符的方法,混合的方法等。本次主要讲两种方法,一种是使用大的目标字典的方法,另一种是解决输出[UNK]的方法。
    ##基于大的目标字典的方法
    Jean根据Bahdanau的模型使用了一个非常大的目标字典来训练NMT,但是由于输出的概率是使用softmax计算,如下式:
    p(yt∣y<t,x)=1Zexp{wt′ϕ(yt−1,st,ct)+bt}(11)p(y_t|y_{<t},x)=\frac{1}{Z}exp\{w_t^{'}\phi(y_{t-1},s_t,c_t)+b_t\}\tag{11}p(yt​∣y<t​,x)=Z1​exp{wt′​ϕ(yt−1​,st​,ct​)+bt​}(11)
    而计算成本最高的就是softmax的正则化项ZZZ,所以Jean在大目字典上提出了一种近似学习方法
    首先考虑对(11)式求对数梯度:
    ▽logp(yt∣y<t,x)=▽ϵ(yt)−Σk:yk∈Vp(yk∣y<t,x)▽ϵ(yk)(12)\bigtriangledown logp(y_t|y_{<t},x)=\bigtriangledown\epsilon(y_t)-\Sigma_{k:y_k\in V}p(y_k|y_{<t},x)\bigtriangledown\epsilon(y_k)\tag{12}▽logp(yt​∣y<t​,x)=▽ϵ(yt​)−Σk:yk​∈V​p(yk​∣y<t​,x)▽ϵ(yk​)(12)
    其中,能量函数ϵ(yj)=wj′ϕ(yj−1,sj,cj)+bj\epsilon(y_j)=w_j^{'}\phi(y_{j-1},s_j,c_j)+b_jϵ(yj​)=wj′​ϕ(yj−1​,sj​,cj​)+bj​
    公式(12)右边的第二项就是能量函数梯度的期望:
    EP[▽ϵ(y)](13)E_P[\bigtriangledown\epsilon(y)]\tag{13}EP​[▽ϵ(y)](13)
    其中,PPP表示为p(y∣y<t,x)p(y|y_{<t},x)p(y∣y<t​,x)
    现在是怎样估计或近似这个期望Jean使用了重要性抽样(importance sampling)方法,即找到一个提议分布(proposal distribution)QQQ和从提议分布中抽取的样本VsV^{s}Vs,那么可由下式近似估计(13)式:
    EP[▽ϵ(y)]≈Σk:yk∈VsωkΣk′:yk′∈Vsωk′[▽ϵ(yk)](14)E_P[\bigtriangledown\epsilon(y)]\thickapprox \Sigma_{k:y_k\in V^{s}}\frac{\omega_k}{\Sigma_{k^{'}:y_{k^{'}}\in V^{s}}\omega_{k^{'}}}[\bigtriangledown\epsilon(y_k)]\tag{14}EP​[▽ϵ(y)]≈Σk:yk​∈Vs​Σk′:yk′​∈Vs​ωk′​ωk​​[▽ϵ(yk​)](14)
    其中:
    ωk=exp{ϵ(yk)−logQ(yk)}(15)\omega_k=exp\{\epsilon(y_k)-logQ(y_k)\}\tag{15}ωk​=exp{ϵ(yk​)−logQ(yk​)}(15)
    在这里只是使用了一个目标字典的较小的一个子集VsV^{s}Vs就能计算出正则项。但是怎么选择这个提议分布呢?首先Jean在实践中把训练语料进行分区,在训练前,对每个分区定义一个目标词汇子集V′V^{'}V′,然后顺序扫描句子,抽取不同的单词,直到到达一个阈值τ=∣V′∣\tau=|V^{'}|τ=∣V′∣,这些句子就作为一个分区,而这个词汇子集就用于这个分区的训练,重复上述过程直到把训练目标句子分区完。假设第iii个分区用的目标词典为Vi′V_i^{'}Vi′​,对于每一个分区都对应一个QiQ_iQi​,在Vi′V_i^{'}Vi′​内,每一个目标词都具有相同的概率,而不在Vi′V_i^{'}Vi′​内的概率为0:
    Qi(yk)={1∣Vi′∣ifyt∈Vi′0otherwise(16)Q_i(y_k)=\begin{cases} \frac{1}{|V_i^{'}|} & if\quad y_t\in V_i^{'}\\ 0 & otherwise \end{cases}\tag{16}Qi​(yk​)={∣Vi′​∣1​0​ifyt​∈Vi′​otherwise​(16)
    而这个提议分布可以抵消(15)式的校正项−logQ(yk)-logQ(y_k)−logQ(yk​),非常简单,我们来推导一下:
    ωk=exp{ϵ(yk)−logQ(yk)}=exp{ϵ(yk)−log1∣Vi′∣}=exp{ϵ(yk)+log∣Vi′∣}=exp{ϵ(yk)+logτ}\omega_k = exp\{\epsilon(y_k)-logQ(y_k)\}\\ =exp\{\epsilon(y_k)-log\frac{1}{|V_i^{'}|}\}\\ =exp\{\epsilon(y_k)+log|V_i^{'}|\}\\ =exp\{\epsilon(y_k)+log\tau\}ωk​=exp{ϵ(yk​)−logQ(yk​)}=exp{ϵ(yk​)−log∣Vi′​∣1​}=exp{ϵ(yk​)+log∣Vi′​∣}=exp{ϵ(yk​)+logτ}
    最后得到与(11)式近似的概率:
    p(yt∣y<t,x)=exp{wt′ϕ(yt−1,st,ct)+bt}Σk:yk∈V′exp{wk′ϕ(yt−1,st,ct)+bk}(17)p(y_t|y_{<t},x)=\frac{exp\{w_t^{'}\phi(y_{t-1},s_t,c_t)+b_t\}}{\Sigma_{k:y_k\in V^{'}}exp\{w_k^{'}\phi(y_{t-1},s_t,c_t)+b_k\}}\tag{17}p(yt​∣y<t​,x)=Σk:yk​∈V′​exp{wk′​ϕ(yt−1​,st​,ct​)+bk​}exp{wt′​ϕ(yt−1​,st​,ct​)+bt​}​(17)
    这里的V′V^{'}V′就是Vi′V_i^{'}Vi′​,注意,提议分布QQQ得到的估计式有偏的。

在解码的时候,我们可以使用整个目标字典,但是计算成本很大,一个自然地想法就是使用一部分目标字典而不是整个,Jean使用了一个候选列表(candidate list)构建字典子集,这个候选列表包括两部分:一部分是在训练集中使用词对位模型(Bahdanau模型,αij\alpha_{ij}αij​越大,则第i个目标词与第j个源语言词对位的概率越大)对应源语言和目标语言的单词,并构建一个字典,根据这个字典,找到每个源语言句子的每个单词的前K′K^{'}K′个最相近的目标词;第二部分是对每一个源语言句子,构建一个由前KKK个最大频率词(可以根据一元模型计算)组成的目标词汇集(在这里每个句子的前KKK个最大频率词应该是一样的)。如下图表示:

处理[UNK]单词

不管是使用大的目标词字典还是小的目标词字典,总会有出现的生词,而在翻译中生词都是表示为[UNK]字符,这会造成信息的缺失,所以还原单词信息是翻译中非常重要的一步。
对于这种问题,Gulcehre认为要么是从源语言中直接复制单词过去要么是用模型进行解码生成单词。如下图所示:

他们把这两种方式整合到一个模型中去。所以他们提出了pointer softmax模型。
他们额模型仍然以Bahdanau为基础,对输出概率形式进行改进。Gulcehre的模型使用两种softmax,shortlist softmax和location softmax,前一种就是普通的softmax,每一维度对应一个字典中的词,后一种是每一个输出维度对应源语言序列一个单词的位置,然后把该单词复制过去。关键是怎么选择这两种softmax,Gulcehre使用的是一个开关网络,它输出的是一个二元变量ztz_tzt​,其表明是使用shortlist softmax(当zt=1z_t=1zt​=1)还是使用location softmax(当zt=0z_t=0zt​=0),如果时间步中期望产生的单词既不在字典中,也没有复制源语言句子的单词,那么开关网络就选择shortlist softmax,这样会产生一个[UNK]。整个示意图如下:

具体来说,给定一个输入序列x=(x1,x2,⋯,xT)x = (x_1,x_2,\cdots,x_{T})x=(x1​,x2​,⋯,xT​),我们的目标就是最大化目标单词序列y=(y1,y2,⋯,yT′)y=(y_1,y_2,\cdots, y_{T^{'}})y=(y1​,y2​,⋯,yT′​)和单词生成z=(z1,z2,⋯,zT′)z=(z_1,z_2,\cdots, z_{T^{'}})z=(z1​,z2​,⋯,zT′​):
pθ(y,z∣x)=Πt=1T′pθ(yt,zt∣y<t,z<t,x)(18)p_\theta(y,z|x)=\Pi^{T^{'}}_{t=1}p_\theta(y_t,z_t|y_{<t},z_{<t},x)\tag{18}pθ​(y,z∣x)=Πt=1T′​pθ​(yt​,zt​∣y<t​,z<t​,x)(18)
其中,产生的yty_tyt​可以是shortlist softmax产生的单词wtw_twt​,也可以是location softmax产生的位置ltl_tlt​(这个ltl_tlt​就是前面所说的词对应权重αt\alpha_tαt​)。
把上式因式分解:
p(y,z∣x)=Πt∈Twp(wt,zt∣(y,z)<t,x)×Πt′∈Tlp(lt′,zt′∣(y,z)<t′,x)(19)p(y,z|x)=\Pi_{t\in T_w}p(w_t,z_t|(y,z)_{<t},x)\times \Pi_{t^{'}\in T_l}p(l_{t^{'}},z_{t^{'}}|(y,z)_{<t^{'}},x)\tag{19}p(y,z∣x)=Πt∈Tw​​p(wt​,zt​∣(y,z)<t​,x)×Πt′∈Tl​​p(lt′​,zt′​∣(y,z)<t′​,x)(19)
其中,TwT_wTw​是zt=1z_t=1zt​=1的时间步集合,TlT_lTl​是zt=0z_t=0zt​=0的时间步集合,Tw⋃Tl={1,2,⋯,T′}T_w\bigcup T_l=\{1,2,\cdots, T^{'}\}Tw​⋃Tl​={1,2,⋯,T′},Tw⋂Tl=∅T_w\bigcap T_l=\emptysetTw​⋂Tl​=∅
等式右边的概率可以分别表示如下:
p(wt,zt∣(y,z)<t)=p(wt∣zt,(y,z)<t)×p(zt=1∣(y,z)<t)(20)p(w_t,z_t|(y,z)_{<t})=p(w_t|z_t,(y,z)_{<t})\times p(z_t=1|(y,z)_{<t})\tag{20}p(wt​,zt​∣(y,z)<t​)=p(wt​∣zt​,(y,z)<t​)×p(zt​=1∣(y,z)<t​)(20)
p(lt,zt∣(y,z)<t)=p(lt∣zt=0,(y,z)<t)×p(zt=0∣(y,z)<t)(21)p(l_t,z_t|(y,z)_{<t})=p(l_t|z_t=0,(y,z)_{<t})\times p(z_t=0|(y,z)_{<t})\tag{21}p(lt​,zt​∣(y,z)<t​)=p(lt​∣zt​=0,(y,z)<t​)×p(zt​=0∣(y,z)<t​)(21)
这里都省略了xxx,其中,p(wt∣zt,(y,z)<t,x)p(w_t|z_t,(y,z)_{<t},x)p(wt​∣zt​,(y,z)<t​,x)为shortlist softmax,p(lt∣zt=0,(y,z)<t)p(l_t|z_t=0,(y,z)_{<t})p(lt​∣zt​=0,(y,z)<t​)为location softmax。而开关概率可以作为一个有二元输出的多层感知机:
p(zt=1∣(y,z)<t,x)=σ(f(x,ht−1;θ))(22)p(z_t=1|(y,z)_{<t},x)=\sigma(f(x,h_{t-1};\theta))\tag{22}p(zt​=1∣(y,z)<t​,x)=σ(f(x,ht−1​;θ))(22)
p(zt=0∣(y,z)<t,x)=1−σ(f(x,ht−1;θ))(23)p(z_t=0|(y,z)_{<t},x)=1-\sigma(f(x,h_{t-1};\theta))\tag{23}p(zt​=0∣(y,z)<t​,x)=1−σ(f(x,ht−1​;θ))(23)
其中,σ\sigmaσ为sigmoid函数。
那么,给定NNN个源语言句子和目标语言句子对,训练的目标就是最大化下式:
max1NΣn=1Nlogpθ(yn,zn∣xn)(24)max\quad \frac{1}{N}\Sigma^N_{n=1}logp_\theta(y_n,z_n|x_n)\tag{24}maxN1​Σn=1N​logpθ​(yn​,zn​∣xn​)(24)
使用Google的一篇文章对它的评价作为结束:
this approach is both unreliable at scale — the attention mechanism is unstable when the network is deep — and copying may not always be the best strategy for rare words —sometimes transliteration is more appropriate

主要参考文献
【Ilya Sutskever, Oriol Vinyals, Quoc V. Le】Sequence to Sequence Learning with Neural Networks
【Dzmitry Bahdanau, KyungHyun Cho, Yoshua Bengio】NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
【Minh-Thang Luong, Hieu Pham, Christopher D. Manning】Effective Approaches to Attention-based Neural Machine Translation
【S´ebastien Jean, Kyunghyun Cho, Roland Memisevic, Yoshua Bengio】On Using Very Large Target Vocabulary for Neural Machine Translation
【Caglar Gulcehre, Sungjin Ahn, Ramesh Nallapati, Bowen Zhou, Yoshua Bengio】Pointing the Unknown Words

神经网络机器翻译总结相关推荐

  1. 神经网络机器翻译(一)

    文章目录 序言 Encoder-Decoder 模型原理 应用范围 局限性 注意力机制(Attention) 模型原理 原理图示 自注意力 (self-attention) 原理介绍 图示讲解 ker ...

  2. 神经网络机器翻译技术及应用(上)

    何中军,百度机器翻译技术负责人.本文根据作者2018年12月在全球架构师峰会上的特邀报告整理而成. 本报告分为以下5个部分: 机器翻译基本原理,介绍机器翻译原理.主要挑战.发展历程,及评价方法 神经网 ...

  3. 现代循环神经网络 - 机器翻译与数据集

    文章目录 机器翻译与数据集 1 - 下载和预处理数据集 2 - 词元化 3 - 词表 4 - 加载数据集 5 - 训练模型 6 - 小结 机器翻译与数据集 语言模型是自然语言处理的关键,而机器翻译是语 ...

  4. 【笔记3-7】CS224N课程笔记 - 神经网络机器翻译seq2seq注意力机制

    CS224N(七)Neural Machine Translation, Seq2seq and Attention seq2seq神经网络机器翻译 历史方法 seq2seq基础 seq2seq - ...

  5. 一个基于Tensorflow的神经网络机器翻译系统

    一个基于Tensorflow的神经网络机器翻译系统 Github地址:https://github.com/zhaocq-nlp/NJUNMT-tf 系统完全基于Tensorflow最基本的array ...

  6. 统计机器翻译与神经机器翻译区别_神经网络机器翻译的发展趋势

    神经网络机器翻译的发展趋势 作者:Isabella Massardo     编译:TransliaMT 上个 月,OpenAI 推出了其 GPT-3(生成型预训练变换器-3)的封闭测试版,展示了该模 ...

  7. 融合统计机器翻译特征的蒙汉神经网络机器翻译技术

    融合统计机器翻译特征的蒙汉神经网络机器翻译技术 杜健  内蒙古大学 [摘要]:随着机器翻译的发展,统计机器翻译已经进入瓶颈期很难有所提高,因此研究人员逐步将研究目光投向神经网络机器翻译方向.神经网络机 ...

  8. 神经网络机器翻译简单模型参考实现

    简介 本文实现了一个把阿拉伯数字转换成中文表达的神经网络翻译模型(NMT). 例如,输入 504,输出 "五百零四" 例如,输入出 4021,输出"四千零二十一" ...

  9. 神经网络机器翻译模型介绍

    以下是这个系列会引用的文献: References: [1] Google's Neural Machine Translation System:Bridging the Gap between H ...

  10. 对神经网络机器翻译(NMT)的个人见解

    首先,我们先看下经典的NMT的模型图: 这是英语对西班牙语的翻译. 有几点需要注意: (1)模型的最后输出层(FC),输出维度为训练集中所有词,即训练集中一个出现了n个词,那么输出维度就是n. (2) ...

最新文章

  1. 洪小文:以科学的方式赤裸裸地剖析人工智能
  2. 让Linux系统崩溃最快速的方法
  3. 带你刷burpsuite官方网络安全学院靶场(练兵场)之客户端漏洞——跨站请求伪造(CSRF)专题
  4. matlab中鼠标光标后面的阴影怎么去除,UG在绘图是拖动鼠标出现残影怎么回事?看看这个方法就知道了...
  5. 【分享】WeX5的正确打开方式(1)
  6. 使用反应流作为Drools的数据源
  7. REVERSE-PRACTICE-BUUCTF-15
  8. module ‘tensorflow‘ has no attribute ‘sparse ‘
  9. range函数python_range()函数以及Python中的示例
  10. cookie java 写入_JAVA中如何读写COOKIE
  11. VS C++ 重新编译
  12. 统计学基础知识(一)
  13. php通讯hpsocket,HP-Socket 远程通信 服务端 客户端 源码
  14. win7如何设置wifi热点_教你win7如何设置网络共享文件夹
  15. java怎么输出无损高清音乐_MP3转换器如何将无损FLAC音频转换成MP3音乐
  16. win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  17. Vue组件嵌套时生命周期函数触发顺序是什么?
  18. 【论文笔记】PSEUDOSEG: DESIGNING PSEUDO LABELS FOR SEMANTIC SEGMENTATION
  19. iOS动态库实现插件化
  20. android 仿微信聊天气泡显示图片,怎么实现微信聊天时的气泡图(一)

热门文章

  1. 完美破解PS插件Parker
  2. WEB - 使用CSS 画一个正方体
  3. bada 2D游戏编程——开篇说明
  4. avr 74hc595驱动数码管动态显示c语言例程,ATmega8驱动74HC595程序
  5. pytorch 介绍
  6. 不开机win7计算机还原,win7忘记开机密码一键还原操作不了怎么办
  7. 全国省市县数据库脚本
  8. JAVA发送HttpClient请求及接收请求完整代码实例
  9. adb 截屏和录屏命令
  10. 在电信和联通的围攻下,大象中国移动显示出脚步蹒跚迹象