首先,请阅读先修知识:
可以看出,整个seq2seq模型分为两大部分:Encoder RNN和Decoder RNN。
在「Encoder RNN」部分,先将待翻译的原文经过一个RNN (这里可以是vanilla RNN, LSTM,GRU等等),并且使用最后一个隐藏状态作为整句话的encoding表示,作为Decoder RNN的初始隐藏状态输入到Decoder RNN中去。
在「Decoder RNN」部分,每个timestep的「输入」就是翻译后的词语embedding,将每一步的隐藏状态经过全连接层,得到整个词汇表每个词的概率分布,然后和实际的词语(one-hot编码)去对比,得到交叉熵损失。将所有的交叉熵损失求平均,即可得到整体的损失。
「decoder RNN」 的第一个输入是 「<START>」, 每一步的hidden state再经过一个全连接层得到整个词汇表的概率分布,之后取一个概率最大的词(argmax)作为此时的翻译。每一个 timestep 的翻译词作为下一个timestep的输入,以此继续,直到最后输出**<END>**
贪婪的decoding方法就是每一步都选概率最大的那个词语作为下一步的输入:
这种方法的问题就是无法回退->可能陷入局部极小值(local minima).
所以,我们引入了「beam search」的方法。
beam search的核心思想是,每一步都考虑 k 个最可能的翻译词语, k 叫 「beam size」。最后得到若干个翻译结果,这些结果叫hypothesis,然后选择一个概率最大的hypothesis即可。
例如,当选择k = 2时,翻译 il a'm' entarte:
<START>后面概率最大的两个词是"I"和"he",概率的log值分别为-0.9和-0.7。我们就取这两个词继续往下递归,"<start>he"再往后概率最大的两个词是"hit"和"struck",其概率的对数加上之前的-0.7,分别得到-1.7和-2.9,也就是"he hit"和"he struck"的得分分别为 -1.7 和-2.9 。同理,“I was" 和 "I got"的得分分别为 -1.6 和-1.8. 在这一步,又取得分最高的两句话"he hit"(-1.7)和"I was"(-1.6)往下递归,在此省略若干步骤…
迭代若干步之后得到:
取最终得分最高的那句话,“he hit me with a pie.”
「beam search 的终止条件:」
在 beam search中,不同的词语选择方法会导致在不同的时候出现<END>,所以每个hypothesis(翻译句子)的长度都不一样。当一个hypothesis最终预测出了<END>,就说明这句话已经预测完毕了,就可以把这句话先放在一边,然后再用beam search取搜索其他的句子。
所以,beam search的终止条件可以为:
「选择最好的hypothesis:」
对于一个需要我们翻译的外文句子,有若干个可能的hypothesis,对每个hypothesis都计算一个score:
但是这个有一个非常明显的问题!就是越长的句子score越低,因为连乘导致了概率值越来越小。当然解决这个问题的方法也很简单了,就是对每个句子的长度做一个平均。
但是,回忆之前的这个例子:
我们好像没有对长度做平均对吧?这是因为每一步的句子长度都是一样的,平均和不平均没有任何区别。
BLEU(Bilingual Evaluation Understudy) 比较了我们的机器翻译结果和人翻译的结果(ground truth)进行相似度计算。这里所谓的“相似度”就是用两者的1-gram, 2-gram… n-gram重合度来算的。
同时,别忘了对长度较短的翻译做一个惩罚,这是因为如果我们让翻译特别短,只翻译出那些特别确定的词,那么n-gram重合度一定高,但是这并不是一个很好的翻译!
BLEU评测很有效,但有的时候并不完善。这是因为对于一句外文,有很多可能的翻译方式,如果只用n-gram进行精确匹配,可能会导致一个原本很好的翻译评分很低。
例如:
在训练语料里面she比较有可能是nurse;he比较有可能是programmer,所以出现了&amp;amp;quot;性别歧视&amp;amp;quot;
再看一个更可怕的例子:
这是因为Somali-Eng平行语料库主要是基于《圣经》,所以在这里机器翻译算法只是在用language model生成一些随机的词语而已…
所以,attention机制就是为了解决这种「information bottleneck」的问题才引入的。
on each step of the decoder, use 「direct connection」 to the encoder to focus on a particular part of the source sentence.
「step1.」 对于decoder的每一个timestep t,都计算它和encoder的每一步的点乘,作为score。之后再把这些score做softmax,变成概率分布。可以看到,第一个柱子最高,说明我们在翻译<start>的时候,需要格外注意source sentence的第一个位置。
用概率分布去乘以encoder每一步的hidden state,得到一个加权的source sentence表示:
**step2:**用概率分布去乘以encoder每一步的hidden state,得到一个加权的source sentence表示。
「step3:「之后,把source sentence的表示和decoderRNN每一步的hidden state」拼接」在一起,得到一个长向量。然后再经过一层全连接网络,得到整个词汇表的概率分布。取一个argmax即得到这一步的预测值。
.... ....
Attention helps us get alignment for FREE!
[1]
cs224n-2019-lecture08-nmt: https://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture08-nmt.pdf