您的位置:首页 > 理论基础 > 计算机网络

使用Seq2Seq网络和Attention机制的机器翻译原理介绍

2019-04-12 15:50 190 查看

使用Seq2Seq网络和Attention机制的机器翻译原理介绍

在这部分的实验中,我们将实现用RNN将中文翻译成英文。

数据准备和预处理

实验中用到的数据是大量的中英文平行语料:“um-corpus”

“um-corpus”中分别有各2215000条中英文训练语料和各5000条中英文测试语料。

  • 数据处理步骤
      将文件中的双语平行语料分开成train.en和train.zh,并把语料分割成一句一句的
    1. 裁剪语料,将分割的每两个语言的句子变成一个pair
    1. 英文语料预处理:

    a. unicode -> ascii
    b. .!? 前后加上空格
    c. 删除处字母和.!?以外的其他所有字符
    d. 删除连续的空格,仅保留一个
    e. 前后加上&lt;start&gt;,&lt;end&gt;&lt;start&gt;,&lt;end&gt;<start>,<end>

    1. 中文语料预处理:

    a. 。!?前后加上空格
    b. 删除。!?以外的标点符号
    c. 删除连续的空格,仅保留一个
    d. 使用结巴分词
    e. 前后加上&lt;start&gt;,&lt;end&gt;&lt;start&gt;,&lt;end&gt;<start>,<end>

Seq2Seq

什么是Seq2seq呢?简单的说,就是根据一个输入序列x,来生成另一个输出序列y。它有很多应用,比如机器翻译,文档摘取,问答系统等等。在翻译中,输入序列是待翻译的文本,输出序列是翻译后的文本;在问答系统中,输入序列是提出的问题,而输出序列是答案。

为了解决seq2seq问题,有人提出了encoder-decoder模型,也就是编码-解码模型。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,可以自由组合。比如说,在编码时使用GRU,解码时使用LSTM等等。

编码The encoder

这边选取编码和解码都是RNN的组合来说明。在RNN中,当前时间的隐藏状态hth_{t}ht​是由上一时间的状态和当前时间输入决定的,也就是:

ht=f(ht−1,xt)h_{t}=f(h_{t-1},x_{t})ht​=f(ht−1​,xt​)

获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量:

C=m(h1,h2,h3,...,hT)C=m(h_{1},h_{2},h_{3},...,h_{T})C=m(h1​,h2​,h3​,...,hT​)

一种简单的方法是将最后的隐藏层hTh_{T}hT​作为语义向量C。

解码The decoder

解码阶段可以看做编码的逆过程。这个阶段,我们要根据给定的语义向量C和之前已经生成的输出序列(y1,y2,...,yt−1)(y_{1},y_{2},...,y_{t-1})(y1​,y2​,...,yt−1​)来预测下一个输出的单词yty_{t}yt​。

yt=∏t=1Tp(yt∣{y1,y2,...,yt−1},C)y_{t}=\prod_{t=1}^{T}p(y_{t}|\left\{y_{1},y_{2},...,y_{t-1}\right\},C)yt​=t=1∏T​p(yt​∣{y1​,y2​,...,yt−1​},C)

即产生词典中各个词语属于yty_{t}yt​的概率。

Attention

Attention允许解码器网络“聚焦”编码器输出的不同部分,用于解码器自身输出的每个步骤。首先,我们计算一组注意力权重(attn_weights)。将其乘以编码器输出向量以创建加权组合。结果(在代码中称为attn_applied)应该包含关于输入序列的特定部分的信息,从而帮助解码器选择正确的输出字。

使用另一个前馈层attn,使用解码器的输入和隐藏状态作为输入,计算注意力权重(attn_weights)。因为在训练数据中有各种大小的句子,为了实际创建和训练这个层,我们必须选择它能够应用的最大句子长度(输入长度,用于编码器输出)。最大长度的句子将使用所有的注意权重,而较短的句子只使用前几个。

训练模型

训练数据

为了训练,对于每一个pair,我们需要一个input_tensor(输入句中单词的索引)一个target_tensor(目标句中单词的索引)。在创建这些向量时,我们将向两个序列前加EOS token。

模型

在训练过程中,我们通过编码器运行输入语句,并跟踪每一个输出和最新的隐藏状态。然后解码器将SOS token作为第一个输入,并将编码器的最后隐藏状态作为 它的第一隐藏状态。

“Teacher forcing”的概念是使用目标输出的真实值作为下一输入,而不是使用解码器的预测值作为下一个输入。使用“Teacher forcing”使算法收敛更快,但当训练网络被开发时,它可能表现出不稳定性。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: