NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记

NLP经典论文:Sequence to Sequence、Encoder-Decoder、GRU 笔记

  • 论文
  • 介绍
    • 特点
  • 模型结构
    • 整体结构
      • 输入
      • 输出
      • 整体流程
      • 流程维度
    • GRU
      • 模型结构
      • GRU单元的理解
    • Encoder
      • 输入
      • 隐藏层
        • t=1时刻
        • t时刻
        • t=T时刻
    • Decoder
      • t=1时刻
      • t时刻
        • GRU层
        • 全连接层
        • max pooling层
        • 全连接层+softmax层
      • t=T'时刻
  • 文章部分翻译
    • 2 RNN Encoder–Decoder
      • 2.1 Preliminary: Recurrent Neural Networks
      • 2.2 RNN Encoder–Decoder
      • 2.3 Hidden Unit that Adaptively Remembers and Forgets
    • 3 Statistical Machine Translation
      • 3.1 Scoring Phrase Pairs with RNN Encoder–Decoder
      • 3.2 Related Approaches: Neural Networks in Machine Translation
    • 4 Experiments
      • 4.4 Word and Phrase Representations
      • 4.1 Data and Baseline System
        • 4.1.1 RNN Encoder–Decoder
    • A RNN Encoder–Decoder
      • A.1 Encoder
      • A.1.1 Decoder
    • B Word and Phrase Representations
  • 相关视频
  • 相关笔记
  • 相关复现
    • pytorch
    • tensorflow
      • keras
  • API
    • pytorch API:
    • tensorflow API

论文

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结构。

特点

  1. 使用了Encoder-Decoder结构,与RNN神经网络相比,解决了Sequence to Sequence输入长度和输出长度不对等的问题。对于长度为 n 或 m 的输入或输出,RNN神经网络只能解决 n to 1,1 to n 或 n to n 的情况,对 n to m 的问题很是头疼,Encoder-Decoder模型解决了n to m 的问题。Encoder使用RNN类的结构,将输入浓缩成固定长度的 context 向量,作为Decoder的输入,而Decoder中使用RNN类的结构,能够不断将每一次的输出值重新作为输入,再产生下一个输出。
  2. 提出的GRU结构,比LSTM结构简单,效果相当。

模型结构

整体结构

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第1张图片

输入

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} xRd×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} yRd×1 y \mathbf{y} y为embedding表示的一个英文词, Y Y Y为英文的一个句子,word embedding 矩阵共有 K K K 个词,每个词用 d d d 维向量表示。

整体流程

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第2张图片

流程维度

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第3张图片

GRU

模型结构

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第4张图片
NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第5张图片
NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第6张图片

GRU单元的理解

我们可以使用如下比喻:
r \mathbf{r} r:本能记忆遗忘系数,即过去记忆自热而然的遗忘速度,衰退系数;
z \mathbf{z} z:自主记忆保留系数,即自己选择记住多少东西
h < t − 1 > \mathbf{h}_{} h<t1>:上一时刻的记忆,即过去的记忆
h ~ j < t > \tilde{\mathbf{h}}_j^{} h~j<t>:当前记忆的暂稳态,即刚吸收新知识的时候,新知识在大脑的记忆,是消化后的新知识,短期记忆
h < t > \mathbf{h}_{} h<t>:当前记忆的稳态,即吸收知识之后的总体记忆,吸收过去记忆与短期记忆后形成的长期记忆
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}_{}]_j), rj=σ([Wrx]j+[Urh<t1>]j),
可以看到,本能记忆遗忘系数 r \mathbf{r} r,是由新知识 x \mathbf{x} x 和过去的记忆 h < t − 1 > \mathbf{h}_{} h<t1> 决定的。也就是说,大脑在看到新知识之后,基于过去的记忆,可以计算出,对过去记忆自热而然的遗忘速度,这是机体的本能反应。

然后,通过以下公式计算提出的大脑当前时刻的短期记忆 h ~ j < t > \tilde{h}_j^{} h~j<t>
h ~ j < t > = ϕ ( [ W x ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) . \tilde{h}_j^{}=\phi([\mathbf{W}\mathbf{x}]_j+[\mathbf{U}(\mathbf{r}\odot\mathbf{h}_{})]_j). h~j<t>=ϕ([Wx]j+[U(rh<t1>)]j).
可以看到,短期记忆 h \mathbf{h} h 由新知识 x \mathbf{x} x 、过去的记忆 h < t − 1 > \mathbf{h}_{} h<t1> 和本能记忆遗忘系数 r j r_j rj 决定的。也就是说,在大脑融合新知识和一部分过去的记忆成短期记忆,是新知识消化的过程,新知识在大脑中的反映。

类似地,自主记忆保留系数 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}_{}]_j). zj=σ([Wzx]j+[Uzh<t1>]j).
可以看到,自主记忆保留系数 z \mathbf{z} z,是由新知识 x \mathbf{x} x 和过去的记忆 h < t − 1 > \mathbf{h}_{} h<t1> 决定的。也就是说,大脑在看到新知识之后,再对比过去的知识,自主选择对旧记忆的保留程度,这是非本能反应,是主动的选择。

最后,通过以下公式计算提出的大脑长期记忆 h j h_j hj
h j < t > = z j h j < t − 1 > + ( 1 − z j ) h ~ j < t > , h_j^{}=z_jh_j^{}+(1-z_j)\tilde{h}_j^{}, hj<t>=zjhj<t1>+(1zj)h~j<t>,
可以看到,当前长期记忆 h < t > \mathbf{h}_{} h<t> ,保留了一部分过去的记忆,以及筛选了一部分的短期记忆,融合两者形成长期记忆。

假如我们当前的任务是创作金庸风格的文章的话,当前创造词的条件分布是
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}_{}, y_{t-1}, \mathbf{c}) p(ytyt1yt2y1,c)=g(h<t>,yt1,c)
可以看到,当前词的预测由当前的长期记忆 h < t > \mathbf{h}_{} h<t> 、上一个创作词 y t − 1 y_{t-1} yt1 和创作风格 c \mathbf{c} c。基于上一个创作词,按照当前的写作内容,写作能力,配合上金庸的创作风格,就能写出金庸风格的文章了。

Encoder

输入

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} xRd×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个输入时刻,每个时刻输入一个词。
NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第7张图片

t=1时刻

初始化hidden state h < 0 > \mathbf{h}_{<0>} h<0> h < t > ∈ R 1000 × 1 \mathbf{h}_{}\in R^{1000\times 1} h<t>R1000×1,根据输入 x 1 \mathbf{x}_1 x1,计算reset gate r < 1 > \mathbf{r}_{<1>} r<1>、update gate z < 1 > \mathbf{z}_{<1>} z<1>、短期记忆 h ~ < 1 > \tilde{\mathbf{h}}_{<1>} h~<1>、长期记忆 h < 1 > \mathbf{h}_{<1>} h<1>

t时刻

根据输入 x t \mathbf{x}_t xt,上一时刻的记忆 h < t − 1 > \mathbf{h}_{} h<t1>,计算当前时刻的reset gate r < t > \mathbf{r}_{} r<t>、update gate z < t > \mathbf{z}_{} z<t>、短期记忆 h ~ < t > \tilde{\mathbf{h}}_{} h~<t>、长期记忆 h < t > \mathbf{h}_{} h<t>
r < t > = σ ( W r x + U r h < t − 1 > ) , \mathbf{r}_{}=\sigma(\mathbf{W}_r\mathbf{x}+\mathbf{U}_r\mathbf{h}_{}), r<t>=σ(Wrx+Urh<t1>), z < t > = σ ( W z x + U z h < t − 1 > ) , \mathbf{z}_{}=\sigma(\mathbf{W}_z\mathbf{x}+\mathbf{U}_z\mathbf{h}_{}), z<t>=σ(Wzx+Uzh<t1>), h ~ < t > = ϕ ( W x + U ( r < t > ⊙ h < t − 1 > ) ) , \tilde{\mathbf{h}}_{}=\phi(\mathbf{W}\mathbf{x}+\mathbf{U}(\mathbf{r}_{}\odot\mathbf{h}_{})), h~<t>=ϕ(Wx+U(r<t>h<t1>)), h < t > = z < t > ⊙ h < t − 1 > + ( 1 − z < t > ) ⊙ h ~ < t > , \mathbf{h}_{}=\mathbf{z}_{}\odot\mathbf{h}_{}+(\mathbf{1}-\mathbf{z}_{})\odot\tilde{\mathbf{h}}_{}, h<t>=z<t>h<t1>+(1z<t>)h~<t>,
其中 ⊙ \odot 代表2个向量在对应位置上元素相乘, σ 、 ϕ \sigma、\phi σϕ 分别表示 sigmoid 和 tanh 激活函数。 h < t − 1 > \mathbf{h}_{} h<t1> 1 \mathbf{1} 1 r < t > \mathbf{r}_{} r<t> z < t > \mathbf{z}_{} z<t> h ~ < t > \tilde{\mathbf{h}}_{} h~<t> h < t > ∈ R 1000 × 1 \mathbf{h}_{}\in R^{1000\times 1} h<t>R1000×1 W r 、 W z 、 W ∈ R 1000 × d \mathbf{W}_r、\mathbf{W}_z、\mathbf{W}\in R^{1000\times d} WrWzWR1000×d U r 、 U z 、 U ∈ R 1000 × 1000 \mathbf{U}_r、\mathbf{U}_z、\mathbf{U}\in R^{1000\times 1000} UrUzUR1000×1000

t=T时刻

RNN隐藏层经过 T T T 个时刻的计算,最终得到 h < T > \mathbf{h}_{} h<T>,经过下式计算,可得到上下文向量 c \mathbf{c} c
c = t a n h ( V h < T > ) . \mathbf{c}=tanh(\mathbf{Vh}_{}). c=tanh(Vh<T>).
其中 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} VRdc×1000cRdc×1 c \mathbf{c} c 包含了输入的全部信息。

Decoder

隐藏层也是有1000个GRU单元。

对于RNN隐藏层来说,输出有 T ′ T\prime T个词,每个时刻输出一个词。

t=1时刻

这里的 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(Vc),
其中 V ′ ∈ R 1000 × d c \mathbf{V}^\prime\in R^{1000\times d_c} VR1000×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} yRK×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>

t时刻

GRU层

根据输入 y t − 1 \mathbf{y}_{t-1} yt1,上一时刻的记忆 h < t − 1 > ′ \mathbf{h}^{\prime}_{} h<t1>,计算当前时刻的reset gate r < t > ′ \mathbf{r}^{\prime}_{} r<t>、update gate z < t > ′ \mathbf{z}^{\prime}_{} z<t>、短期记忆 h ~ < t > ′ \tilde{\mathbf{h}}^{\prime}_{} h~<t>、长期记忆 h < t > ′ \mathbf{h}^{\prime}_{} h<t>
r < t > ′ = σ ( W r ′ y + U r ′ h < t − 1 > ′ + C r c ) , \mathbf{r}^{\prime}_{}=\sigma(\mathbf{W}^{\prime}_r\mathbf{y}+\mathbf{U}^{\prime}_r\mathbf{h}^{\prime}_{}+\mathbf{C}_r\mathbf{c}), r<t>=σ(Wry+Urh<t1>+Crc), z < t > ′ = σ ( W z ′ y + U z ′ h < t − 1 > ′ + C z c ) , \mathbf{z}^{\prime}_{}=\sigma(\mathbf{W}^{\prime}_z\mathbf{y}+\mathbf{U}^{\prime}_z\mathbf{h}^{\prime}_{}+\mathbf{C}_z\mathbf{c}), z<t>=σ(Wzy+Uzh<t1>+Czc), h ~ < t > ′ = ϕ ( W ′ y + r < t > ′ ⊙ ( U ′ h < t − 1 > ′ + C c ) ) , \tilde{\mathbf{h}}^{\prime}_{}=\phi(\mathbf{W}^{\prime}\mathbf{y}+\mathbf{r}^{\prime}_{}\odot(\mathbf{U}^{\prime}\mathbf{h}^{\prime}_{}+\mathbf{Cc})), h~<t>=ϕ(Wy+r<t>(Uh<t1>+Cc)), h < t > ′ = z < t > ′ ⊙ h < t − 1 > ′ + ( 1 − z < t > ′ ) ⊙ h ~ < t > ′ , \mathbf{h}^{\prime}_{}=\mathbf{z}^{\prime}_{}\odot\mathbf{h}^{\prime}_{}+(\mathbf{1}-\mathbf{z}^{\prime}_{})\odot\tilde{\mathbf{h}}^{\prime}_{}, h<t>=z<t>h<t1>+(1z<t>)h~<t>,
其中 ⊙ \odot 代表2个向量在对应位置上元素相乘, σ 、 ϕ \sigma、\phi σϕ 分别表示 sigmoid 和 tanh 激活函数。 h < t − 1 > ′ \mathbf{h}^{\prime}_{} h<t1> 1 \mathbf{1} 1 r < t > ′ \mathbf{r}^{\prime}_{} r<t> z < t > ′ \mathbf{z}^{\prime}_{} z<t> h ~ < t > ′ \tilde{\mathbf{h}}^{\prime}_{} h~<t> h < t > ′ ∈ R 1000 × 1 \mathbf{h}^{\prime}_{}\in R^{1000\times 1} h<t>R1000×1 W r ′ 、 W z ′ 、 W ′ ∈ R 1000 × d \mathbf{W}^{\prime}_r、\mathbf{W}^{\prime}_z、\mathbf{W}^{\prime}\in R^{1000\times d} WrWzWR1000×d U r ′ 、 U z ′ 、 U ′ ∈ R 1000 × 1000 \mathbf{U}^{\prime}_r、\mathbf{U}^{\prime}_z、\mathbf{U}^{\prime}\in R^{1000\times 1000} UrUzUR1000×1000 C r 、 C z 、 C ∈ R 1000 × d c \mathbf{C}_r、\mathbf{C}_z、\mathbf{C}\in R^{1000\times d_c} CrCzCR1000×dc

全连接层

h < t > ′ 、 y t − 1 、 c \mathbf{h}^{\prime}_{}、\mathbf{y}_{t-1}、\mathbf{c} h<t>yt1c传入全连接层:

s < t > ′ = O h h < t > ′ + O y y t − 1 + O c c \mathbf{s}^{\prime}_{}=\mathbf{O}_h\mathbf{h}^{\prime}_{}+\mathbf{O}_y\mathbf{y}_{t-1}+\mathbf{O}_c\mathbf{c} s<t>=Ohh<t>+Oyyt1+Occ
其中, 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}_{}\in R^{2000\times 1} OhR2000×1000,OyR2000×d,OcR2000×dc,s<t>R2000×1

max pooling层

s < t > ′ \mathbf{s}^{\prime}_{} s<t>经过 max pooling:

s i < t > = max ⁡ { s 2 i − 1 ′ < t > , s 2 i ′ < t > } s_i^{}=\max \{s_{2i-1}^{\prime},s_{2i}^{\prime}\} si<t>=max{s2i1<t>,s2i<t>}
s i < t > s_i^{} si<t> s < t > \mathbf{s}_{} s<t>的第 i i i 个词, s < t > ∈ R 1000 × 1 \mathbf{s}_{}\in R^{1000\times 1} s<t>R1000×1

全连接层+softmax层

最后 s < t > \mathbf{s}_{} s<t>传入全连接层+softmax,预测为字典里面第 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(\mathbf{y}_{t, j}=1|\mathbf{y}_{t-1}, ..., \mathbf{y}_{1},\mathbf{X})=\frac{exp(\mathbf{g}_j \mathbf{s}_{})}{\sum\limits_{j\prime=1}^Kexp(\mathbf{g}_{j\prime} \mathbf{s}_{})} p(yt,j=1yt1,...,y1,X)=j=1Kexp(gjs<t>)exp(gjs<t>)
其中 g ∈ G , G ∈ R K × 1000 \mathbf{g}\in \mathbf{G},\mathbf{G}\in R^{K\times 1000} gG,GRK×1000

得到预测词 y t \mathbf{y}_t yt

t=T’时刻

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)

文章部分翻译

2 RNN Encoder–Decoder

2.1 Preliminary: Recurrent Neural Networks

循环神经网络(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=x1xT上进行计算。在每个时间步 t t t,RNN的隐藏状态 h < h > \mathbf{h}_{} h<h>的更新由
h < t > = f ( h < t − 1 > , x t ) , ( 1 ) \mathbf{h}_{}=f(\mathbf{h}_{},x_t), \quad\quad (1) h<t>=f(h<t1>,xt),(1)
其中 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(xtxt1,,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}_{})}{\sum\limits_{j\prime=1}^Vexp(\mathbf{w}_{j\prime} \mathbf{h}_{})} p(xt,j=1xt1,...,x1)=j=1Vexp(wjh<t>)exp(wjh<t>)
对于所有可能的 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=1Tp(xtxt1,,x1)(3)

按照这种分布,可以直接通过在每个时间步对一个symbol进行迭代采样,来对新序列进行采样。

2.2 RNN Encoder–Decoder

在本文中,我们提出了一种新的神经网络结构,该结构学习如何将可变长度序列编码为固定长度向量,并将给定的固定长度向量解码回可变长度序列。从概率的角度来看,这个新模型是一种学习变长序列在另一个变长序列上的条件分布的通用方法,例如 p ( y 1 , … , y T ′ ∣ x 1 , … , x T ) p(y_1,…,y_T\prime | x_1,…,x_T) p(y1yTx1xT),其中应注意输入和输出序列长度 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>预测下一个symbol y t y_t yt来生成输出序列。但是,与第2.1节中描述的RNN不同, y t y_t yt h < t > \mathbf{h}_{} h<t>还基于条件 y t − 1 y_{t-1} yt1和输入序列的摘要 c \mathbf{c} c。因此,解码器在时间t的隐藏状态通过以下公式计算:
h < t > = f ( h < t − 1 > , y t − 1 , c ) , \mathbf{h}_{}=f(\mathbf{h}_{}, y_{t-1}, \mathbf{c}), h<t>=f(h<t1>,yt1,c),
同样,下一个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}_{}, y_{t-1}, \mathbf{c}) p(ytyt1yt2y1,c)=g(h<t>,yt1,c)
对于给定的激活函数 f f f g g g(后者必须产生有效概率,例如,使用softmax)。

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第8张图片
请参考图1,以获取提出的模型架构的图形描述。

提出的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=1Nlogpθ(ynxn),(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θ(yx)

2.3 Hidden Unit that Adaptively Remembers and Forgets

NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第9张图片
除了一种新颖的模型架构外,我们还提出了一种新型的隐藏单元(式(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}_{}]_j),\quad\quad(5) rj=σ([Wrx]j+[Urh<t1>]j),(5)
其中 σ \sigma σ是logistic sigmoid函数, [ . ] j [.]_j [.]j表示向量的第j个元素。 x \mathbf{x} x h < t − 1 > \mathbf{h}_{} h<t1>分别是输入和先前的隐藏状态。 W r \mathbf{W}_r Wr U r \mathbf{U}_r Ur是习得的权重矩阵。

类似地,更新门 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}_{}]_j).\quad\quad(6) zj=σ([Wzx]j+[Uzh<t1>]j).(6)
然后,通过以下公式计算提出的单元 h j h_j hj的实际激活:
h j < t > = z j h j < t − 1 > + ( 1 − z j ) h ~ j < t > , ( 7 ) h_j^{}=z_jh_j^{}+(1-z_j)\tilde{h}_j^{}, \quad\quad(7) hj<t>=zjhj<t1>+(1zj)h~j<t>,(7)
其中
h ~ j < t > = ϕ ( [ W x ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) . ( 8 ) \tilde{h}_j^{}=\phi([\mathbf{W}\mathbf{x}]_j+[\mathbf{U}(\mathbf{r}\odot\mathbf{h}_{})]_j).\quad\quad(8) h~j<t>=ϕ([Wx]j+[U(rh<t1>)]j).(8)
在此公式中,当重置门接近0时,隐藏状态被强制忽略先前的隐藏状态,并仅使用当前输入重置。这有效地使得隐藏状态删除以后发现的任何不相关信息,从而得到更紧凑的表示。

另一方面,更新门控制多少信息量会从先前的隐藏状态带到当前的隐藏状态。这类似于LSTM网络中的存储单元,有助于RNN记住长期信息。此外,这可能被视为leaky-integration unit的adaptive variant (Bengio等人,2013年)。

由于每个隐藏单元都有单独的重置和更新门,因此每个隐藏单元将学习捕获不同时间尺度上的依赖关系。那些学习捕捉短期依赖关系的单元往往具有经常处于活动状态的重置门,但那些捕捉长期依赖关系的单元将具有大部分处于活动状态的更新门。

在我们的初步实验中,我们发现使用这种有门控的新单元是至关重要的。我们使用常用的无门控tanh单位无法得到有意义的结果。

3 Statistical Machine Translation

在一个常用的统计机器翻译系统(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(fe)p(ef)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(fe)=n=1Nwnfn(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(fe)被分解为匹配源句子中的短语和目标句子中的短语的翻译概率。在对数线性模型中,这些概率再次被视为附加特征(见等式(9)),并相应地进行加权,以最大化BLEU分数。

自(Bengio等人,2003年)提出神经网络语言模型以来,神经网络已广泛应用于SMT系统。在许多情况下,神经网络被用来重新审视翻译模型的假设(n-最佳列表)(参见,例如,(Schwenk等人,2006))。然而最近,训练神经网络以使用源句子(或短语对)的表示作为额外的输入来对翻译句子进行评分引起了广泛的兴趣。例如,见(Schwenk,2012),(Son等人,2012)和(Zou等人,2013)。

3.1 Scoring Phrase Pairs with RNN Encoder–Decoder

在这里,我们建议在短语对照表上训练RNN编码器-解码器(见第2.2节),并在调整SMT解码器时,将其分数用作等式(9)中对数线性模型的附加特征。

当我们训练RNN编码器-解码器时,我们忽略原始语料库中每个短语对的(标准化)频率。采取这一措施的目的是:(1)减少从大型短语表中根据归一化频率随机选择短语对的计算花费;(2)确保RNN编码器-解码器不会根据短语对的出现次数简单地学习对短语进行排序。这种选择的一个根本原因是短语表中现有的翻译概率已经反映了原始语料库中短语对的频率。对于RNN编码器-解码器的固定容量,我们试图确保模型的大部分容量集中于学习语言规律,即区分似是而非的翻译,或学习似是而非翻译的“复杂多变体”(概率集中区域)。

一旦RNN编码器-解码器经过训练,我们将为每个短语对添加一个新的分数到现有短语表中。这使得新的分数加入到现有的优化算法,而计算的额外开销最小。

正如Schwenk在(Schwenk,2012)中指出的那样,可以用提出的RNN编码器-解码器完全替换现有短语表。在这种情况下,对于给定的源短语,RNN编码器-解码器将需要生成(好的)目标短语列表。然而,这需要重复执行计算量巨大的取样步骤。因此,本文只考虑短语表中短语对的重新排序问题。

3.2 Related Approaches: Neural Networks in Machine Translation

在给出实证结果之前,我们讨论了一些最近提出在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-最佳列表,并计算了黄金标准翻译的复杂性。

4 Experiments

我们评估了WMT’14研讨会英语/法语翻译任务的方法。
NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第10张图片

4.4 Word and Phrase Representations

由于所提出的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编码器-解码器可以捕获短语的语义和句法结构。例如,在左下角的图中,大多数短语都与时间长短有关,而那些语法相似的短语则聚集在一起。右下角的图显示了语义相似的短语集群(国家或地区)。另一方面,右上角的图显示了语法相似的短语。
NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记_第11张图片

4.1 Data and Baseline System

4.1.1 RNN Encoder–Decoder

A RNN Encoder–Decoder

在本文中,我们详细描述了实验中使用的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向量表示)

A.1 Encoder

源短语的每个单词都嵌入到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^{}=z_jh_j^{}+(1-z_j)\tilde{h}_j^{}, hj<t>=zjhj<t1>+(1zj)h~j<t>,
其中
h ~ j < t > = t a n h ( [ W e ( x t ) ] j + [ U ( r ⊙ h < t − 1 > ) ] j ) , \tilde{h}_j^{}=tanh([\mathbf{W}e(\mathbf{x}_t)]_j+[\mathbf{U}(\mathbf{r}\odot\mathbf{h}_{})]_j), h~j<t>=tanh([We(xt)]j+[U(rh<t1>)]j), z j = σ ( [ W z e ( x t ) ] j + [ U z h < t − 1 > ] j ) , z_j=\sigma([\mathbf{W}_ze(\mathbf{x}_t)]_j+[\mathbf{U}_z\mathbf{h}_{}]_j), zj=σ([Wze(xt)]j+[Uzh<t1>]j), r j = σ ( [ W r e ( x t ) ] j + [ U r h < t − 1 > ] j ) . r_j=\sigma([\mathbf{W}_re(\mathbf{x}_t)]_j+[\mathbf{U}_r\mathbf{h}_{}]_j). rj=σ([Wre(xt)]j+[Urh<t1>]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}^{}). c=tanh(Vh<N>).

A.1.1 Decoder

解码器首先使用初始化隐藏状态
h ′ < 0 > = t a n h ( V ′ c ) , h^{\prime<0>}=tanh(\mathbf{V}^\prime \mathbf{c}), h<0>=tanh(Vc),
其中我们将使用 ⋅ ′ \cdot^\prime 区分解码器和编码器的参数。

解码器在时间 t t t 的隐藏状态由以下公式计算:
h j ′ < t > = z j ′ h j ′ < t − 1 > + ( 1 − z j ′ ) h ~ j ′ < t > , h_j^{\prime}=z_j^{\prime}h_j^{\prime}+(1-z_j^{\prime})\tilde{h}_j^{\prime}, hj<t>=zjhj<t1>+(1zj)h~j<t>,
其中
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}=tanh([\mathbf{W}^{\prime}e(\mathbf{y}_{t-1})]_j+r_j^{\prime}[\mathbf{U}^{\prime}\mathbf{h}^{\prime}_{}+\mathbf{Cc}]_j), h~j<t>=tanh([We(yt1)]j+rj[Uh<t1>+Cc]j), z j ′ = σ ( [ W z ′ e ( y t − 1 ) ] j + [ U z ′ h < t − 1 > ′ ] j + [ C z c ] j ) , z_j^{\prime}=\sigma([\mathbf{W}^{\prime}_ze(\mathbf{y}_{t-1})]_j+[\mathbf{U}^{\prime}_z\mathbf{h}^{\prime}_{}]_j+[\mathbf{C}_z\mathbf{c}]_j), zj=σ([Wze(yt1)]j+[Uzh<t1>]j+[Czc]j), r j ′ = σ ( [ W r ′ e ( y t − 1 ) ] j + [ U r ′ h < t − 1 > ′ ] j + [ C r c ] j ) . r_j^{\prime}=\sigma([\mathbf{W}^{\prime}_re(\mathbf{y}_{t-1})]_j+[\mathbf{U}^{\prime}_r\mathbf{h}^{\prime}_{}]_j+[\mathbf{C}_r\mathbf{c}]_j). rj=σ([Wre(yt1)]j+[Urh<t1>]j+[Crc]j).
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}_{})}{\sum\limits_{j\prime=1}^Kexp(\mathbf{g}_{j\prime} \mathbf{s}_{})} p(yt,j=1yt1,...,y1,X)=j=1Kexp(gjs<t>)exp(gjs<t>)
其中 s < t > \mathbf{s}_{} s<t>的第 i i i 个元素是
s i < t > = max ⁡ { s 2 i − 1 ′ < t > , s 2 i ′ < t > } s_i^{}=\max \{s_{2i-1}^{\prime},s_{2i}^{\prime}\} si<t>=max{s2i1<t>,s2i<t>}
并且
s ′ < t > = O h h ′ < t > + O y y t − 1 + O c c \mathbf{s}^{\prime}=\mathbf{O}_h\mathbf{h}^{\prime}+\mathbf{O}_y\mathbf{y}_{t-1}+\mathbf{O}_c\mathbf{c} s<t>=Ohh<t>+Oyyt1+Occ
简单来说, s i < t > s_i^{} si<t>是所谓的最大输出单元。

为了提高计算效率,不使用单个矩阵输出权重 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} GlRK×500 G r ∈ R 500 × 1000 \mathbf{G}_r\in R^{500\times 1000} GrR500×1000

B Word and Phrase Representations

这里,我们展示了单词和短语表示的放大图,在图4–5中。

相关视频

Sequence-to-sequence Learning

相关笔记

论文笔记:GRU、Encoder-Decoder
详解从 Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention模型
Understanding LSTM Networks

相关复现

pytorch

bentrevett/pytorch-seq2seq

tensorflow

keras

API

pytorch API:

GRU

tensorflow API

你可能感兴趣的:(论文笔记,自然语言处理,python,nlp,gru,人工智能)