Sampled softmax模型:On Using Very Large Target Vocabulary for Neural Machine Translation

参考链接

  • 论文链接:https://arxiv.org/abs/1412.2007
  • 参考连接:https://blog.csdn.net/wangpeng138375/article/details/75151064

一、神经机器翻译

  • 神经机器翻译一般使用 e n c o d e r – d e c o d e r encoder–decoder encoderdecoder神经网络实现
  • d e c o d e r decoder decoder将输出原句子: x = ( x 1 , … , x T ) x=(x_1,…,x_T) x=(x1,,xT)编码为隐藏层状态序列: h = ( h 1 , … , h T ) h=(h_1,…,h_T) h=(h1,,hT);可以使用公式表达为: h t = f ( x t , h t − 1 ) h_t=f(x_t,h_{t-1}) ht=f(xt,ht1)
  • 然后 d e c o d e r decoder decoder根据隐藏层状态序列生成h,生成翻译句子 y = ( y 1 , … , y T ) y=(y_1,…,y_T) y=(y1,,yT): p ( y t │ y < t ; , x ) ∝ e x p { q ( y t − 1 , z t , c t ) } z t = g ( y t − 1 , z t − 1 , c t ) c t = r ( z t − 1 , h 1 , … , h T ) p(y_t │y_{p(yty<t;,x)exp{q(yt1,zt,ct)}zt=g(yt1,zt1,ct)ct=r(zt1,h1,,hT)
  • 模型通过最大化对数条件概率进行训练: θ ∗ = a r g m a x θ ⁡ ∑ n = 1 N ∑ t = 1 T n l o g p ( y t n ∣ y < t n , x n ) θ^* = arg max_θ⁡∑_{n=1}^N∑_{t=1}^{T_n}logp(y_t^n |y_{θ=argmaxθn=1Nt=1Tnlogp(ytny<tn,xn) N N N是训练样本个数, T n T_n Tn是第 n n n个样本目标句子 y n y^n yn的长度。
  • 论文中的神经机器翻译:
    • 使用了attention机制 ,RNN使用GRU单元
    • e n c o d e r encoder encoder使用 B i − R N N Bi-RNN BiRNN,因此隐藏层状态向量为: h t = [ h t ← , h t → ] h_t=[ \overleftarrow{h_t },\overrightarrow{h_t }] ht=[ht ,ht ]其中: h t ← = f ( x t , h t − 1 ← ) ; h t → = f ( x t , h t − 1 → ) \overleftarrow{h_t }=f(x_t,\overleftarrow{h_{t-1} }); \overrightarrow{h_t }=f(x_t,\overrightarrow{h_{t-1} }) ht =f(xt,ht1 );ht =f(xt,ht1 )
    • c t c_t ct d e c o d e r decoder decoder的上下文向量:它是 e n c o d e r encoder encoder输出的隐藏层状态序列 ( h 1 , … , h T ) (h_1,…,h_T) (h1,,hT)的加权和,权值为 ( α 1 , … , α T ) (α_1,…,α_T) (α1,,αT)(这是一个attention机制) α i = e x p { a ( h t , z t − 1 ) } ∑ k e x p ⁡ { a ( h k , z t − 1 ) } α_i=\frac{exp\{a(h_t,z_{t-1})\}}{∑_kexp⁡\{a(h_k,z_{t-1})\}} αi=kexp{a(hk,zt1)}exp{a(ht,zt1)} a a a是一个单层隐藏层的前馈神经网络(有点像softmax层)
    • z t z_t zt是decoder的RNN中的隐藏层状态向量: z t = g ( y t − 1 , z t − 1 , c t ) z_t=g (y_{t-1},z_{t-1},c_t) zt=g(yt1,zt1,ct)
    • 下一个目标词的概率计算公式: p ( y t │ y < t , x ) = 1 Z e x p { w t T ∅ ( y t − 1 , z t , c t ) + b t } p(y_t │y_{p(yty<t,x)=Z1exp{wtT(yt1,zt,ct)+bt} ∅ ∅ 是一个非线性映射(含激活函数),所以上式就是先进行非线性变换再进行线性变换。 Z Z Z是一个归一化化常量: Z = ∑ k , y k ∈ V e x p ⁡ { w k T ∅ ( y t − 1 , z t , c t ) + b k } Z=∑_{k,y_k∈V}exp⁡\{w_k^T∅ (y_{t-1},z_t,c_t )+ b_k \} Z=k,ykVexp{wkT(yt1,zt,ct)+bk} V V V是词汇表

二、神经机器翻译的词汇量限制问题和解决方法

  • 再神经机器翻译中一个主要的困难就是:计算目标词的概率 p ( y t │ y < t ; x ) p(y_t │y_{p(yty<t;x)的计算量比较大,即下面公式的计算量比较大: p ( y t │ y < t ; x ) = 1 Z e x p ⁡ { w t T ∅ ( y t − 1 , z t , c t ) + b t } p(y_t │y_{p(yty<t;x)=Z1exp{wtT(yt1,zt,ct)+bt}
  • 具体的说,为了计算归一化量 Z Z Z,我们需要遍历整个词汇表每个词;这个计算量与词汇表的大小成正比。需要的存储空间也随着目标单词的数量线性增长。
  • 有两个特殊的模型方法(model-specific approaches) 用来解决这个问题:
    • 方法一:随机估计目标单词的概率。
    • 方法二:将词汇表分词多个类(classes),目标词的条件概率 p ( y t │ y < t , x ) p(y_t │y_{p(yty<t,x),被分解为类概率 p ( c t │ y < t ; , x ) p(c_t │y_{p(cty<t;,x)和类内词概率 p ( y t │ c t , y < t , x ) p(y_t │c_t,y_{p(ytct,y<t,x). 这将为了计算目标词条件概率所需进行点乘的数量减少为类数量和类中单词的总和。但这种方式主要用于训练阶段的加速,对测试阶段一般不使用。
  • 除了这些特殊的模型方法外,还存在**特定的翻译方法(translation-specific approaches)**来解决这个问题:利用稀有词的属性,例如:使用单词对齐模型(the word alignment model)将源句子和目标句子中的稀有单词替换为相应的 < O O V n > <OOVn>标记。
  • 特殊的翻译方法和特殊的模型方法经常互补的使用来减少计算量和改善模型性能。

三、论文中提出的方法:Sampling softmax (核心)

  • 这个部分是论文的核心 ,到这个位置我们只讨论如何减少计算下面公式的复杂度: p ( y t │ y < t , x ) = 1 Z e x p { w t T ∅ ( y t − 1 , z t , c t ) + b t } p(y_t │y_{p(yty<t,x)=Z1exp{wtT(yt1,zt,ct)+bt}减少该公式的时间复杂度重点是减少归一化项 Z Z Z的复杂度: Z = ∑ k , y k ∈ V e x p ⁡ { w k T ∅ ( y t − 1 , z t , c t ) + b k } Z=∑_{k,y_k∈V}exp⁡\{w_k^T∅ (y_{t-1},z_t,c_t )+ b_k \} Z=k,ykVexp{wkT(yt1,zt,ct)+bk}

  • 论文提出的方法属于model-specific approach,该方法使得我们训练模型的时间复杂度与词汇表的长度无关

  • 神经机器翻译的训练的过程就是不断最大化正确目标词的概率或对数概率,这里我们选择对数概率: p ( y t │ y < t , x ) = e x p { w t T ∅ ( y t − 1 , z t , c t ) + b t } ∑ k , y k ∈ V e x p ⁡ { w k T ∅ ( y t − 1 , z t , c t ) + b k } p(y_t │y_{p(yty<t,x)=k,ykVexp{wkT(yt1,zt,ct)+bk}exp{wtT(yt1,zt,ct)+bt}令: ε ( y j ) = w j T ∅ ( y t − 1 , z t , c t ) + b j ε(y_j )=w_j^T∅ (y_{t-1},z_t,c_t )+b_j ε(yj)=wjT(yt1,zt,ct)+bj,表示词汇表的第 i i i个词得到的非规范化概率分数,则: p ( y t │ y < t , x ) = e x p ⁡ ( ε ( y j ) ) ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) p(y_t │y_{p(yty<t,x)=k,ykVexp(ε(yk))exp(ε(yj))对数概率为: l o g p ( y t │ y < t , x ) = ε ( y j ) − l o g ⁡ ( ∑ k , y k ∈ V e x p ⁡ { ε ( y k ) } ) logp(y_t│y_{logp(yty<t,x)=ε(yj)log(k,ykVexp{ε(yk)})

  • 神经网络的优化是使用梯度下降法,那么我们就来计算一下对数概率的梯度: ∇ l o g p ( y t │ y < t , x ) = ∇ ε ( y t ) − 1 ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) ) ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) ∇ ε ( y k ) = ∇ ε ( y t ) − ∑ k , y k ∈ V p ( y k │ y < t , x ) ∇ ε ( y k ) ∇logp(y_t│y_{logp(yty<t,x)=ε(yt)k,ykVexp(ε(yk)))1k,ykVexp(ε(yk))ε(yk)=ε(yt)k,ykVp(yky<t,x)ε(yk)上式的第二项可以写成期望形式 ∑ k , y k ∈ V p ( y k │ y < t , x ) ∇ ε ( y k ) ∑ k , y k ∈ V P ( y k ) ∇ ε ( y k ) = E P [ ∇ ε ( y ) ] ∑_{k,y_k∈V}p(y_k │y_{k,ykVp(yky<t,x)ε(yk)k,ykVP(yk)ε(yk)=EP[ε(y)]其中: P P P p ( y ∣ y < t , x ) p(y|y_{p(yy<t,x)

  • 最终上式可以写作: ∇ l o g p ( y t │ y < t , x ) = ∇ ε ( y t ) − E P [ ∇ ε ( y ) ] ∇logp(y_t│y_{logp(yty<t,x)=ε(yt)EP[ε(y)]计算量主要落在 E P [ ∇ ε ( y ) ] E_P [∇ε(y)] EP[ε(y)]上,所以我们主要优化这个地方。

  • 通过重要性采样(mportance sampling) 来近视计算这个期望 E P [ ∇ ε ( y ) ] E_P [∇ε(y)] EP[ε(y)]

    • 首先我们预先给定一个概率分布 Q Q Q
    • 然后根据 Q Q Q对词汇表V进行采样得到词汇表V的一个子集 V ′ V' V
    • 然后用下面公式来近似计算 E P [ ∇ ε ( y ) ] : E_P [∇ε(y)]: EP[ε(y)] E P [ ∇ ε ( y ) ] ≈ ∑ k , y k ∈ V ′ θ k ∑ k ′ : y k ′ ∈ V ′ θ k ′ ∇ ε ( y k ) E_P [∇ε(y)]≈∑_{k,y_k∈V'}\frac{θ_k}{∑_{k':y_k'∈V'}θ_{k'} } ∇ε(y_k ) EP[ε(y)]k,ykVk:ykVθkθkε(yk)其中: θ k = e x p ⁡ { ε ( y k ) − l o g Q ( y k ) } θ_k=exp⁡\{ε(y_k )-logQ(y_k)\} θk=exp{ε(yk)logQ(yk)}
  • 重要性采样可以参考连接:蒙特卡洛积分和重要性采样

  • 论文中上面 E P [ ∇ ε ( y ) ] E_P [∇ε(y)] EP[ε(y)]近似公式是用了两次重要性采样才得到的论文中没有进行推导,这里我们简单推导一下:

    • 首先我们预先给定一个概率分布 Q Q Q

    • 然后根据 Q Q Q对词汇表V进行采样得到词汇表V的一个子集 V ′ V' V

    • 然后根据重要性采样公式我们得到: E P [ ∇ ε ( y ) ] ≈ 1 N ∑ k , y k ∈ V ′ P ( y k ) Q ( y k ) ∇ ε ( y k ) E_P [∇ε(y)]≈\frac{1}{N} ∑_{k,y_k∈V'}\frac{P(y_k)}{Q(y_k)} ∇ε(y_k ) EP[ε(y)]N1k,ykVQ(yk)P(yk)ε(yk)其中 P ( y k ) = p ( y k │ y < t , x ) = e x p ⁡ ( ε ( y k ) ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) P(y_k )=p(y_k│y_{P(yk)=p(yky<t,x)=k,ykVexp(ε(yk))exp(ε(yk)

    • 然而我们发现依然需要计算 P ( y k ) P(y_k) P(yk)依然需要计算归一化常量 Z Z Z,所以计算量没有下降。那么我们来分析一些分母这个 归一化因子 Z = ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) Z=∑_{k,y_k∈V}exp⁡(ε(y_k )) Z=k,ykVexp(ε(yk))将其进行配方变形: Z = M ∑ k , y k ∈ V 1 M e x p ⁡ ( ε ( y k ) ) Z=M∑_{k,y_k∈V}\frac{1}{M} exp⁡(ε(y_k )) Z=Mk,ykVM1exp(ε(yk)) M M M为词汇表的长度,这样可以将 1 M \frac{1}{M} M1视为概率分布,这样 Z Z Z可以写为: Z = M E I [ e x p ⁡ ( ε ( y k ) ) ] Z=ME_I [exp⁡(ε(y_k ))] Z=MEI[exp(ε(yk))]其中 I = 1 M I=\frac{1}{M} I=M1

    • 对这个数学期望我们同样可以用 Q Q Q分布重要性采样来估计该期望 E I [ e x p ⁡ ( ε ( y k ) ) ] ≈ 1 N ∑ k , y k ∈ V ′ 1 M Q ( y k ) e x p ⁡ ( ε ( y k ) ) E_I [exp⁡(ε(y_k )) ]≈\frac{1}{N} ∑_{k,y_k∈V'}\frac{1}{MQ(y_k)} exp⁡(ε(y_k )) EI[exp(ε(yk))]N1k,ykVMQ(yk)1exp(ε(yk))则归一化因子 Z Z Z的估计量为: Z = M E I [ e x p ⁡ ( ε ( y k ) ) ] ≈ M N ∑ k , y k ∈ V ′ 1 M Q ( y k ) e x p ⁡ ( ε ( y k ) ) = 1 N ∑ k , y k ∈ V ′ 1 Q ( y k ) e x p ⁡ ( ε ( y k ) ) Z=ME_I [exp⁡(ε(y_k )) ]≈\frac{M}{N}∑_{k,y_k∈V'}\frac{1}{MQ(y_k)} exp⁡(ε(y_k )) \\=\frac{1}{N} ∑_{k,y_k∈V'}\frac{1}{Q(y_k )} exp⁡(ε(y_k )) Z=MEI[exp(ε(yk))]NMk,ykVMQ(yk)1exp(ε(yk))=N1k,ykVQ(yk)1exp(ε(yk))

  • 将上面的推到合并,可以得到 E P [ ∇ ε ( y ) ] E_P [∇ε(y)] EP[ε(y)]的估值: E P [ ∇ ε ( y ) ] ≈ 1 N ∑ k , y k ∈ V ′ e x p ⁡ ( ε ( y k ) ∑ k , y k ∈ V e x p ⁡ ( ε ( y k ) ) 1 Q ( y k ) ∇ ε ( y k ) ≈ 1 N ∑ k , y k ∈ V ′ e x p ⁡ ( ε ( y k ) 1 N ∑ i , y i ∈ V ′ 1 Q ( y i ) e x p ⁡ ( ε ( y i ) ) 1 Q ( y k ) ∇ ε ( y k ) = ∑ k , y k ∈ V ′ e x p ⁡ ( ε ( y k ) ∑ i , y i ∈ V ′ 1 e x p ⁡ ( l o g ⁡ ( Q ( y i ) ) ) e x p ⁡ ( ε ( y i ) ) 1 e x p ⁡ ( l o g ⁡ ( Q ( y k ) ) ) ∇ ε ( y k ) = ∑ k , y k ∈ V ′ e x p ⁡ ( ε ( y k ) − l o g ⁡ ( Q ( y k ) ) ) ∑ i , y i ∈ V ′ e x p ⁡ ( ε ( y i ) − l o g ⁡ ( Q ( y i ) ) ) ∇ ε ( y k ) E_P [∇ε(y)]≈\frac{1}{N}∑_{k,y_k∈V'}\frac{exp⁡(ε(y_k )}{∑_{k,y_k∈V}exp⁡(ε(y_k )) } \frac{1}{Q(y_k)} ∇ε(y_k )\\≈\frac{1}{N} ∑_{k,y_k∈V'}\frac{exp⁡(ε(y_k )}{\frac{1}{N} ∑_{i,y_i∈V'}\frac{1}{Q(y_i )} exp⁡(ε(y_i )) } \frac{1}{Q(y_k)} ∇ε(y_k ) \\= ∑_{k,y_k∈V'}\frac{exp⁡(ε(y_k )}{ ∑_{i,y_i∈V'}\frac{1}{exp⁡(log⁡(Q(y_i )) )} exp⁡(ε(y_i )) } \frac{1}{exp⁡(log⁡(Q(y_k )) )} ∇ε(y_k )\\=∑_{k,y_k∈V'}\frac{exp⁡(ε(y_k )-log⁡(Q(y_k )) )}{∑_{i,y_i∈V'}exp⁡(ε(y_i )-log⁡(Q(y_i )) ) } ∇ε(y_k ) EP[ε(y)]N1k,ykVk,ykVexp(ε(yk))exp(ε(yk)Q(yk)1ε(yk)N1k,ykVN1i,yiVQ(yi)1exp(ε(yi))exp(ε(yk)Q(yk)1ε(yk)=k,ykVi,yiVexp(log(Q(yi)))1exp(ε(yi))exp(ε(yk)exp(log(Q(yk)))1ε(yk)=k,ykVi,yiVexp(ε(yi)log(Q(yi)))exp(ε(yk)log(Q(yk)))ε(yk) θ k = e x p ⁡ ( ε ( y k ) − l o g ⁡ ( Q ( y k ) ) ) θ_k=exp⁡(ε(y_k )-log⁡(Q(y_k )) ) θk=exp(ε(yk)log(Q(yk)))则: E P [ ∇ ε ( y ) ] ≈ ∑ k , y k ∈ V ′ θ k ∑ i , y i ∈ V ′ θ i ) ∇ ε ( y k ) E_P [∇ε(y)]≈∑_{k,y_k∈V'}\frac{θ_k}{∑_{i,y_i∈V'}θ_i )}∇ε(y_k ) EP[ε(y)]k,ykVi,yiVθi)θkε(yk)

  • 到此我们估计 E P [ ∇ ε ( y ) ] E_P [∇ε(y)] EP[ε(y)]只依赖采样集合 V ′ V' V,这样个减少计算的时间复杂度了。

  • 现在我们分析一下Sampling softmax的一些特性

    • 使用这种近似方法:训练的每一步只需要更新正确目标词的 w j w_j wj向量,和 V ′ V' V中词对应的 w i w_i wi向量。
    • 这种方法虽然减少了训练的时间复杂度但并没有减少空间复杂度,因为单纯的使用此方法我们始终要将softmax层的权值矩阵 W ∈ R ∣ V ∣ × d W∈R^{|V|×d} WRV×d( ∣ V ∣ |V| V是词汇表的大小)。这样对于内存有限的GPU上这个内存问题就会比较突出。
    • 为了解决内存不足问题,我们将训练语料库 C C C分词几个部分,并未每个部分建立词汇表 V ′ V' V:
      • 我们依次扫描语料库的每个目标句子,将目标词依次加入词汇表,当然词汇表没有重复的词,直到词汇表的大小达到上限 T T T,则停止扫描,形成一个语料库的子集 C i C_i Ci和其对应的词汇表 V i ′ V_i' Vi
      • 重复上面的过程,直到扫描完整个语料库,这样语料库被分成几个部分并形成个部分的词汇表。
    • 这个过程相当与我们为每个语料库的子集 C i C_i Ci,设置了一个采样分布 Q i Q_i Qi,并且满足下面公式: Q i ( y k ) = { 1 ∣ V i ′ ∣ , y t ∈ V i ′ 0 , 其他 Q_i (y_k )= \begin{cases} \frac{1}{|V_i'|}, &y_t∈V_i' \\ 0, & \text{其他} \end{cases} Qi(yk)={Vi1,0,ytVi其他这相当于将概率等价的分给词汇表子集 V i ′ V_i' Vi中的每个单词,而对 V i ′ V_i' Vi以外的单词分布0概率。
  • 整个过程可以简单的概述为(个人的理解)

    • 第一步:我们定义softmax层的参数矩阵 W ∈ R ( ∣ V ∣ × d ) W∈R^(|V|×d) WR(V×d)( ∣ V ∣ |V| V是词汇表的大小),每个行代表一个词,与embedding向量有点像。
    • 第二步:我们依次扫描语料库的每个目标句子,将目标词依次加入词汇表 V i ′ V_i' Vi中,当然词汇表没有重复的词,直到词汇表的大小达到上限 T T T,则停止扫描,形成一个语料库的子集 C i C_i Ci和其对应的词汇表 V i ′ V_i' Vi
    • 第三步:我们将 V i ′ V_i' Vi中词汇在矩阵 W ∈ R ( ∣ V ∣ × d ) W∈R^(|V|×d) WR(V×d)中对应的向量提取出来,形成新矩阵 W i ′ ∈ R ( ∣ V i ′ ∣ × d ) W_i'∈R^(|V_i'|×d) WiR(Vi×d), W i ′ W_i' Wi W W W是共享的,可以理解 W i ′ W_i' Wi W W W的一个视图。
    • 第四步:然后我们使用: C i C_i Ci V i ′ V_i' Vi W i ′ W_i' Wi进行训练。这时候的训练使用的full softmax层: p ( y t │ y < t , x ) = e x p { w t T ∅ ( y t − 1 , z t , c t ) + b t } ∑ k , y k ∈ V i ′ e x p ⁡ { w k T ∅ ( y t − 1 , z t , c t ) + b k } p(y_t │y_{p(yty<t,x)=k,ykViexp{wkT(yt1,zt,ct)+bk}exp{wtT(yt1,zt,ct)+bt}其中 w t T w_t^T wtT使用的是 W i ′ W_i' Wi中的行向量。
    • 第五步:重复上面第二步到第四步,直到语料库被扫描完,则完成一轮训练。
  • 机器翻译中softmax层的训练分析

    • 在机器翻译中输出层的softmax层主要的任务是将当前隐藏层状态向量 h t h_t ht转化为词汇表词汇概率。通过将词汇表中第 i i i个词对应的权重向量 w i w_i wi h t h_t ht进行乘积再经过归一化得到当前输出第 i i i个词的概率。
    • 经过训练后我们得到的是softmax的权重矩阵 W ∈ R ∣ V ∣ × d W∈R^{|V|×d} WRV×d( ∣ V ∣ |V| V是词汇表的长度, d d d是隐藏层状态向量 h t h_t ht的维度)。W每一行对应目标词汇表中的一个单词。
    • 在full softmax中训练的每一步都是:将正确的目标词对应的权重向量 w i w_i wi h t h_t ht方向移动,使得KaTeX parse error: Expected group after '_' at position 2: w_̲ h t h_t ht内积更大,从而使得对应概率更大;并且将词汇表中的其他词对应的权重向量 w j w_j wj向远离 h t h_t ht方向移动使得,得 w j w_j wj h t h_t ht内积更小,从而对应的概率更小,间接的使得正确词对应的概率更大。
    • 在论文中提出的sampling softmax中训练的每一步都是:也将正确的目标词对应的权重向量 w i w_i wi h t h_t ht方向移动,使得 w i w_i wi h t h_t ht内积更大,从而使得对应概率更大;并且将词汇表子集 V V V’中的其他词对应的权重向量 w j w_j wj向远离 h t h_t ht方向移动使得,得 w j w_j wj h t h_t ht内积更小,从而对应的概率更小,间接的使得正确词对应的概率更大。

你可能感兴趣的:(NLP,自然语言处理,深度学习)