GRU AND NMT Advance

深入GRU

把GRU再详细讲一讲。

RNN的梯度消失就不赘述了,红线连乘多次下溢出。

而GRU额外添加了一些“捷径”红线,允许梯度直接流过去,而不是连乘的方式递减过去。

Update Gate

用来自适应学习应该把多少注意力放到前一个隐藏层状态上。

Reset Gate

门多了之后,就可以灵活地选择读取部分寄存器,执行运算,写入部分寄存器。

Reset Gate起到决定要读哪些寄存器的目的,而Update Gate决定要写的寄存器。这里的“决定”其实是“强度”的意思,不是绝对的。

深入LSTM

宏观上的LSTM Cell:

将所有操作都gate起来,方便遗忘甚至忽略一些信息,而不是把所有东西都塞到一起。

New Memory Cell的计算是一个非线性的过程:

最关键之处在于,Memory Cell的更新中有一个加法项直接来自上一刻的Cell,也就是说建立了ct和ct−1的直接线性连接(与ResNet类似):

类似于GRU中的加法,在反向传播的时候允许原封不动地传递残差,也允许不传递残差,总之是自适应的。

有了这些改进,LSTM的记忆可以比RNN持续更长的step(大约100):

MT评测

以前人们认为交给人类译员来打分是最好的,但这太主观了,10个译员给出的翻译可能都不相同。

BLEU

后来IBM发明了一种简单有效的评价策略,叫BLEU。

通过比较标准译文与机翻译文中NGram的重叠比率(0到1之间)来衡量机翻质量。

Brevity Penalty(BP)

是否可以通过输出大量无意义的the之类来作弊?不,通过Brevity Penalty来防止机翻比译员译文短。

一般取4-gram之内参与评测,最终的分值是所有ngram分值的几何平均乘上一个Brevity Penalty:

BLEU 和 BP 的计算

计算公式

其中 BP 的计算公式是当$c \leq r 时,为 e^{1-\frac{r}{c}}$,后边的 r,c是一个整体

BP代码实现

求 BP 的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def _modified_precision(candidate, references, n):
counts = Counter(ngrams(candidate, n))

if not counts:
return 0

max_counts = {}
for reference in references:
reference_counts = Counter(ngrams(reference, n))
for ngram in counts:
max_counts[ngram] = max(max_counts.get(ngram, 0), reference_counts[ngram])

clipped_counts = dict((ngram, min(count, max_counts[ngram])) for ngram, count in counts.items())

return sum(clipped_counts.values()) / sum(counts.values())

BLEU的计算

Multiple Reference Translations

为了防止某篇机翻实际上很好,可就是跟人类译文用词行文不相似的情况,IBM的论文建议多准备几篇标准答案,这样总会撞上一个:

解决大词表问题

大词表问题指的是softmax的计算难度:

早期的MT系统会使用较小的词表,但这并不是解决问题,而是逃避问题。

另一种思路是,hierarchical softmax,建立树形词表,但这类方法过于复杂,让模型对树形结构敏感而不是对词语本身敏感。

Large-vocab NMT

最新的方法是训练时每次只在词表的一个小子集上训练,因为40%的词语只出现一次,如果把训练数据均分为许多份,则每一份中的稀有词可能都不会在其他语料中出现。然后测试时加一些技巧。

如何选择小词表呢?在刚才的方法上更进一步,让用词相似的文章进入同一个子集,这样每个子集的词表就更小了。

测试

测试的时候先雷打不动将前K个最常使用的单词加入备选词表,然后将原文中每个单词可能的前K′个翻译加进去。最后在备选词表上softmax。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信