赞
踩
Seq2seq机器翻译开篇之作 Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation[1] 发表前,机器翻译研究以统计方法为主。这篇文章仿照人在翻译时的思维方式"通读原句子(encode),大脑加工整合(content), 复述新句子(decode)",提出了一种Encoder-Decoder结构,如下图所示。简单来讲,先把任意长度的文本序列编码(encode)为固定长度的向量表示(context),再把固定长度的向量表示解码(decode)回任意长度的文本序列。
Seq2seq结构灵活。我们看到上图中3个content向量(C1==C2==C3)被用作Decoder各个时刻的输入,这里可以稍作改动,如下图,content向量只作为Decoder第一时刻的输入,再随Decoder的RNN依次向后传递。另一个改动的是,content向量取自Encoder各个时刻隐藏单元的拼接(或加和),或者像下图中(参考文献[1]和[2]),只取用Encoder最后一个时刻的隐藏单元。
依照Seq2seq展开图(上图),Decoder各个时刻的输入是:
<EOS>
标记的词向量,以及content向量;注:<EOS>
标记被用作通知解码器开始生成文本的信号。也是结束生成文本的信号。
注:反向传播时,Decoder的梯度通过content向量传递给Encoder。
注:反转输入数据的顺序[2]是一种Seq2Seq优化方法,效果提升因具体任务而异,优点是梯度的传播更平滑,学习效率更高。例如“我是猫”和“I am a cat”,单词“我”和“I”有转换关系,反向传播时,梯度需从“I”经过“猫、是”才到达“我”;而反转句子后,“我”和“I”相邻,梯度可以直接传递。
Decoder可获得的全部信息存储在这一个小小的content向量中,那么如何增加content向量的信息量呢?
Attention可以在每个时间步关注到Encoder的不同部分,以收集产生Decoder输出词所需的语义细节。Attention权重模拟了人脑注意力的分配机制,为更重要的部分分配较多的注意力。
具体的计算过程是,Seq2seq每解码一个字,就用前一个时刻的Decoder隐层状态,和Encoder所有隐层状态做soft Attention,计算公式如下,得到当前输出和所有输入元素的关联程度,即权重。进而采用加权平均的方式,计算出对当前输出更友好的context向量表示。
这里涉及到三个重要的细节(结合下图进行理解):
加入Attention后,content向量在任意时刻是变化的。那么如何计算第 i 时刻content向量?
加入Attention后,Decoder各个时刻的输入包括:
<EOS>
标记的词向量,以及当前时刻的content向量;加入Attention后,Decoder各个时刻的输出包括:当前时刻的Decoder隐层状态,以及下一时刻的content向量。
注:送入FFN+Softmax分类层的是,Decoder隐层状态和content向量的拼接。
总结,加入Attention后与传统的Seq2Seq模型主要有以下三点不同:
题外话,Attention与Self-Attention的不同:
Seq2Seq的损失计算:产生最优输出序列
seq2Seq 在生成输出序列的时候是一个时刻生成一个字/词,换句话说,在每个时间步解决的是一个分类问题(选择词表中的哪个字)。
用最大似然估计(MLE)来最大化输出序列基于输入序列的条件概率函数,实现时,选用交叉熵(CE)或均方误差(MSE)
log P ( y 1 , … , y T ′ ∣ x 1 , … , x T ) = − ∑ t ′ = 1 T ′ log P ( y t ′ ∣ y 1 , … , y t ′ − 1 , c ) \log\mathbb{P}(y_1, \ldots, y_{T'} \mid x_1, \ldots, x_T) = -\sum_{t'=1}^{T'} \log \mathbb{P}(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c}) logP(y1,…,yT′∣x1,…,xT)=−t′=1∑T′logP(yt′∣y1,…,yt′−1,c)
Beam search:调整最优输出序列的搜索空间
我们得到了每个时间步的输出字,而不是完整的输出序列。那么如何做呢?
最简单的是贪心法,即每个时刻,只取条件概率最高的1个词,加入候选输出句子中。贪心法的缺点是,得到了局部最优解,不一定是全局最优。
最复杂的是穷举搜索,把每一种可能的输出序列罗列出来,再选择最优解top-1。穷举搜索的缺点是复杂度非常高。
Beam search束搜索是最常见的解码方式。不同于穷举搜索,束搜索把搜索空间
∣
V
∣
L
|V|^{L}
∣V∣L降低到
k
L
k^L
kL。|V|是词典大小,L是输出句子长度,k是束大小。具体地,每个时刻,只保存概率最高的k个候选输出句子,其余的就删掉。k不能太小,否则检索空间太小,无法保证最优解。以8~12为佳。束搜索并不知道什么时候停下来,所以一般来说要定义一个最长的输出序列长度,或者遇到<eos>
就停止检索。
注:注意处理长序列beam search得分过高的情况。例如,为结果值除以词数 T,更常见的是除以
T
α
T^\alpha
Tα。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。