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状态为参数,输出得分:
s
c
o
r
e
(
h
t
−
1
,
h
^
s
)
score(h_{t-1},\hat h_s)
score(ht−1,h^s)
概率化:
得到各个encoder层的得分后softmax归一化分值转化为概率。
a
t
(
s
)
=
e
s
c
o
r
e
(
s
)
∑
e
s
c
o
r
e
a_t(s)=\frac{e^{score(s)}}{\sum e^{score}}
at(s)=∑escoreescore(s)
加权:
加权和得到一个context vector,作为条件之一生成decoder的当前状态:
c
t
=
∑
s
a
t
(
s
)
h
^
s
c_t=\sum_s a_t(s)\hat h_s
ct=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的时候,朴素想法是生成所有的翻译,用语言模型打分,然后挑最大的。但译文数量是词表大小的指数函数,无法实现。
在这里我只想说,对于这种问题的:
老生常谈了,从不搜索到贪婪搜索到柱搜索,随处可见。