对于处理输出序列为不定长情况的问题,例如机器翻译,例如英文到法语的句子翻译,输入和输出均为不定长。前人提出了seq2seq模型,basic idea是设计一个encoder与decoder,其中encoder将输入序列编码为一个包含输入序列所有信息的context vector $ c , d e c o d e r 通 过 对 ,decoder通过对 ,decoder通过对 c $的解码获得输入序列的信息,从而得到输出序列。encoder及decoder都通常为RNN循环神经网络
LSTM
-
forget gate:
f t = σ ( W f [ h t − 1 ; x t ] + b f ) f_{t} = \sigma (W_{f}[h_{t-1};x_{t}]+b_{f}) ft=σ(Wf[ht−1;xt]+bf)
W f W_{f} Wf是遗忘门的权重矩阵, [ h t − 1 ; x t ] [h_{t-1};x_{t}] [ht−1;xt]表示把两个向量连接成一个更长的向量, b f b_{f} bf是遗忘门的偏置项, σ \sigma σ是sigmoid函数
如果输入的维度是 d x d_{x} dx,隐藏层的维度是 d h d_{h} dh,单元状态的维度是 d c d_{c} dc(通常 d c = d h d_{c} = d_{h} dc=dh),则遗忘门的权重矩阵 W f W_{f} Wf的维度是 d c × ( d h + d x ) d_{c}×(d_{h}+d_{x}) dc×(dh+dx) -
input gate
i t = σ ( W i [ h t − 1 ; x t ] + b i ) i_{t} = \sigma (W_{i}[h_{t-1};x_{t}]+b_{i}) it=σ(Wi[ht−1;xt]+bi) -
output gate
o t = σ ( W o [ h t − 1 ; x t ] + b o ) o_{t} = \sigma (W_{o}[h_{t-1};x_{t}]+b_{o}) ot=σ(Wo[ht−1;xt]+bo) -
final out
c ~ t = t a n h ( W c [ h t − 1 ; x t ] + b c ) \tilde{c}_{t}= tanh(W_{c}[h_{t-1};x_{t}]+b_{c}) c~t=tanh(Wc[ht−1;xt]+bc)
c t = f t ∗ c t − 1 + i t ∗ c ~ t c_{t} = f_{t} * c_{t-1} + i_{t} * \tilde{c}_{t} ct=ft∗ct−1+it∗c~t
h t = o t ∗ t a n h ( c t ) h_{t} = o_{t} * tanh(c_{t}) ht=ot∗tanh(ct) -
前向计算每个神经元的输出值,对于LSTM来说就是 f t f_{t} ft, i t i_{t} it, c t c_{t} ct, o t o_{t} ot, h t h_{t} ht 5个向量的值
-
反向计算每个神经元的误差项 δ \delta δ,包括两个方向,一是沿时间的反向传播,即从当前t时刻开始,计算每个时刻的误差项;另一个是将误差项向上一层传播
-
根据相应的误差项,计算每个权重的梯度
-
sigmoid
δ
(
x
)
=
1
1
+
e
−
x
\delta (x) = \frac{1}{1+e^{-x}}
δ(x)=1+e−x1
δ
′
(
x
)
=
e
−
x
(
1
+
e
−
x
)
2
=
δ
(
x
)
(
1
−
δ
(
x
)
)
\delta^{'} (x) = \frac{e^{-x}}{(1+e^{-x})^{2}}=\delta(x)(1-\delta(x))
δ′(x)=(1+e−x)2e−x=δ(x)(1−δ(x))
- tanh
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
tanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
tanh(x)=ex+e−xex−e−x
t
a
n
h
′
(
x
)
=
1
−
t
a
n
h
2
(
x
)
tanh^{'}(x) = 1 - tanh^{2}(x)
tanh′(x)=1−tanh2(x)
LSTM需要学习的参数共有8组,分别是:
- 遗忘门的权重矩阵 W f W_{f} Wf和偏置项 b f b_{f} bf
- 输入门的权重矩阵 W i W_{i} Wi和偏置项 b i b_{i} bi
- 输出门的权重矩阵 W o W_{o} Wo和偏置项 b o b_{o} bo
- 计算单元状态的权重矩阵 W c W_{c} Wc和偏置项 b c b_{c} bc
seq2seq模型
Encoder
编码器的作用是把一个不定长的输入序列$ x_{1},x_{2},…,x_{T} $转化成一个定长的context vector c c c. 该context vector编码了输入序列$ x_{1},x_{2},…,x_{T} 的 序 列 。 回 忆 一 下 循 环 神 经 网 络 , 假 设 该 循 环 神 经 网 络 单 元 为 的序列。回忆一下循环神经网络,假设该循环神经网络单元为 的序列。回忆一下循环神经网络,假设该循环神经网络单元为f$(可以为vanilla RNN, LSTM, GRU),那么hidden state为
h t = f ( x t , h t − 1 ) h_{t} = f(x_{t},h_{t-1}) ht=f(xt,ht−1)
编码器的context vector是所有时刻hidden state的函数,即:
c = q ( h 1 , . . . , h T ) c=q(h_{1},...,h_{T}) c=q(h1,...,hT)
简单地,我们可以把最终时刻的hidden state[公式]作为context vecter。当然我们也可以取各个时刻hidden states的平均,以及其他方法。
Decoder
编码器最终输出一个context vector c c c,该context vector编码了输入序列$ x_{1},x_{2},…,x_{T} $的信息。
假设训练数据中的输出序列为 y 1 y 2 , . . . , y T ′ y_{1}y_{2},...,y_{T}^{'} y1y2,...,yT′,我们希望每个 t t t时刻的输出即取决于之前的输出也取决于context vector,即估计 P ( y t ′ ∣ y 1 , . . . , y t ′ − 1 , c ) P(y_{t'}|y_{1},...,y_{t'-1},c) P(yt′∣y1,...,yt′−1,c),从而得到输出序列的联合概率分布:
P ( y 1 , . . . , y T ′ ) = ∏ t ′ − 1 T ′ P ( y t ′ ∣ y 1 , . . . , y t ′ − 1 , c ) P(y_{1},...,y_{T'})=\prod_{t'-1}^{T'}P(y_{t'}|y_{1},...,y_{t'-1},c) P(y1,...,yT′)=t′−1∏T′P(yt′∣y1,...,yt′−1,c)
并定义该序列的损失函数loss function
− log P ( y 1 , . . . , y T ′ ) -\log P(y_{1},...,y_{T'}) −logP(y1,...,yT′)
通过最小化损失函数来训练seq2seq模型。
那么如何估计$ P(y_{t’}|y_{1},…,y_{t’-1},c) $?
我们使用另一个循环神经网络作为解码器。解码器使用函数 p p p来表示 t ′ t' t′时刻输出 y t ′ y_{t'} yt′的概率
P ( y t ′ ∣ y 1 , . . . , y t ′ − 1 , c ) = p ( y t ′ − 1 , s t ′ , c ) P(y_{t'}|y_{1},...,y_{t'-1},c) = p(y_{t'-1},s_{t'},c) P(yt′∣y1,...,yt′−1,c)=p(yt′−1,st′,c)
为了区分编码器中的hidden state[公式],其中[公式]为[公式]时刻解码器的hidden state。区别于编码器,解码器中的循环神经网络的输入除了前一个时刻的输出序列[公式],和前一个时刻的hidden state[公式]以外,还包含了context vector[公式]。即:
s t ′ = g ( y t ′ − 1 , s t ′ − 1 , c ) s_{t'} = g(y_{t'-1},s_{t'-1},c) st′=g(yt′−1,st′−1,c)
其中函数g为解码器的循环神经网络单元。
DA-RNN
第一阶段,使用注意力机制自适应地提取每个时刻的相关feature
e t k = v e T t a n h ( W e [ h t − 1 ; c t − 1 ] + U e x k ) e_{t}^{k}=v_{e}^{T}tanh(W_{e}[h_{t-1};c_{t-1}]+U_{e}x^{k}) etk=veTtanh(We[ht−1;ct−1]+Uexk)
- 用softmax函数将其归一化
α t k = e x p ( e t k ) ∑ i − 1 n e x p ( e t i ) \alpha _{t}^{k}=\frac{exp(e_{t}^{k})}{\sum_{i-1}^{n}exp(e_{t}^{i})} αtk=∑i−1nexp(eti)exp(etk) - 得到更新后的x
x ~ = ( α t 1 x t 1 , α t 2 x t 2 , . . . , α t n x t n ) \tilde{x} = (\alpha _{t}^{1}x_{t}^{1}, \alpha _{t}^{2}x_{t}^{2},...,\alpha _{t}^{n}x_{t}^{n}) x~=(αt1xt1,αt2xt2,...,αtnxtn)
- 选取LSTM作为编码器
f
1
f_{1}
f1
h t = f 1 ( h t − 1 , x ~ ) h_{t} = f_{1}(h_{t-1}, \tilde{x}) ht=f1(ht−1,x~)
第二阶段,使用另一个注意力机制选取与之相关的encoder hidden states
- 对所有时刻的 h t ′ h_{t'} ht′取加权平均,即:
c t ′ = ∑ t − 1 T β t ′ t h t c_{t}^{'} = \sum_{t-1}^{T}\beta _{t^{'}}^{t}h_{t} ct′=t−1∑Tβt′tht
- β t ′ t \beta _{t^{'}}^{t} βt′t的设计类似于Bahanau的工作,基于前一个时刻解码器的hidden state $ d_{t’-1} 和 c e l l s t a t e 和cell state 和cellstates_{t’-1}^{’}$计算得到:
l
t
t
=
v
d
T
t
a
n
h
(
W
d
[
d
t
−
1
;
s
t
−
1
′
]
+
U
d
h
t
)
l_{t}^{t}=v_{d}^{T}tanh(W_{d}[d_{t-1};s_{t-1}^{'}]+U_{d}h_{t})
ltt=vdTtanh(Wd[dt−1;st−1′]+Udht)
β
t
i
=
e
x
p
(
l
t
i
)
∑
j
=
1
T
e
x
p
(
l
t
j
)
\beta _{t}^{i}=\frac{exp(l_{t}^{i})}{\sum_{j=1}^{T}exp(l_{t}^{j})}
βti=∑j=1Texp(ltj)exp(lti)
c
t
=
∑
i
=
1
T
β
t
i
h
i
c_{t}=\sum_{i=1}^{T}\beta _{t}^{i}h_{i}
ct=i=1∑Tβtihi
- 解码器的输入是上一个时刻的目标序列
y
t
′
−
1
y_{t'-1}
yt′−1和hidden state
d
t
′
−
1
d_{t'-1}
dt′−1以及context vector
c
t
′
−
1
c_{t'-1}
ct′−1,即
d t ′ = f 2 ( y t ′ − 1 , c t ′ − 1 , d t ′ − 1 ) d_{t'}=f_{2}(y_{t'-1},c_{t'-1},d_{t'-1}) dt′=f2(yt′−1,ct′−1,dt′−1) - 这里设计了
y
~
t
′
−
1
\tilde{y}_{t'-1}
y~t′−1来combie
y
t
′
−
1
y_{t'-1}
yt′−1与
c
t
′
−
1
c_{t'-1}
ct′−1的信息,即
y ~ t ′ − 1 = ω ~ T [ y t ′ − 1 ; c t ′ − 1 ] + b ~ \tilde{y}_{t'-1} = \tilde{\omega }^{T}[y_{t'-1};c_{t'-1}]+\tilde{b} y~t′−1=ω~T[yt′−1;ct′−1]+b~ - 然后
d t = f 2 ( d t − 1 , y ~ t − 1 ) d_{t}=f_{2}(d_{t-1},\tilde{y}_{t-1}) dt=f2(dt−1,y~t−1)