Seq2seq模型及注意力机制模型

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

对于处理输出序列为不定长情况的问题,例如机器翻译,例如英文到法语的句子翻译,输入和输出均为不定长。前人提出了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[ht1;xt]+bf)
    WfW_{f}Wf是遗忘门的权重矩阵,[ht−1;xt][h_{t-1};x_{t}][ht1;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[ht1;xt]+bi)

  • output gate
    ot=σ(Wo[ht−1;xt]+bo) o_{t} = \sigma (W_{o}[h_{t-1};x_{t}]+b_{o}) ot=σ(Wo[ht1;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[ht1;xt]+bc)
    ct=ft∗ct−1+it∗c~t c_{t} = f_{t} * c_{t-1} + i_{t} * \tilde{c}_{t} ct=ftct1+itc~t
    ht=ot∗tanh(ct) h_{t} = o_{t} * tanh(c_{t}) ht=ottanh(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+ex1
δ′(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+ex)2ex=δ(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+exexex
tanh′(x)=1−tanh2(x) tanh^{'}(x) = 1 - tanh^{2}(x) tanh(x)=1tanh2(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,ht1)

编码器的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(yty1,...,yt1,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)=t1TP(yty1,...,yt1,c)

并定义该序列的损失函数loss function

−log⁡P(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(yty1,...,yt1,c)=p(yt1,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(yt1,st1,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[ht1;ct1]+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=i1nexp(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(ht1,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=t1Tβttht

  • βt′t \beta _{t^{'}}^{t} βtt的设计类似于Bahanau的工作,基于前一个时刻解码器的hidden state $ d_{t’-1} 和cellstate和cell statecellstates_{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[dt1;st1]+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=1Tβtihi

  • 解码器的输入是上一个时刻的目标序列yt′−1y_{t'-1}yt1和hidden statedt′−1d_{t'-1}dt1以及context vector ct′−1c_{t'-1}ct1,即
    dt′=f2(yt′−1,ct′−1,dt′−1) d_{t'}=f_{2}(y_{t'-1},c_{t'-1},d_{t'-1}) dt=f2(yt1,ct1,dt1)
  • 这里设计了y~t′−1\tilde{y}_{t'-1}y~t1来combieyt′−1y_{t'-1}yt1ct′−1c_{t'-1}ct1的信息,即
    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~t1=ω~T[yt1;ct1]+b~
  • 然后
    dt=f2(dt−1,y~t−1) d_{t}=f_{2}(d_{t-1},\tilde{y}_{t-1}) dt=f2(dt1,y~t1)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值