基础模型
基础模型是用RNN模型,前部分是encoder用来寻找法语输入的编码,后半部分是decoder用来生成英文翻译作为输出,每次输出一个单词,直到输出结束标志如EOS。
下面是另一个例子,在CNN模型输出层之前会输出图片的向量,我们将这个向量输入到RNN模型,然后让RNN模型输出标题,直到遇到结束符
可以看到上述两个基础模型更像是语言模型的特化版本,语言模型的输入是0向量,而这两个模型的输入是Encoder的输出。
选择最可能的输出
在上面的基础模型中,有了Encoder的输出作为decoder的输入,decoder是一个特化的语言模型,它用来评估一个序列在特定输入下的概率,我们需要挑选出概率最大的输出。
这里我们不能使用上面所说的类似贪心的方式输出,即每轮输出都选用概率最大的下个单词,并将其作为下一轮输出的输入。课程举了一个例子,比如翻译时,前两个输入是Jane is,预测第三个单词时在语言模型中going命中的概率通常要大于visiting,这样会导致语言模型生成了下面的输出,但是可以看到下面的输出质量是不如上面的。
但是所有单词的任意组合是指数形式上涨的,我们没法评估所有的单词组合的概率,因此需要有近似算法来挑选出可能得输出加以评估。
Beam Search
基础版本
以下图词库大小为10000,Beam width为3作为例子,将Encoder的输出作为Decoder输入,并预测下个词的概率之后,选取概率最高的3个单词,分别作为下一轮输入,再预测下一轮输出,一共会有30000个概率,再选取最高的3个,重复上述操作。下面两张图代表了两轮迭代,直到迭代到EOS。
优化版本
打分优化
上面基础版本中最大化的概率函数存在一些问题:
1. 一个序列的概率是每词条件输入的概率连乘,概率都是小于1的,这会导致越乘越小,类似梯度消失问题。
2. 最大化这个概率函数会倾向于选取更短的序列,因为每多一个单词就要多乘一个小于1的数字。
解决上面问题可以分为两步:
1. 首选对概率连乘函数取log,因为是单调递增函数不影响最终排序结果,而且避免了小数连乘,可以解决上面第一个问题,但是依然存在序列越长分数越低的问题
2. 分数乘一个系数,
为序列长度,
为超参。
Beam Width选择
没有固定值,上面例子中使用的3,实际生产中可能会用10、100,在学术界为了发表论文时用更准确的数字可能会用1000甚至3000。但是随着B的增长,收益是边际效益递减的。实际应用中可以使用一组备选测试实际效果。
另外不管B多大,Beam Search不能保证返回的全局最优的,但是它执行效率非常高。
误差分析
使用误差分析判断输出结果(比如翻译)不准确的问题,应该归因到RNN模型本身,还是应该归因于B的超参选择有问题。
如下图,可以用你的模型分别计算准确翻译和不准确翻译逐单词输入的概率结果,比较两者概率大小。如果模型认为准确结果的概率更大可以归因于B,而如果确实准确结果的概率就是小于不准确结果,说明是模型本身的问题。
然后对于更多翻译不准确的误差进行分析,分析B导致错误和RNN模型导致错误的比例,来确定后续的改进方向。
BLEU Score(只用于评估机器翻译输出结果,跟模型本身无关)
对于不同的翻译结果如何进行评估是个问题,现在通常使用BLEU分来进行评估。BLEU全称 bilingual evaluation understudy,表达的意思是人类评估的替补。这是2002年提出的评估机器翻译的论文,这篇论文大大推动了机器翻译领域的发展。
比如下图,我们可以将机器翻译的输出了7个the,the在准确翻译中存在,可以认为精确度为7/7;也或者改进的精准度计算中,分子是reference中the出现次数,分母是机器翻译输出中出现次数,则为2/7
我们也可以评估一起出现的临近的两个单词的命中情况,如下图。
即,同理可推广到相邻的n个单词的命中概率
最终定义
所以最终定义如下,这里增加了一个BP(brevity penalty)简短惩罚系数,因为越短的输出会让你更容易在reference中命中,这会让模型倾向于输出更短的翻译,增加简短惩罚系数避免这种倾向,论文中给出的BP定义见下图。
Attention 模型
基础模型的缺陷
前面的基础模型存在一个问题,就是对于长句子的翻译效果较差,这是因为Encoder先输入完所有单词,然后给出一个输出到Decoder,这个输出需要记忆整个长句子是比较困难的,所以随句子扁长,效果会衰退。
而人类进行翻译时,往往是边读边翻译,而不是读完整个句子再翻译。
模型结构
区别于基础模型,其Encoder还是一个RNN类(比如图里的BiRNN)模型,Decoder也是个RNN模型,但是它的输入不再只有Encoder的一个输出,而是在每一个时间步上都将上一轮输出及Encoder中几个时间步上的输出根据注意力系数加权
作为输入,其中
。这类似于人类翻译,翻译时会考虑附近的一些单词进行翻译。
每轮迭代所有注意力系数之和为1,这里还有个问题就是注意力系数如何计算
注意力系数的计算
通过额外创建一个小模型(如下图左下角,只有一层),用来预测,并通过softmax函数计算
。这个模型也在语言模型训练过程的反向传播中通过梯度下降更新。