使用Seq2Seq网络和Attention机制的机器翻译原理介绍
使用Seq2Seq网络和Attention机制的机器翻译原理介绍
在这部分的实验中,我们将实现用RNN将中文翻译成英文。
数据准备和预处理
实验中用到的数据是大量的中英文平行语料:“um-corpus”
“um-corpus”中分别有各2215000条中英文训练语料和各5000条中英文测试语料。
- 数据处理步骤
-
将文件中的双语平行语料分开成train.en和train.zh,并把语料分割成一句一句的
-
-
裁剪语料,将分割的每两个语言的句子变成一个pair
-
-
英文语料预处理:
-
-
中文语料预处理:
a. unicode -> ascii
b. .!? 前后加上空格
c. 删除处字母和.!?以外的其他所有字符
d. 删除连续的空格,仅保留一个
e. 前后加上<start>,<end><start>,<end><start>,<end>
a. 。!?前后加上空格
b. 删除。!?以外的标点符号
c. 删除连续的空格,仅保留一个
d. 使用结巴分词
e. 前后加上<start>,<end><start>,<end><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∏Tp(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”使算法收敛更快,但当训练网络被开发时,它可能表现出不稳定性。
- 神经网络机器翻译模型介绍-GNMT
- 深度学习之卷积网络attention机制SENET、CBAM模块原理总结
- 6.3 强大的网络请求第三方框架 Retrofit 的介绍和使用<未完待翻译>
- 神经网络机器翻译模型介绍
- seq2seq里的 attention机制 的 原理 及 代码 及 个人理解
- 神经网络机器翻译模型介绍-总结
- 使用深度学习进行语言翻译:神经网络和seq2seq为何效果非凡?
- TensorFlow从1到2(十)带注意力机制的神经网络机器翻译
- Seq2Seq非常好的代码(机器翻译、对话生成等):漫谈四种神经网络序列解码模型【附示例代码】
- 如何发布WebService呢?使网络中其它机器能使用我的WebService
- GPS全球定位技术、GSM网络定位技术、CDMA网络定位技术精度及其原理介绍
- 翻译:使用Libevent的快速可移植非阻塞网络编程:异步IO简介
- Lucene.net 原理介绍以及使用方法
- [翻译]DrawMe - 使用WPF/WCF创建的网络白板聊天程序
- javascript 使用金山词霸网络翻译
- 使用SVN+CruiseControl+ANT实现持续集成之一----持续集成概念及CC原理介绍
- offsetTop、offsetLeft、offsetWidth、offsetHeight原理使用介绍
- Timer与TimerTask的真正原理&使用介绍
- 使用Command模式实现撤销机制 (Code Project 精选翻译)
- 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络