NMT(neural machine translation)
不管是传统学习还是深度学习,都是encoder-decoder的架构:
MT的优势
- end-to-end training(也是所有深度学习的优势):
为优化同一个损失函数调整所有参数 - Distributed representation:
更好地利用词语、短语之间的相似性(因为利用了word vector和sentence vector) - Better exploitation of context:
利用更多上下文——原文和部分译文的上下文,因为gate的出现,可以记忆更长的序列 - more fluent text generation:
生成更流畅的文本
MT的缺陷
- 无法显式的利用语义和语法的结构
- 无法显式利用指代消解
attention机制
- LSTM可以记忆大约30个词(但很重要因为它可以生成流畅的word)
- attention可以记忆大约70个词
问题:
如下图,decoder依赖于最后一个encoder隐含层的输出。并将此输出状态一直传递下去,这会导致一些长序列上的记忆问题。
attention机制:
解决方法是将encoder的历史状态视作随机读取内存,这样不仅增加了源语言的维度,而且增加了记忆的持续时间(LSTM只是短时记忆)
理解一下:把之前的状态维护成一个pool,然后采用类似语料对齐的过程,decoder某一个状态的时候,访问特定的encoder状态。
- which part of source are you next gonna to be translating
- implicitly making connection between source target
一个非常棒的可视化,显示attention model成功地对齐了法语和英语,其中一小段语序的调整也反应出来了:
原理
打分机制:
首先有一种打分机制,以前一刻的decoder状态和某个encoder状态为参数,输出得分:
score(ht?1,h^s)score(h_{t-1},\hat h_s)score(ht?1?,h^s?)
概率化:
得到各个encoder层的得分后softmax归一化分值转化为概率。
at(s)=escore(s)∑escorea_t(s)=\frac{e^{score(s)}}{\sum e^{score}}at?(s)=∑escoreescore(s)?
加权:
加权和得到一个context vector,作为条件之一生成decoder的当前状态:
ct=∑sat(s)h^sc_t=\sum_s a_t(s)\hat h_sct?=s∑?at?(s)h^s?
原理图如下:
其中注意力函数就有多种多样的变形了。
decoder寻找
模型能够在给定原文s的情况下计算译文s?的概率P(s?|s)之后,就来到传统的问题了,找出最可能的译文
sˉ?=argmax?sˉ(P(sˉ∣s))\bar{s}* = \operatorname{argmax}_{\bar{s}}(\mathbb{P}(\bar{s} | s ))sˉ?=argmaxsˉ?(P(sˉ∣s))
在decoding的时候,朴素想法是生成所有的翻译,用语言模型打分,然后挑最大的。但译文数量是词表大小的指数函数,无法实现。
在这里我只想说,对于这种问题的:
老生常谈了,从不搜索到贪婪搜索到柱搜索,随处可见。