本文为转载,原文链接: 图解Attention - 故事尾音的文章 - 知乎
https://zhuanlan.zhihu.com/p/55614660
在基于词语的语言模型中,我们使用了循环神经网络。它的输入时一段不定长的序列,输入却是定长的,例如输入:They are,输出可能是 watching 或者 sleeping。然而,很多问题的输出是不定长的序列。以机器翻译为例,输入是一段英文,输出是一段法语,输入和输出皆不定长,例如
英语:The are watching
法语:lls regardent
当输入输出序列都是不定长时,我们可以使用编码器-解码器(encoder-decoder)或者seq2seq。它们分别是基于 2014 年的两个工作:
Cho et al., Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
Sutskever et al., Sequence to Sequence Leaerning with Neural Networks
以上两个工作本质上都用到了两个循环神经网络结构,分别叫做编码器和解码器。编码器对应输入序列,解码器对应输出序列
编码器 — 解码器
编码器和解码器分别对应输入序列和输出序列的两个循环神经网络。我们通常会在输入序列和输出序列后面分别附上一个特殊字符 '<eos>'(end of sequence)表示序列的终止。在测试模型时,一旦输出 '<eos>' 就终止当前的输出序列
编码器
编码器的作用是把一个不定长的输入序列转化成一个定长的背景词向量 。该背景词向量包含了输入序列的信息。常用的编码器是循环神经网络
双向循环神经网络
编码器的输入既可以是正向传递,也可以是反向传递的。如果输入序列是 ,在正向传递中,隐藏层变量
import numpy as np
h_forward = np.array([1, 2])
h_backward = np.array([3, 4])
h_bi = np.concat(h_forward, h_backward, dim=0)
# [1, 2, 3, 4]
解码器
其中函数是循环神经网络单元
需要注意的是,编码器和解码器通常会使用多层循环神经网络
注意力机制
在以上的解码器设计中,各个时刻使用了相同的背景向量。如果解码器的不同时刻可以使用不同的背景向量呢?
现在,对上面的解码器稍作修改。我们假设时刻的背景向量为。那么解码器在时刻的隐藏层变量
也就是说,给定解码器的当前时刻,我们需要对编码器中不同时刻的隐藏层变量求加权平均。而权值也称注意力权值。它的计算公式是:
其中函数有多种设计方法。在Bahdanau 的论文中
在 Bahdanau 的论文的论文中,编码器和解码器均使用了 GRU
总结
- 编码器 - 解码器(seq2seq)的输入和输出可以都是不定长序列
- 在解码器上应用注意力机制可以使解码器的每个时刻使用不同的背景向量。每个背景向量相当于对输入序列的不同部分分配了不同的注意力
网友评论