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

本文深入探讨了Seq2Seq模型及其在机器翻译等任务中的应用,详细解析了LSTM结构,包括其门控机制和前向计算过程。同时介绍了DA-RNN模型中注意力机制的运用。
1205

被折叠的 条评论
为什么被折叠?



