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

首先,我们先看下经典的NMT的模型图:

这是英语对西班牙语的翻译。

有几点需要注意

(1)模型的最后输出层(FC),输出维度为训练集中所有词,即训练集中一个出现了n个词,那么输出维度就是n。

(2)模型每次只会对一个词进行预测,不能将整句话翻译出来。

(3)模型对每一个词进行预测翻译时,除了输入编码器的各个单元的状态和最后的总的隐藏状态,还必须输入“引子”。 比如对预测第一个词,必须输入(<s>){代码中输入的是(“start”)},通过“引子”来预测第一个词应该输出什么。那么那个词对应的输出点的“概率值”就最大。 接下来预测第二个值,就把预测出的第一个词 作为“引子”给输进去。 以此类推。

(4)模型虽然能在句子不同长度下准确预测,完全是依赖于最后的标志符(/s){代码中的句末标识符为(“end”)},但是模型每次输入(x)完全是等长的,其长度完全依赖于你的训练集中最长句子的长度。

(5)经典的NMT模型是 encode-decode模型,主要依赖于RNN网络。在2017年,谷歌提出了新的NMT框架,只需要attention来做翻译。详细了解请参考文章(attention is all you need)。

本文代码参考https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/nmt_with_attention/nmt_with_attention.ipynb

(6)对于模型中的注意力机制,有两类可以使用,第一类,使用 加性注意力机制,第二类 使用乘性注意力机制。

 

在这里,我大致解读下,加性注意力机制在代码中的实现方式,(从batch的角度看

假设编码器的输出为enc_output=[batch_size,text_len,hidden_size], 最后隐藏状态的输出为 hidden_state=[batch_size,1,hidden_size],为了方便 套用几个数字 enc_output=[64,16,1024], hidden_state=[64,1,1024]

首先要先将 hidden 和 enc 的信息做融合: 采用两个矩阵 W1,W2,[1024,1024](矩阵实现使用FC层实现的), 两个矩阵分别和enc 、hidden相乘 ,得到 enc_w2=[64,16,1024], hidden_w1=[64,1,1024] ,然后将两者相加,enc_w2+hidden_w1 =[64,16,1024] (相加的方式采用 tensor 广播运算)。 接下来使用 激活函数 tanh 激活 , 再使用 Va矩阵 ,[1024,1](实现方式相同),得到  score=[64,16,1].   ------------公式4 完成

其次,  将score使用softmax 激活,做归一化。 得到 attention_weight=[64,16,1]    ------公式1 完成

接下来 , 将 attention_weight , enc_output做点乘(multiply 或 * ),得到 context_vector_temp=[64,16,1024] , 再将 dim=1 求和,(相当于将16个输入单词的每一维度相加), 得到 context_vector=[64,1024]  -------公式2 完成

 

最后 ,先将context_vector 升维,得到context_vector=[64,1,1024]。然后将“引子”的embeding,x=[64,1,256] 与之合并,得到

context_x=[64,1,1280] .然后再输入到 编码器的单元细胞中 gru, 得到  dec_out=[64,1,1024].  ------公式3 完成

转化维度,为=[64,1024,]经过 FC层(dict_len)得到  out=[64,dict_len].       --------一个单词的预测结束。

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值