基于Attention的机器翻译模型,论文笔记

论文题目:Neural Machine Translation by Jointly Learning to Align and Translate

论文地址:http://pdfs.semanticscholar.org/071b/16f25117fb6133480c6259227d54fc2a5ea0.pdf

GIF来源:https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

摘要

        神经机器翻译(Neural machine translation,NMT)是最近提出的机器翻译方法。与传统的统计机器翻译不同,NMT的目标是建立一个单一的神经网络,可以共同调整以最大化翻译性能。最近提出的用于神经机器翻译的模型经常属于编码器 - 解码器这种结构,他们将源句子编码成固定长度的矢量,解码器从该矢量生成翻译。在本文中,我们推测使用固定长度向量是提高这种基本编码器 - 解码器架构性能的瓶颈,提出让模型从源语句中自动寻找和目标单词相关的部分,而不是人为的将源语句显示分割进行关系对应。采用这种新方法,我们实现了与现有最​​先进的基于短语的系统相媲美的英文到法文翻译的翻译性能。此外,定性分析显示模型发现的(软)对齐与我们的直觉非常吻合。

 

简介 

     之前的NMT在处理长句子的时候会有些困难,尤其是比训练数据集更长的文本。随着数据句子长度增加,基本的编码解码器表现会急剧下降。因此,该论文提出将编码解码模型拓展,使其能够连带地学习去对齐和翻译。每翻译一个单词,它就在源语句中查找信息最相关的位置集合。这个模型基于与这些源位置相关联的上下文向量和所有之前形成的目标单词预测目标单词。 
最大的区别在于它不是尝试去把一整个输入句子编码为一个单一的固定长度的向量。而是把输入的句子编码为向量的序列,解码翻译的时候选择这些向量的一个子集。这也就解放了NMT,不需要再把源语句所有的信息,不管有多长,压缩成一个固定长度的向量。这个模型对长句子表现要更好。不过任何长度上它的优势都很明显。在英法翻译的任务中,这个方法可以媲美基于短语的系统。而且分析显示这个模型在源语句和对应的目标语句之间的对齐效果更好。

 

背景:神经机器翻译

      从概率的角度上来说,机器翻译的任务等同于找到一个目标序列y,使得在给定源语句x的情况下生成y的概率最大。即:

arg_{y}max(p(y|x)),在NMT任务中,我们使用平行的训练语料库(即:x,y为相同内容的2种语言)来拟合参数化的模型,让模型学习到能最大化目标语句的条件概率分布。NMT一旦学会了这种条件概率分布,那么给予一个源语句,它都能通过搜索找出条件概率最大的句子作为相应的翻译。

 RNN Encoder–Decoder:

      首先介绍一下本文使用的底层框架RNN Encoder–Decoder。本文是在此框架上进行修改从而提出的。Encoder读取一个向量化的输入序列X=(x_{1},x_{2}...x_{T_{x}}),转化成向量c。最常见的方法是使用RNN:

                                                                                   h_t=f(x_t,h_{t-1})

                                                                                   c=q({h_{1},h_{2}...h_{T}}) 

其中h_{t}=\in \mathbb{R}_{n}是时间t时刻下的hidden state,c是由hidden state组成的序列生成的向量。fq是2个非线性的函数。例如:你可以使用LSTM作为函数f来得到hidden state,同时你可以使用q({h_{1},h_{2}...h_{T}})=h_{T}来作为q的函数。

      Decoder一般情况下是通过训练给定上下文向量c和所有之前已经预测过的单词\{ y_{1},...y_{t^{'}-1} \}来预测下一个单词y_{t^{'}},换句话说,Decoder通过将联合概率分解成有序条件来定义翻译为序列y的概率:                                         

                                                                                 p(Y)=\prod _{t=1}^{T}p(y_{t}|\{y_{1},...y_{t-1}\},c)                                              (1)

其中Y=(y_{1},...y_{T_{y}}),通过RNN,每个条件概率被建模为:

                                                                                p(y_{t}|\{y_{1},...,y_{t-1}\},c)=g(y_{t-1},s_{t},c)

其中g是一个非线性的(可能是多层的)函数,它的输出指的是输出结果为y_{t}的概率。s_{t}是RNN的hidden state。

 

对齐翻译结构

 这部分提出一个NMT的新结构。这个新结构包括一个双向RNN作为Encoder,一个模拟翻译过程中通过源语句进行搜索的Decoder。     

Decoder:

 在这个新的结构中,我们对公式(1)中的条件概率分布做了新的定义:

                                                                              p(y_{i}|\{y_{1},...y_{i-1}\},X)=g(y_{i-1},s_{i},c_{i})

其中,s_{i}是时间i时RNN的hidden state,由公式:

                                                                              s_i=f(s_{i-1},y_{i-1},c_{i})

需要注意的是,与现有的EncoderDecoder模式不同(如上节),这里概率是针对每个目标字y_{i}的不同的上下文向量c_{i}。上下文向量c_{i}取决于Encoder将输入句子映射到的annotations(即序列 ({h_{1},h_{2}...h_{T_{x}}}))。在annotations中,每个h_{i}包含了整个输入序列的信息,但重点关注(Attention)输入序列中第i个单词周围的部分。下一节会介绍annotations的计算方法。这一节我们先默认我们已知annotations。

                                                           

观察上图,上下文向量c_{i}实则是对annotations序列h_{i}的逐个加权求和:

                                                                                        c_{i}=\sum _{j=1}^{T_{x}}\alpha _{ij}h_{j}

每个h_{i}的权值\alpha _{ij}的计算:

                                                                                     \alpha _{ij}=\frac{exp(e_{ij})}{\sum _{k=1}^{T_{x}}exp(e_{ik})}

其中                                                                                e_{ij}=a(s_{i-1},h_{j})

e_{ij}是一个对齐模型,它可以评估值位置j周围的输入和位置i的输出匹配程度。对匹配程度的打分依赖于RNN hidden state(s_{i-1})和输入序列的第j个的值h_{j}

                                                                          a(s_{i-1},h_{j})=v_a^{T}tanh(W_as_{i-1}+U_ah_j)

      我们将对齐函数a参数化为一个前馈神经网络,让它和本文中的其它模块联合训练。需要注意的是,不同于传统的机器翻译,这里的对齐值不再被视为潜在的变量。与之相反,对齐模型定向地计算一个柔和的对齐,这就允许代价函数的梯度反向传播。这个梯度就可以随着整个翻译模型一起训练这个对齐模型。

       我们可以将所有对annotations加权求和的方式看做是在计算数学期望,并且期望值是可能在对齐值之上的。设\alpha _{ij}为目标单词y_{i}与源词x_{i}对齐的概率,(通俗说就是x_{i}的翻译结果为y_{i}的概率),然后,第i个上下文向量c_{i}是所有具有概率的\alpha _{ij}的数学期望。

            概率\alpha _{ij}(或者说e_{ij})反映了在决定下一个状态s_{i}和生成y_{i}的时候,考虑到之前的hidden state (s_{i-1})的 annotation h_{j}的重要性。直观地说,这实现了Decoder中的Attention机制。 Decoder决定了源语句的哪些部分需要注意。 通过让Decoder具有注意力机制,我们可以免除Encoder将源句子中的所有信息编码成固定长度矢量的负担。 有了这个方法,信息就可以在annotations序列中传播,也可以被Decoder选择性地恢复。

Encoder: Bidirectional RNN for Annotating Sequences

一般的RNN模型,是按顺序由开始位置x_{1}到结束位置x_{T}读取的。然而在本文提出的结构中我们希望每个单词的annotations不仅能总结前面的单词,而且能总结后面紧跟着的单词。因此,在此处我们将使用双向RNN(Bi-RNN)。

如图一,Bi-RNN包含了前向hidden states和反向hidden states,其读取序列的方式是正好相反的,举个例子对于一句话“我爱祖国”,前向做的读入顺序为(我,爱,祖,国)和反向读入顺序为(国,祖,爱,我)。

我们通过连接前向隐藏状态和后向隐藏状态来获得每个单词x_{j}的annotations,可以表示为:,通过这个方式,annotations h_{j}将集中在x_{j}的周围单词上。Decoder和对齐模块稍后会使用该序列来计算上下文向量c_{i}

结构介绍:

RNN

当前状态:s_{i}=f(s_{i-1},y_{i-1},c_{i})=(1-z_{i})\odot s_{i-1}+z_{i}\odot s_{i}^{'}

更新状态:s_{i}^{'}=tanh(We(y_{i-1})+U[r_{i}\odot s_{i-1}]+Cc_{i})

更新门: z_{i }=\sigma (W_ze(y_{i})+U_zs_{i-1}+C_zc_{i})

重置门: r_{i }=\sigma (W_re(y_{i})+U_rs_{i-1}+C_rc_{i})

对齐模型

a(s_{i-1},h_{j})=v_a^{T}tanh(W_as_{i-1}+U_ah_j)

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
PyTorch是一种深度学习框架,可以用于实现序列到序列(seq2seq)的机器翻译任务。在seq2seq模型中,编码器将源序列编码为一个固定长度的向量,解码器则将该向量解码为目标序列。为了提高翻译质量,可以使用注意力机制来在解码器中引入上下文信息。 在PyTorch中实现seq2seq模型,可以使用nn.Module类来定义模型架构。首先,需要定义编码器和解码器的结构。编码器通常使用循环神经网络(RNN)或卷积神经网络(CNN)进行实现,而解码器则需要使用注意力机制。注意力机制可以使解码器关注输入序列中最相关的部分并根据其进行翻译。 实现注意力机制时,需要计算每个输入序列位置和当前解码器状态之间的相似度。这可以通过计算点积或使用神经网络来实现。然后,可以将相似度作为权重,对输入序列进行加权求和,以计算上下文向量。最后,将上下文向量与当前解码器状态组合在一起,以生成下一个目标序列符号的概率分布。 在训练过程中,可以使用交叉熵损失函数来计算模型输出与正确目标序列之间的差异,并使用反向传播算法更新模型参数。在推理过程中,可以使用贪婪搜索或束搜索来生成翻译结果。 总的来说,PyTorch提供了一种灵活且高效的方式来实现seq2seq模型和注意力机制,可以用于各种自然语言处理任务,包括机器翻译、问答系统和对话生成等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值