机器翻译是一个将一个 one language sentence X 翻译为 target language Y的 任务.
最开始的机器翻译的需求是发生在冷战时期,美国人想要更有效地知道俄国人在干什么,但是其方法就比较建议了,直接将一个双语词典放在磁盘上进行逐个查找。
统计机器翻译的核心是从数据中学到一个概率模型。目标是找到target language的一个最大概率的y。
但是前人们想到一个办法用贝叶斯公式将概率分解成两个components
a r g m a x y p ( x ∣ y ) p ( y ) argmax_y{p(x|y)p(y)} argmaxyp(x∣y)p(y)
左边是一个model定义的是words 和 phrases应该如何被翻译(精确性) x应该有了,如何选择y使得整个概率最大化 ,其需要从并行数据(pair of human-translated French/English sentences)
中学习。左边一般掌握的是一些单词和短语的双语地道local翻译。
所以我们需要很多块这样的石头。
右边是一个language model,主要要句法结构等要素出发,我们前面讲过,其可以不断预测下一个单词是什么(根据概率),其从monolingual data中学习-只需要从目标语言中学习就行。
在具体的实践过程中,我们还需要做一些更为精细的处理,例如我们需要学习对齐。也就是我们需要学习或者说找到一种word-level correspondence between French sentence X and English sentence y。
P(x,a|y)
alignment(对齐)是很复杂的,存在很多种情况
1 对 1
1对多-又被称之为(fertility)
多对1
多对多(phrase-level)-目前还没有一种优秀的方法来继续分解这种多对多,例如法语 to english
所以,其实我们需要通过数据去学习的p(x,a|y)是一个many factors 的combination,其包括
对于SMT,我们只需要大概了解其概念即可,重点是与我们要重点学习的神经翻译模型作比较。
argmax-代表的是右边这一坨函数的参数使得函数取得最大值.具体如何去找到这个Y,我们肯定不可能又去遍历所有的可能性,答案是使用一种启发式的搜索算法并且舍弃掉很多低概率的假设。
像是一种树搜索,加剪枝(概率低的)
机器翻译中一个典型的搜索算法是Beam-search https://zhuanlan.zhihu.com/p/82829880
SMT是一个巨大的研究领域,很多技术也非常复杂,例如需要非常强大且繁琐的特征工程工作。
神经机器翻译博文
注意,上图是我们已经在测试或者说应用的时候的网络结构。
两个RNN ,一个encoder,一个decoder。
两组分别独立的word-embedding set-法语的和英语的词嵌入-word2vectors。
事实上,sequence to sequence 是一种非常实用的架构:
例如其还有以下四种应用:
现在还有比较火的 text2sql
所以,实际上,NMT的sequence 2 sequence modal是一种条件语言模型。
所以我们应该如何去训练一个NMT system呢?
这是训练时候的网络结构图,在这个地方,我们有三个重点需要了解。
其与test time的不同就是decoder 每一个hidden state输出一个y_hat,然后,与其本来应该与语料库中对应的单词去计算一个损失函数-交叉熵损失算出来的负对数概率of“target world”,最后将所有对应翻译结果的loss sum up and do a average caclulation.-值得注意的是我们需要自己输入一个 token,然后在最后一个hidden state我们希望其输出应该是 token.
输出依然可以看作是一个softmax函数然后选概率最大的
然后下面是一些我们需要注意的点
简单摘录下一个embedding和word2vector的区别:反正就是我们既可以从one-hot编码加权重矩阵-word-embedding去从头训练,也可以用别人预训练好的。
greedy decoding的一个重要问题是我们每次都选择一个概率最大的词,而且是无法回头的。
例如出现上面的这种情况···
我们将使用Exhaustive search decoding:
如果我们计算所有的可能,代价是十分昂贵的。虽然这能保证找到一个最佳答案。
分数都是负的,因为我们将一个概率(0~1)值加了一个对数-底数一般为e这里-加对数真是贯穿我们整个数学历程的重要trick啊。-基于概率最大化的思想
举个栗子:
每次我们只要两个可能的部分翻译-beam 两个束-比如第一次得到了4个项,我们将取其中两个得分最高的
这就是全部过程-最终我们得到了正确的翻译-He hit me with a pie。-单三也是相似的词训练出来 word-embedding都在附件··
在greedy decoding中,当模型输出一个token的时候,就证明翻译已经结束了。
而在beam search decoding中,不同的假设可能在不同的timesteps产生 token.这个时候我们应该怎么办呢?
答案是出现 token我们就将其放在一边然后继续其他未完成的hypothesis。
那么beam search什么时候可以结束呢?
最后我们将假设集合里的所有假设作一个综合评价:
值得注意的是,这里我们不能再用最开始的简单相加的评价方式:
而需要使用一种基于长度normalized的方法,因为我们仍然使用上面的方法的话,结果就是越短的翻译结果越好,这显然是不科学的。当然这个标准并不需要用在我们寻找假设的过程中,因为寻找假设的时候都是长度相同的。
1 t ∑ i = 1 t l o g p L M ( y i ∣ y 1 , ⋅ ⋅ ⋅ , y i − 1 , x ) \frac{1}{t}\sum_{i=1}^{t}log_{p_{LM}}^{(y_i|y_1,···,y_{i-1},x)} t1i=1∑tlogpLM(yi∣y1,⋅⋅⋅,yi−1,x)
说一下主要的优点-不用特征工程,对于所有的语言翻译对几乎都可以使用相同的网络架构,且事实上表现效果更好,而且整个系统是end-end的整体优化,不需要特别去优化一些子组件。
N-grams 精度测试最看重的是序列的顺序匹配。
加一个对于过于短的翻译的惩罚机制,我们都知道人工智能善于躺平和走捷径。-这也是我们一直在关注的两个问题。
简单加一点目前人工智能最关注的两个热点问题:
overlap-重叠-符合-匹配!
可以看到,NMT系统进步是飞快的,这也是很多人共同努力 ,提交自己的系统所获得的成果。
结合NMT和SMT的研究-取长补短 tackle:解决
如果我们想要翻译出在我们的语料库之外的单词,我们应该如何做?
训练域和测试域的不匹配,训练的时候我们可能是基于一个大的Wikipedia corpus,但测试的时候如果是用于日常的对话,那么表现可能就不会很好
在一个较长的文本中维持上下文的联系,比如说我们去翻译一本书籍,前面我们提出LSTM的解决方案,但仍然还要很长的路要走
缺少各种训练的语言对资源
翻译有时候会缺少common sense -AI的一般性问题
还有一个有趣的问题,NMT从traning data获取了一定的偏差,当然这是从数据得来的客观,但这是的确是不准确的翻译,比如下面的例子:-这可能导致性别歧视-也是我们前面提到的伦理道德问题
缺乏解释性的系统做出一些奇怪的事情-例如下面的例子:系统缺乏对于输入的条件限制,只是简单地调用英语的decoder RNN。
BIble是一个经典的不同语言对的平行(并行)语料库-前些年出现的新闻-谷歌倾向于把无意义的事翻译为一些宗教化的结果,详情可看-https://zhuanlan.zhihu.com/p/40391851
实际上,现在的谷歌翻译对于这种无意义的输入已经做了很多的限制工作和语言自动检测工作:
Attention的由来:
Attention被提出的原因是我们需要解决一种信息瓶颈,因为原来我们想要最后一个hidden state的输出-一个上下文向量C去代表整个句子的信息,即使你使用了LSTM,其压力仍然是巨大的。
核心思想,在decoder的每一步,都使用一些直接连接到encoder去获得一些源序列的特殊部分-信息。
bar chart-条形图
计算过程简述
接下来我们将attention的output与decoder的hidden state作一个concatenate(注意是变为2倍长度的向量连接),然后依然按照以前的方式计算y_hat–一个选择是用一个weight matrix去作参数矩阵乘积最后使用梯度下降进行总体优化的,(用一个全连接层的(Dense)或者说前馈神经网络)-然后用损失函数与target word的one-hot编码求loss。
事实上,对于维度这个问题我们都可以使用权重矩阵来进行调整,毕竟权重矩阵可以随机初始化,然后根据数据去学习即可。
加一句-一个合理的方法是将输入使用预训练的word-embedding,而将输出使用权重矩阵自定义embedding进行端到端的总体优化。
如果不使用word-embedding-直接将word丢入神经网络是非常难以训练的,由于其强大的稀疏性。
作业中给出的课堂上未给出的details:
Sequence to Sequence Learning with Neural Networks
还有Benigo的论文也有不同的解决方案,链接在后面。
这些计算是高度软对齐的。
还有一种做法是我们可以将前一个decoder hidden state算出来的attention output也和平常的输入一起输入到decoder hidden state中,这在很多时候也是有用的。
例如经典论文- Neural Machine Translation by Jointly Learning to Align and Translate中使用的方法
完全过程,当然这里少了一个输出 token.
最小二乘法-简单
下面是公式版的attention的计算过程-和图解版是一个意思
喜欢数学公式和更详细维度推到的同学可以看看下面这篇论文-可以重点看看模型的细节部分-在最后的附录中,了解具体的计算过程:
https://arxiv.org/pdf/1409.0473.pdf 深度学习神经机器翻译的经典之作-由Benigo领衔
https://www.jianshu.com/p/8d6341ded7eb 解析
https://blog.csdn.net/lujian1989/article/details/81535310 翻译
Attention一个最厉害的地方就是其自己以一种unsupervised的方式学会了对齐,而不是我们去设置一个loss function让其去学习。
它会明白什么时候应该1对多,而这是我们在SMT 系统中难以解决的一个问题。
其一个更加基本的概念如下:
给定一个Query vector,给予一群向量-values,attention是一种技术去计算基于Query的values的加权和。
我们可以建立一些直觉
这种加权和实际上体现的是values里包含的信息的一种有选择性的总结或者说综合,然后由query去定义这种综合应该去关注哪些重点的values。
这种思想实际上类似于LSTM的控制门。
Attention是一种方法去获取一组任意向量的fixed-size 表示,其依赖于一个其他的表示(query),这个大家可以看英文再想象一下attention的计算过程意会一下··事实上,大家也应该明白其实英文的阅读能力是相当重要的。
常见的三种计算得分的方式
1.基本的点积(前提是要求decoder的 hidden state 的size和encoder的 hidden state 的size一样)。
2.将两个vector做矩阵乘法-成为一个需要学习的权重矩阵 。
3.更为复杂,我们去选择一个叫做attention dimensionality的向量作为超参数,具体计算过程如下PPT,包括维度的对应。