NLP论文笔记合集(持续更新)
原论文:《Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation》
最早的Sequence to Sequence模型:《Sequence to Sequence Learning with Neural Networks》
2014-06发表的文章,使用了Encoder-Decoder结构,解决了Sequence to Sequence输入长度和输出长度不对等的问题,并首次提出GRU结构。
X = ( x 1 , x 2 , … , x T ) X=(\mathbf{x}_1,\mathbf{x}_2,…,\mathbf{x}_T) X=(x1,x2,…,xT), x ∈ R d × 1 \mathbf{x} \in R^{d\times 1} x∈Rd×1, x \mathbf{x} x为embedding表示的一个中文词, X X X为中文的一个句子,word embedding 矩阵共有 K K K 个词,每个词用 d d d 维向量表示。
Y = ( y 1 , y 2 , … , y T ′ ) Y=(\mathbf{y}_1,\mathbf{y}_2,…,\mathbf{y}_{T\prime}) Y=(y1,y2,…,yT′), y ∈ R d × 1 \mathbf{y} \in R^{d\times 1} y∈Rd×1, y \mathbf{y} y为embedding表示的一个英文词, Y Y Y为英文的一个句子,word embedding 矩阵共有 K K K 个词,每个词用 d d d 维向量表示。
我们可以使用如下比喻:
r \mathbf{r} r:本能记忆遗忘系数,即过去记忆自热而然的遗忘速度,衰退系数;
z \mathbf{z} z:自主记忆保留系数,即自己选择记住多少东西
h < t − 1 > \mathbf{h}_{
h ~ j < t > \tilde{\mathbf{h}}_j^{
h < t > \mathbf{h}_{
x = ( x 1 , … , x T ) \mathbf{x}=(x_1,…,x_T) x=(x1,…,xT):新知识
c \mathbf{c} c:工作环境,创作背景,背景知识
y = ( y 1 , … , y T ′ ) \mathbf{y}=(y_1,…,y_{T\prime}) y=(y1,…,yT′):作品
每一个隐藏单元是一个大脑。首先,本能记忆遗忘系数 r j r_j rj 由以下公式计算:
r j = σ ( [ W r x ] j + [ U r h < t − 1 > ] j ) , r_j=\sigma([\mathbf{W}_r\mathbf{x}]_j+[\mathbf{U}_r\mathbf{h}_{
可以看到,本能记忆遗忘系数 r \mathbf{r} r,是由新知识 x \mathbf{x} x 和过去的记忆 h < t − 1 > \mathbf{h}_{
然后,通过以下公式计算提出的大脑当前时刻的短期记忆 h ~ j < t > \tilde{h}_j^{
h ~ j < t > = ϕ ( [ W x ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) . \tilde{h}_j^{
可以看到,短期记忆 h \mathbf{h} h 由新知识 x \mathbf{x} x 、过去的记忆 h < t − 1 > \mathbf{h}_{
类似地,自主记忆保留系数 z j z_j zj 由以下公式计算:
z j = σ ( [ W z x ] j + [ U z h < t − 1 > ] j ) . z_j=\sigma([\mathbf{W}_z\mathbf{x}]_j+[\mathbf{U}_z\mathbf{h}_{
可以看到,自主记忆保留系数 z \mathbf{z} z,是由新知识 x \mathbf{x} x 和过去的记忆 h < t − 1 > \mathbf{h}_{
最后,通过以下公式计算提出的大脑长期记忆 h j h_j hj :
h j < t > = z j h j < t − 1 > + ( 1 − z j ) h ~ j < t > , h_j^{
可以看到,当前长期记忆 h < t > \mathbf{h}_{
假如我们当前的任务是创作金庸风格的文章的话,当前创造词的条件分布是
p ( y t ∣ y t − 1 , y t − 2 … , y 1 , c ) = g ( h < t > , y t − 1 , c ) p(y_t|y_{t-1},y_{t-2}…,y_1, \mathbf{c})=g(\mathbf{h}_{
可以看到,当前词的预测由当前的长期记忆 h < t > \mathbf{h}_{
X = ( x 1 , x 2 , … , x T ) X=(\mathbf{x}_1,\mathbf{x}_2,…,\mathbf{x}_T) X=(x1,x2,…,xT), x ∈ R d × 1 \mathbf{x} \in R^{d\times 1} x∈Rd×1, x \mathbf{x} x为embedding表示的一个中文词, X X X为中文的一个句子,word embedding 矩阵共有 K K K 个词,每个词用 d d d 维向量表示。
隐藏层共有1000个GRU单元。
对于RNN隐藏层来说,输入有 T T T个词,就有 T T T个输入时刻,每个时刻输入一个词。
初始化hidden state h < 0 > \mathbf{h}_{<0>} h<0>, h < t > ∈ R 1000 × 1 \mathbf{h}_{
根据输入 x t \mathbf{x}_t xt,上一时刻的记忆 h < t − 1 > \mathbf{h}_{
r < t > = σ ( W r x + U r h < t − 1 > ) , \mathbf{r}_{
其中 ⊙ \odot ⊙代表2个向量在对应位置上元素相乘, σ 、 ϕ \sigma、\phi σ、ϕ 分别表示 sigmoid 和 tanh 激活函数。 h < t − 1 > \mathbf{h}_{
RNN隐藏层经过 T T T 个时刻的计算,最终得到 h < T > \mathbf{h}_{
c = t a n h ( V h < T > ) . \mathbf{c}=tanh(\mathbf{Vh}_{
其中 V ∈ R d c × 1000 , c ∈ R d c × 1 V\in R^{d_c\times 1000},\mathbf{c}\in R^{d_c\times 1} V∈Rdc×1000,c∈Rdc×1。 c \mathbf{c} c 包含了输入的全部信息。
隐藏层也是有1000个GRU单元。
对于RNN隐藏层来说,输出有 T ′ T\prime T′个词,每个时刻输出一个词。
这里的 t t t 时刻跟encoder的时刻不是同一时刻,而是encoder完成它的计算以后,decoder才开始自己的时序。
初始化hidden state h < 0 > ′ \mathbf{h}^{\prime}_{<0>} h<0>′:
h < 0 > ′ = t a n h ( V ′ c ) , \mathbf{h}^{\prime}_{<0>}=tanh(\mathbf{V}^\prime \mathbf{c}), h<0>′=tanh(V′c),
其中 V ′ ∈ R 1000 × d c \mathbf{V}^\prime\in R^{1000\times d_c} V′∈R1000×dc。
给予输出 y 0 = B O S \mathbf{y}_0=BOS y0=BOS, B O S BOS BOS 为begin of sentence,句子起始符号,是输出的embedding中的词,与输入的embedding不是同一个, y ∈ R K × 1 \mathbf{y}\in R^{K\times1} y∈RK×1。计算reset gate r < 1 > ′ \mathbf{r}^{\prime}_{<1>} r<1>′、update gate z < 1 > ′ \mathbf{z}^{\prime}_{<1>} z<1>′、短期记忆 h ~ < 1 > ′ \tilde{\mathbf{h}}^{\prime}_{<1>} h~<1>′、长期记忆 h < 1 > ′ \mathbf{h}^{\prime}_{<1>} h<1>′。
根据输入 y t − 1 \mathbf{y}_{t-1} yt−1,上一时刻的记忆 h < t − 1 > ′ \mathbf{h}^{\prime}_{
r < t > ′ = σ ( W r ′ y + U r ′ h < t − 1 > ′ + C r c ) , \mathbf{r}^{\prime}_{
其中 ⊙ \odot ⊙代表2个向量在对应位置上元素相乘, σ 、 ϕ \sigma、\phi σ、ϕ 分别表示 sigmoid 和 tanh 激活函数。 h < t − 1 > ′ \mathbf{h}^{\prime}_{
将 h < t > ′ 、 y t − 1 、 c \mathbf{h}^{\prime}_{
s < t > ′ = O h h < t > ′ + O y y t − 1 + O c c \mathbf{s}^{\prime}_{
其中, O h ∈ R 2000 × 1000 , O y ∈ R 2000 × d , O c ∈ R 2000 × d c , s < t > ′ ∈ R 2000 × 1 \mathbf{O}_h\in R^{2000\times 1000},\mathbf{O}_y\in R^{2000\times d},\mathbf{O}_c\in R^{2000\times d_c},\mathbf{s}^{\prime}_{
s < t > ′ \mathbf{s}^{\prime}_{
s i < t > = max { s 2 i − 1 ′ < t > , s 2 i ′ < t > } s_i^{
s i < t > s_i^{
最后 s < t > \mathbf{s}_{
p ( y t , j = 1 ∣ y t − 1 , . . . , y 1 , X ) = e x p ( g j s < t > ) ∑ j ′ = 1 K e x p ( g j ′ s < t > ) p(\mathbf{y}_{t, j}=1|\mathbf{y}_{t-1}, ..., \mathbf{y}_{1},\mathbf{X})=\frac{exp(\mathbf{g}_j \mathbf{s}_{
其中 g ∈ G , G ∈ R K × 1000 \mathbf{g}\in \mathbf{G},\mathbf{G}\in R^{K\times 1000} g∈G,G∈RK×1000。
得到预测词 y t \mathbf{y}_t yt。
RNN隐藏层经过 T ′ T\prime T′ 个时刻的计算,最终得到 Y = ( y 1 , y 2 , … , y T ′ ) Y=(\mathbf{y}_1,\mathbf{y}_2,…,\mathbf{y}_{T\prime}) Y=(y1,y2,…,yT′)。
循环神经网络(RNN)是由隐藏状态 h \mathbf{h} h和可选输出 y \mathbf{y} y组成的神经网络,该输出 y \mathbf{y} y在可变长度序列 x = ( x 1 , … , x T ) \mathbf{x}=(x_1,…,x_T) x=(x1,…,xT)上进行计算。在每个时间步 t t t,RNN的隐藏状态 h < h > \mathbf{h}_{
h < t > = f ( h < t − 1 > , x t ) , ( 1 ) \mathbf{h}_{
其中 f f f是一个非线性激活函数。 f f f可以像logistic sigmoid函数一样简单,其中sigmoid的参数与输入元素数量相匹配,也可以像长短时记忆(LSTM)单元一样复杂(Hochreiter和Schmidhuber,1997)。
RNN可以通过训练如何预测序列中的下一个symbol来学习序列的概率分布。那样的话,每个时间步 t t t 的输出是条件分布 p ( x t ∣ x t − 1 , … , x 1 ) p(x_t | x_{t−1}, …, x_1) p(xt∣xt−1,…,x1)。例如,输出多项式分布(1-of-K coding,one-hot)可以通过softmax激活函数得到
p ( x t , j = 1 ∣ x t − 1 , . . . , x 1 ) = e x p ( w j h < t > ) ∑ j ′ = 1 V e x p ( w j ′ h < t > ) p(x_{t, j}=1|x_{t-1}, ..., x_{1})=\frac{exp(\mathbf{w}_j \mathbf{h}_{
对于所有可能的 j = 1 , . . . , K j=1,...,K j=1,...,K, 其中 w j \mathbf{w}_j wj是权重矩阵 W \mathbf{W} W的行。通过组合这些概率,我们可以计算可能的序列 x \mathbf{x} x通过
p ( x ) = ∏ t = 1 T p ( x t ∣ x t − 1 , … , x 1 ) ( 3 ) p(\mathbf{x})= \prod_{t=1}^Tp(x_t | x_{t−1}, …, x_1) \quad\quad (3) p(x)=t=1∏Tp(xt∣xt−1,…,x1)(3)
按照这种分布,可以直接通过在每个时间步对一个symbol进行迭代采样,来对新序列进行采样。
在本文中,我们提出了一种新的神经网络结构,该结构学习如何将可变长度序列编码为固定长度向量,并将给定的固定长度向量解码回可变长度序列。从概率的角度来看,这个新模型是一种学习变长序列在另一个变长序列上的条件分布的通用方法,例如 p ( y 1 , … , y T ′ ∣ x 1 , … , x T ) p(y_1,…,y_T\prime | x_1,…,x_T) p(y1,…,yT′∣x1,…,xT),其中应注意输入和输出序列长度 T T T和 T ′ T\prime T′可能会有所不同。
编码器是一个RNN,按顺序读取输入序列 x \mathbf{x} x的每个symbol。当它读取每个symbol时,RNN的隐藏状态根据等式(1)改变。读取序列末尾(由序列末尾符号标记)后,RNN的隐藏状态是整个输入序列的摘要 c c c。
该模型的解码器是另一个RNN,该RNN经过训练,通过给定的隐藏状态 h < t > \mathbf{h}_{
h < t > = f ( h < t − 1 > , y t − 1 , c ) , \mathbf{h}_{
同样,下一个symbol的条件分布是
p ( y t ∣ y t − 1 , y t − 2 … , y 1 , c ) = g ( h < t > , y t − 1 , c ) p(y_t|y_{t-1},y_{t-2}…,y_1, \mathbf{c})=g(\mathbf{h}_{
对于给定的激活函数 f f f和 g g g(后者必须产生有效概率,例如,使用softmax)。
提出的RNN Encoder–Decoder的两个组件被联合训练以最大化条件对数似然
max θ 1 N ∑ n = 1 N log p θ ( y n ∣ x n ) , ( 4 ) \max\limits_\mathbf{\theta} \frac{1}{N}\sum\limits_{n=1}^N \log p_\mathbf{\theta} (\mathbf{y}_n|\mathbf{x}_n), \quad\quad (4) θmaxN1n=1∑Nlogpθ(yn∣xn),(4)
其中 θ \mathbf{\theta} θ是模型参数集,每个 ( x n , y n ) (\mathbf{x}_n,\mathbf{y}_n) (xn,yn)是训练集中的对(输入序列,输出序列)。在我们的例子中,由于解码器的输出(从输入开始)是可微的,我们可以使用基于梯度的算法来估计模型参数。
一旦对RNN编码器-解码器进行了训练,该模型可用于两种方式。一种方法是给定输入序列,使用模型生成的目标序列。另一方面,该模型可用于对给定的一对输入和输出序列进行评分,其中评分仅为等式(3)和(4)中的概率 p θ ( y ∣ x ) p_\mathbf{\theta} (\mathbf{y}|\mathbf{x}) pθ(y∣x)。
除了一种新颖的模型架构外,我们还提出了一种新型的隐藏单元(式(1)中的 f f f),该隐藏单元源自LSTM单元,但计算和实现起来要简单得多。图2展示了所提出的隐藏单元的图形描述。
让我们描述如何计算第 j j j个隐藏单元的激活。首先,重置门 r j r_j rj由以下公式计算:
r j = σ ( [ W r x ] j + [ U r h < t − 1 > ] j ) , ( 5 ) r_j=\sigma([\mathbf{W}_r\mathbf{x}]_j+[\mathbf{U}_r\mathbf{h}_{
其中 σ \sigma σ是logistic sigmoid函数, [ . ] j [.]_j [.]j表示向量的第j个元素。 x \mathbf{x} x和 h < t − 1 > \mathbf{h}_{
类似地,更新门 z j z_j zj由以下公式计算:
z j = σ ( [ W z x ] j + [ U z h < t − 1 > ] j ) . ( 6 ) z_j=\sigma([\mathbf{W}_z\mathbf{x}]_j+[\mathbf{U}_z\mathbf{h}_{
然后,通过以下公式计算提出的单元 h j h_j hj的实际激活:
h j < t > = z j h j < t − 1 > + ( 1 − z j ) h ~ j < t > , ( 7 ) h_j^{
其中
h ~ j < t > = ϕ ( [ W x ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) . ( 8 ) \tilde{h}_j^{
在此公式中,当重置门接近0时,隐藏状态被强制忽略先前的隐藏状态,并仅使用当前输入重置。这有效地使得隐藏状态删除以后发现的任何不相关信息,从而得到更紧凑的表示。
另一方面,更新门控制多少信息量会从先前的隐藏状态带到当前的隐藏状态。这类似于LSTM网络中的存储单元,有助于RNN记住长期信息。此外,这可能被视为leaky-integration unit的adaptive variant (Bengio等人,2013年)。
由于每个隐藏单元都有单独的重置和更新门,因此每个隐藏单元将学习捕获不同时间尺度上的依赖关系。那些学习捕捉短期依赖关系的单元往往具有经常处于活动状态的重置门,但那些捕捉长期依赖关系的单元将具有大部分处于活动状态的更新门。
在我们的初步实验中,我们发现使用这种有门控的新单元是至关重要的。我们使用常用的无门控tanh单位无法得到有意义的结果。
在一个常用的统计机器翻译系统(SMT)中,系统(特别是译码器)的目标是给定源语句 e \mathbf{e} e,找到的翻译 f \mathbf{f} f,从而最大化
p ( f ∣ e ) ∝ p ( e ∣ f ) p ( f ) , p(\mathbf{f}|\mathbf{e}) ∝ p(\mathbf{e}|\mathbf{f})p(\mathbf{f}), p(f∣e)∝p(e∣f)p(f),
其中,右侧的第一项称为翻译模型,后一项称为语言模型(参见,例如,(Koehn,2005))。然而,在实践中,大多数SMT系统将对数p(f | e)建模为具有附加特征和相应权重的对数线性模型:
log p ( f ∣ e ) = ∑ n = 1 N w n f n ( f , e ) + log Z ( e ) , ( 9 ) \log p(\mathbf{f}|\mathbf{e}) =\sum\limits_{n=1}^Nw_nf_n(\mathbf{f},\mathbf{e}) +\log Z(\mathbf{e}), \quad\quad(9) logp(f∣e)=n=1∑Nwnfn(f,e)+logZ(e),(9)
其中 f n f_n fn和 w n w_n wn分别是第 n n n个特征和权重。 Z ( e ) Z(\mathbf{e}) Z(e)是不依赖于权重的归一化常数。权重通常以最大化验证集上的BLEU分数来进行优化。在(Koehn等人,2003年)和(Marcu和Wong,2002年)介绍的基于短语的SMT框架中,翻译模型 log p ( f ∣ e ) \log p(\mathbf{f}|\mathbf{e}) logp(f∣e)被分解为匹配源句子中的短语和目标句子中的短语的翻译概率。在对数线性模型中,这些概率再次被视为附加特征(见等式(9)),并相应地进行加权,以最大化BLEU分数。
自(Bengio等人,2003年)提出神经网络语言模型以来,神经网络已广泛应用于SMT系统。在许多情况下,神经网络被用来重新审视翻译模型的假设(n-最佳列表)(参见,例如,(Schwenk等人,2006))。然而最近,训练神经网络以使用源句子(或短语对)的表示作为额外的输入来对翻译句子进行评分引起了广泛的兴趣。例如,见(Schwenk,2012),(Son等人,2012)和(Zou等人,2013)。
在这里,我们建议在短语对照表上训练RNN编码器-解码器(见第2.2节),并在调整SMT解码器时,将其分数用作等式(9)中对数线性模型的附加特征。
当我们训练RNN编码器-解码器时,我们忽略原始语料库中每个短语对的(标准化)频率。采取这一措施的目的是:(1)减少从大型短语表中根据归一化频率随机选择短语对的计算花费;(2)确保RNN编码器-解码器不会根据短语对的出现次数简单地学习对短语进行排序。这种选择的一个根本原因是短语表中现有的翻译概率已经反映了原始语料库中短语对的频率。对于RNN编码器-解码器的固定容量,我们试图确保模型的大部分容量集中于学习语言规律,即区分似是而非的翻译,或学习似是而非翻译的“复杂多变体”(概率集中区域)。
一旦RNN编码器-解码器经过训练,我们将为每个短语对添加一个新的分数到现有短语表中。这使得新的分数加入到现有的优化算法,而计算的额外开销最小。
正如Schwenk在(Schwenk,2012)中指出的那样,可以用提出的RNN编码器-解码器完全替换现有短语表。在这种情况下,对于给定的源短语,RNN编码器-解码器将需要生成(好的)目标短语列表。然而,这需要重复执行计算量巨大的取样步骤。因此,本文只考虑短语表中短语对的重新排序问题。
在给出实证结果之前,我们讨论了一些最近提出在SMT环境下使用神经网络的工作。
Schwenk in(Schwenk,2012)提出了一种类似的短语对评分方法。他没有使用基于RNN的神经网络,而是使用了一个前馈神经网络,该网络具有固定大小的输入(在他的例子中为7个单词,较短短语为零填充)和固定大小的输出(目标语言中为7个单词)。当它专门用于SMT系统的短语评分时,最大短语长度通常选择较小。然而,随着短语长度的增加,或者当我们将神经网络应用于其他可变长度序列数据时,神经网络能够处理可变长度的输入和输出是很重要的。提出的RNN编码器-解码器非常适合这些应用。
与(Schwenk,2012)类似,Devlin等人(Devlin等人,2014)提出使用前馈神经网络对翻译模型建模,但每次预测目标短语中的一个单词。他们提出了一个令人印象深刻的改进,但他们的方法仍然要求输入短语(或上下文词)的最大长度事先固定。
虽然这并不完全是他们训练的神经网络,但(Zou等人,2013年)的作者提出学习双语单词/短语的embedding。他们使用学习到的embedding来计算短语对之间的距离,该距离在SMT系统中用作短语对的附加分数。
在(Chandar等人,2014年)中,对前馈神经网络进行了训练,以学习词袋表示的输入短语到输出短语的映射。这与提出的RNN编码器-解码器和(Schwenk,2012)中提出的模型密切相关,只是它们对短语的输入表示是词袋模型的表示。在(Gao等人,2013年)中也提出了使用词袋表示的类似方法。早些时候,在(Socher et al.,2011)中提出了使用两个递归神经网络的类似编码器-解码器模型,但其模型仅限于单语设置,即该模型重构输入句子。最近,在(Auli et al.,2013)中提出了另一种使用RNN的编码器-解码器模型,其中解码器以源语句或源上下文的表示为条件。
提出的RNN编码器-解码器与(Zou等人,2013年)和(Chandar等人,2014年)中的方法之间的一个重要区别是,考虑了源短语和目标短语中单词的顺序。RNN编码器-解码器自然地区分具有相同单词但顺序不同的序列,而上述方法有效地忽略了顺序信息。
与提出的RNN编码器-解码器相关的最接近的方法是(Kalchbrenner和Blunsom,2013)中提出的循环连续翻译模型(模型2)。在他们的论文中,他们提出了一个由编码器和解码器组成的类似模型。与我们的模型不同的是,他们使用卷积n-gram模型(CGM)作为编码器,使用逆CGM和循环神经网络的混合作为解码器。然而,他们评估了他们的模型,重新审视了传统SMT系统提出的n-最佳列表,并计算了黄金标准翻译的复杂性。
由于所提出的RNN编码器-解码器并不是专门为机器翻译任务而设计的,这里我们简要介绍一下训练模型的特性。
一段时间以来,人们已经知道,使用神经网络的连续空间语言模型能够学习语义上有意义的embedding(参见,例如,(Bengio et al.,2003;Mikolov et al.,2013))。由于所提出的RNN编码器-解码器也投射到一个单词序列并从该序列映射回一个连续的空间向量,因此我们期望所提出的模型也具有类似的特性。
图4中的左图显示了使用RNN编码器-解码器学习的词嵌入矩阵对单词进行的2-D的 embedding。该映射由最近提出的Barnes Hut SNE(van der Maaten,2013)完成。我们可以清楚地看到语义相似的单词彼此聚集在一起(参见图4中的放大图)。
提出的RNN编码器-解码器自然生成短语的连续空间表示。这种情况下的表示(图1中的c)是1000维向量。与单词表示类似,我们使用图5中的Barnes-Hut SNE可视化表示由四个或更多单词组成的短语。
从可视化的角度来看,RNN编码器-解码器可以捕获短语的语义和句法结构。例如,在左下角的图中,大多数短语都与时间长短有关,而那些语法相似的短语则聚集在一起。右下角的图显示了语义相似的短语集群(国家或地区)。另一方面,右上角的图显示了语法相似的短语。
在本文中,我们详细描述了实验中使用的RNN编码器-解码器的体系结构。
让我们用 X = ( x 1 , x 2 , … , x N ) X=(\mathbf{x}_1,\mathbf{x}_2,…,\mathbf{x}_N) X=(x1,x2,…,xN)表示源短语,用 Y = ( y 1 , y 2 , … , y M ) Y=(\mathbf{y}_1,\mathbf{y}_2,…,\mathbf{y}_M) Y=(y1,y2,…,yM)表示目标短语。每个短语是 K K K维one-hot向量的序列,向量中只有一个元素为1,所有其他元素为0。非零元素(1)的索引指示由向量表示的单词。
(注:感觉这里的 X X X是应该是一个句子,不过短语和句子其实本质上是一样的, ( x 1 , x 2 , … , x N ) (\mathbf{x}_1,\mathbf{x}_2,…,\mathbf{x}_N) (x1,x2,…,xN)是句子里面的词,每一个词 x i \mathbf{x}_i xi用 K K K维one-hot向量表示)
源短语的每个单词都嵌入到500维向量空间中: e ( x i ) ∈ R 500 e(\mathbf{x}_i )\in R^{500} e(xi)∈R500。 e ( x ) e(\mathbf{x}) e(x)在第4.4节中用于将单词形象化。
编码器的隐藏状态由1000个隐藏单元组成,在时刻 t t t,每个隐藏单元的计算公式为
h j < t > = z j h j < t − 1 > + ( 1 − z j ) h ~ j < t > , h_j^{
其中
h ~ j < t > = t a n h ( [ W e ( x t ) ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) , \tilde{h}_j^{
σ \sigma σ和 ⊙ \odot ⊙分别是logistic sigmoid函数和元素乘法。为了使方程更清晰,我们省略了偏差。初始隐态 h j < 0 > h_j^{<0>} hj<0>固定为0。
一旦计算了 N N N步(源短语的结尾)处的隐藏状态,则源短语 c \mathbf{c} c 的表示为
c = t a n h ( V h < N > ) . \mathbf{c}=tanh(\mathbf{Vh}^{
解码器首先使用初始化隐藏状态
h ′ < 0 > = t a n h ( V ′ c ) , h^{\prime<0>}=tanh(\mathbf{V}^\prime \mathbf{c}), h′<0>=tanh(V′c),
其中我们将使用 ⋅ ′ \cdot^\prime ⋅′区分解码器和编码器的参数。
解码器在时间 t t t 的隐藏状态由以下公式计算:
h j ′ < t > = z j ′ h j ′ < t − 1 > + ( 1 − z j ′ ) h ~ j ′ < t > , h_j^{\prime
其中
h ~ j ′ < t > = t a n h ( [ W ′ e ( y t − 1 ) ] j + r j ′ [ U ′ h < t − 1 > ′ + C c ] j ) , \tilde{h}_j^{\prime
e ( y 0 ) e(\mathbf{y}_{0}) e(y0)是一个全零向量。与编码器的情况类似, e ( y ) e(\mathbf{y}) e(y)是目标字的embedding。
与只编码源短语的编码器不同,解码器学习生成目标短语。在每个时间 t t t,解码器通过以下方式计算生成第 j j j 个字的概率:
p ( y t , j = 1 ∣ y t − 1 , . . . , y 1 , X ) = e x p ( g j s < t > ) ∑ j ′ = 1 K e x p ( g j ′ s < t > ) p(y_{t, j}=1|\mathbf{y}_{t-1}, ..., \mathbf{y}_{1},\mathbf{X})=\frac{exp(\mathbf{g}_j \mathbf{s}_{
其中 s < t > \mathbf{s}_{
s i < t > = max { s 2 i − 1 ′ < t > , s 2 i ′ < t > } s_i^{
并且
s ′ < t > = O h h ′ < t > + O y y t − 1 + O c c \mathbf{s}^{\prime
简单来说, s i < t > s_i^{
为了提高计算效率,不使用单个矩阵输出权重 G \mathbf{G} G,我们使用两个矩阵的乘积
G = G l G r \mathbf{G}=\mathbf{G}_l\mathbf{G}_r G=GlGr
其中 G l ∈ R K × 500 \mathbf{G}_l\in R^{K\times 500} Gl∈RK×500和 G r ∈ R 500 × 1000 \mathbf{G}_r\in R^{500\times 1000} Gr∈R500×1000
这里,我们展示了单词和短语表示的放大图,在图4–5中。
Sequence-to-sequence Learning
论文笔记:GRU、Encoder-Decoder
详解从 Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention模型
Understanding LSTM Networks
bentrevett/pytorch-seq2seq
GRU