NLP实践项目四:基于Seq2Seq(包含Attention)的机器翻译(pytorch实现)

直接看代码:github传送门
数据集:随机生成如下形式的日期对,输入是人可以阅读的各种日期形式,输出为正规化的日期形式。参考吴恩达老师网易云深度学习课程作业5。

输入 输出
monday march 7 1983 1983-03-07
9 may 1998 1998-05-09
08 jul 2008 2008-07-08
9/10/70 1970-09-10
1. 数据预处理

机器翻译任务需要在输出的句子前后添加一个标签做标志,通常在输出句子开头添加一个标签,末尾添加一个标签。

2. 模型定义

    翻译模型的任务就是将源语言的句子转换为相同语义的目标语言的句子,在本实验用到的数据集中,源语言就是人可读的日期,目标语言就是机器可读的日期。
    seq2seq模型是一种基于编码解码思想的模型,具体而言就是先对源语言句子进行编码(encoding),得到一个包含源句子语义信息的状态矩阵,然后对状态矩阵进行解码(decoding),输出转换后的句子。
    编码(encoding)部分前面在介绍使用RNN做文本分类时有做过,其核心目的就是得到包含句子语义的矩阵。
    解码(decoding)部分需要注意,在编码完成后得到了包含句子语义的矩阵,通常是源语言句子得到的最后一个time step的隐状态矩阵,我们使用该矩阵作为解码RNN的初始隐状态矩阵,这样解码器就得到了源句子包含的语义信息,有了隐状态矩阵,解码RNN每个time step的输入是什么呢?下面的图展示的训练过程中的处理方式:
NLP实践项目四:基于Seq2Seq(包含Attention)的机器翻译(pytorch实现)_第1张图片
对于训练数据集,我们知道源句子对应的目标句子是什么,所以在解码的时候可以在每一个time step输入标准答案,如上图所示,输入到decoder中的序列是标准答案前加上一个标签[ < s t a r t > , x 1 , x 2 , x 3 , . . . , x n {, x_1,x_2,x_3,...,x_n} <start>,x1,x2,x3,...,xn],decoder的期望输出就是标准答案加上标签[ x 1 , x 2 , x 3 , . . . , x n , < e n d > { x_1,x_2,x_3,...,x_n,} x1,x2,x3,...,xn,<end>],这种学习策略被称为Teacher Forcing,也就是在学习过程中每一步输入正确答案。最后直接使用decoder的输出使用交叉熵损失函数计算损失。这是在知道标准答案的情况,在对训练好的模型进行测试时呢?处理如下:
NLP实践项目四:基于Seq2Seq(包含Attention)的机器翻译(pytorch实现)_第2张图片
    在测试时没有标准答案,所以只能在每个time step解码完成后将结果输入到解码RNN中,一直解码直到出现结束标签,当然在训练的时候也可以选择这样的学习策略。
    以上是最简单的seq2seq模型,它的问题之一就是,无论源句子有多长,模型总是要一次性读完然后翻译,这使得模型难以学习到翻译中的一些局部信息以及单词对应关系等,此外对过长的句子进行语义编码也可能导致语义丢失等问题,所以有人提出了一种Attention机制,具体计算过程如下图所示,简单概括一下它的思想就是在使用decoder进行解码时,将当前的隐状态矩阵去和encoding过程中的各个time step的隐状态进行运算,这一步可理解为探索当前这一步翻译所要产生的单词和源句子中各个单词的关系。
NLP实践项目四:基于Seq2Seq(包含Attention)的机器翻译(pytorch实现)_第3张图片
参考链接:

  1. cs224n seq2seq ppt
  2. 为什么需要Attention

你可能感兴趣的:(自然语言处理)