Seq2Seq模型讲解

概述

Seq2Seq是一个Encoder-Deocder结构的模型,输入是一个序列,输出也是一个序列。

Encoder将一个可变长度的输入序列变为固定长度的向量,Decoder将这个固定长度的向量解码成可变长度的输出序列。

使用 x={x1,x2,...,xn} x = { x 1 , x 2 , . . . , x n } 表示输入语句, y={y1,y2,...,yn} y = { y 1 , y 2 , . . . , y n } 代表输出语句, yt y t 代表当前输出词。

所有的Seq2Seq模型都是以下目标函数,都是为了优化这个函数:

p(y|x)=t=1nyp(yt|y1,y2,...,yt1,x) p ( y | x ) = ∏ t = 1 n y p ( y t | y 1 , y 2 , . . . , y t − 1 , x )

即输出的 yt y t 不仅依赖之前的输出 {y1,y2,...,yn} { y 1 , y 2 , . . . , y n } ,还依赖输入语句 {x1,x2,...,xn} { x 1 , x 2 , . . . , x n } ,模型无论怎么变化都是在该公式的约束下。

【注】

该条件概率模型存在问题:数值下溢问题。

原因:该式中每一项 p(yt|y1,y2,...,yt1,x) p ( y t | y 1 , y 2 , . . . , y t − 1 , x ) 都小于1甚至于远远小于1,很多1乘起来,会得到很小很小的数字,造成数值下溢(numerical underflow)。

因此,在实际中一般是将其取log值,求其概率的对数和而不是概率的乘积,因此实际中一般用如下目标函数,目标是最大化该目标函数:

P(y|x)=t=1nylogP(yt|y1,y2,...,yt1,x) P ( y | x ) = ∑ t = 1 n y log ⁡ P ( y t | y 1 , y 2 , . . . , y t − 1 , x )

改进

Seq2Seq的核心部分是其解码部分,大部分改进基于此:

  • greedy search:基础解码方法
  • beam search:对greedy search的改进
  • attention:它的引入使得解码时,每一步可以有针对地关注与当前有关的编码结果,从而减小了编码器输出表示的学习难度,也更容易学到长期的依赖关系。
  • memory network:从外部获取知识。
  • 其他方法:
    • 堆叠多层RNN的Decoder
    • 增加dropout机制
    • 与Encoder建立残差连接

最早模型

Cho在2014年Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation提出该模型。

该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN Cell,可以是RNN,也可以是LSTM、GRU等。

【流程】

  • Encoder

    • 每个时刻输入一个词,隐藏层状态根据公式 ht=f(ht1,xt) h t = f ( h t − 1 , x t ) 改变。其中激活函数 f f 可以是sigmod,tanh,ReLU,sotfplus,LSTM等。
    • 读完序列的每一个词之后,会得到一个固定长度向量 c=tanh(VhN) c = t a n h ( V h N )
  • Decoder

    • 由结构图可以看出,t时刻的隐藏层状态 ht h t ht1,yt1,c h t − 1 , y t − 1 , c 决定: ht=f(ht1,yt1,c) h t = f ( h t − 1 , y t − 1 , c ) ,其中 h0=tanh(Vc) h 0 = t a n h ( V ′ c )

    • 最后的输出 yt y t 是由 ht,yt1,c h t , y t − 1 , c 决定

      P=(yt|yt1,yt2,...,y1,c)=g(ht,yt1,c) P = ( y t | y t − 1 , y t − 2 , . . . , y 1 , c ) = g ( h t , y t − 1 , c )

      以上, f,g f , g 都是激活函数,其中 g g 一般是softmax

  • 目标

    • 最大化对数似然条件概率
      maxθ1Nn=1Nlogpθ(yn|xn) max θ 1 N ∑ n = 1 N l o g p θ ( y n | x n )

改进模型

该模型由Sequence to Sequence Learning with Neural Networks提出。

该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN Cell,可以是RNN,也可以是LSTM、GRU等。本篇论文中Encoder、Decoder用的都是LSTM

【流程】

  • Encoder

    同上个模型。如下图所示:

  • Decoder

    • 初始状态:Encoder得到的向量表示即Encoder最后一个时间步长的隐藏层状态会作为Decoder的初始状态输入。通过激活函数与softmax层得到候选symbols,筛选出概率最大的symbol,作为下一时刻的输入。

    • t时刻的输出 yt y t :由 ht,yt1 h t , y t − 1 决定,而没有 c c p(yt)=f(ht,yt1) p ( y t ) = f ( h t , y t − 1 ) 。即在Decoder中,每个时刻 t t 的输出 yt y t 会作为下一时刻 t+1 t + 1 的输入,直到Decoder在某个时刻预测出结束符号才停止。

  • 目标函数:

    p(y1,...,yT|x1,...,xT)=t=1Tp(yt|v,y1,...,yt1) p ( y 1 , . . . , y T ′ | x 1 , . . . , x T ) = ∏ t = 1 T ′ p ( y t | v , y 1 , . . . , y t − 1 )

  • 最终多层模型采用下图说明:

【区别】

与上个模型的区别是Decoder部分

  • 上个模型Decoder输入是上一时刻的输出和C向量,而是前一时刻的目标值。

Seq2Seq with Attention

Attention机制由NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE提出。


【流程】

  • Encoder

    • 使用双向RNN
    • hj h j → 表示前向RNN的隐藏层状态, hj^ h j ^ 表示反向隐藏层状态
    • hj h j 最终因状态将两者拼接起来,即 hj=[hj,hj^] h j = [ h j → , h j ^ ]
  • Decoder

    • 每一时刻 i i 的输出由三个要素决定:时刻 i i 的隐状态 si s i ,attention计算得到的context向量 ci c i ,上一时刻 i1 i − 1 的输出 yi1 y i − 1

      p(yi|y1,...,yi1,X)=yi=g(yi1,si,ci) p ( y i | y 1 , . . . , y i − 1 , X ) = y i = g ( y i − 1 , s i , c i )

      其中 si s i 由三个要素决定:时刻 i i 的隐状态,attention计算得到的context向量 ci c i ,上一时刻 i1 i − 1 输出 yi1 y i − 1
      si=f(si1,yi1,ci) s i = f ( s i − 1 , y i − 1 , c i )

    • 其中 ci c i 由以下公式得到

      ci=j=1Txαijhjαij=exp(eij)Txk=1exp(eik)eij=a(si1,hj) c i = ∑ j = 1 T x α i j h j α i j = e x p ( e i j ) ∑ k = 1 T x e x p ( e i k ) e i j = a ( s i − 1 , h j )

      其中

    • ci c i 是输入序列全部隐状态的 h1,h2,...,hT h 1 , h 2 , . . . , h T 的加权和

    • αij α i j 代表权重参数,它并不是一个固定权重,而是由另一个神经网络训练得到

【总结】

  • context向量 ci c i 通过计算输入中的每个单词的权重,加权求和得到。
  • 其中权重 αij α i j 即Decoder的上一时刻 i1 i − 1 隐状态 si1 s i − 1 和Encoder的最终隐状态 hj h j 通过非线性函数得到。

你可能感兴趣的:(NLP)