Semi-Supervised Sequence Modeling with Cross-View Training

参考链接

  • 论文链接:https://arxiv.org/abs/1809.08370
  • 代码链接:https://github.com/tensorflow/models/tree/master/research/cvt_text

一、概述:

  • 注意: 下面所说的 “表示” 可以简单理解为embeding(词向量)
  • 无监督表示(representation learning)学习算法(如 word2vec 和 ELMo)可以提升很多监督式 NLP 模型的准确率,主要原因在于它们可以利用大量无标注文本。在神经自然语言处理任务中广泛成功使用的一种半监督学习策略就是预训练词向量。近期的研究将Bi-LSTM 句子编码器进行语言模型预训练,然后将其输出的“表示”加入到特殊任务的监督模型中。这种预训练方法先在大型无标注数据语料库上进行无监督“表示”学习,然后再进行监督训练。
  • 预训练的一个重要缺陷在于“表示”(embeding)学习阶段无法利用标注数据,这样预训练模型尝试学习通用“表示”而不是针对特定任务的“表示”。以前的半监督学习算法(如自训练(self-training)算法)没有这个问题,因为它们在标注和无标注数据上连续学习一项任务。自训练算法曾对 NLP非常有效,但该方法较少用于神经模型。
  • 自训练(self-training)算法:它的训练数据是有标签和没有标签数据的混合数据,在有标签的数据上模型进行正常的学习,在没有标签的数据上,模型先对数据进行预测以得到标签,再在这个数据上进行监督学习。尽管该过程对一些任务有价值,但它略显累赘(tautological)(应该是过拟合的意思)。近期的计算机视觉研究解决了这个问题,方法是:在没有标签的数据上进行监督学习是向输入添加噪声,训练一个对输入扰动足够鲁棒的模型。但是,使用噪声对离散输入(如文本)比较困难。
  • CVT算法:算法的大部分是与自训练(self-training)算法是一样的,不同的是:在没有标签的数据训练的第二步(即进行监督训练)时,CVT算法不是直接用模型本身进行监督训练,而是向模型添加辅助预测模块(将向量“表示”转换成预测的神经网络),用辅助预测模块来进行这一步监督学习,并且辅助预测模块的输入不是整个模型的输入而是整个模型输入的一个子集,这相当于进行了一个dropout。模型图如下:
    Semi-Supervised Sequence Modeling with Cross-View Training_第1张图片
    上图是标准的模型本身(也可以说时自训练模型):一个BiLSTM模块+一个主要预测模块 组成,主要预测模块根据具体任务的不同而不同。
    Semi-Supervised Sequence Modeling with Cross-View Training_第2张图片
    上图是CVT算法模型图,一个主要预测模块加上多个辅助预测模块,在没有标签是的数据上训练时用辅助预测模块的输出去拟合标准预测模块的输出,并且编码器部分是共享的,每个预测模块的输入时不同的,主要预测模块时完整的输入,辅助预测模块的输入是完整输入的子集。
  • CVT的作用在于改善模型的“表示”学习。辅助预测模块可以从主要预测模块的预测中进行学习,因为主要预测模块具备更好、视角不受限的输入。尽管辅助模块的输入的是受限的输入样本,但经过训练它们仍然能够学习作出主要预测模块的预测,因此能够改进“表示”的质量。这反过来改善了整个模型,因为它们共享encoder。

二、模型架构

  • D l = { ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . , ( x N , y N ) } D_l=\{(x_1,y_1),(x_2,y_2)...,(x_N,y_N)\} Dl={(x1,y1),(x2,y2)...,(xN,yN)}表示有标签的数据集; D u l = { x 1 , x 2 , . . . , x M } D_{ul}=\{x_1,x_2,...,x_M\} Dul={x1,x2,...,xM}表示有无标签的数据集; P θ ( y ∣ x i ) P_θ (y|x_i) Pθ(yxi)表示表示模型输入 x i x_i xi的输出分布;
  • CTV(Cross-View Training)训练期间是:轮流的输入有标签的数据集中的batch和没有标签的数据集中的batch进行训练,
  • 对于有标签的输入数据batch CTV使用标准的交叉熵损失: L s u p ( θ ) = 1 ∣ D l ∣ ∑ x i , y i ∈ D l C E ( y i , P θ ( y ∣ x i ) ) L_{sup}(θ)=\frac{1}{|D_{l}|}∑_{x_i,y_i∈D_l}CE(y_i,P_θ (y|x_i)) Lsup(θ)=Dl1xi,yiDlCE(yi,Pθ(yxi))
  • 当CTV训练在没有标签的数据集上时,论文向CTV添加K个辅助预测模块;辅助模型通常是一个简单的神经网络(例如:全连接层+sotfmax层);辅助预测模块将中间“表示” h j ( x i ) h^j (x_i) hj(xi)作为输入,这个中间“表示”可能是encoder(Bi-LSTM model)中一个LSTMs的输出。辅助模块的输出分布为: P θ j ( y ∣ x i ) ; h j ( x i ) P_θ^j (y|x_i);h^j (x_i) Pθj(yxi)hj(xi)表示的是部分 x i x_i xi信息, h j ( x i ) h^j (x_i) hj(xi)选择可能依赖于具体的特殊模型。辅助预测模块只在训练时使用,在测试/验证的时候只使用主要的预测模块
  • 模型的结构图:
    Semi-Supervised Sequence Modeling with Cross-View Training_第3张图片
    在没有标签的数据集上,训练辅助预测模块(输入不同的input视图)以与主要预测模块输出一致。上图展现的时一个命名实体识别的特殊例子:从有标签的示例中,模型可以学到“Washington”通常指的是一个地点。然后,在没有标签的数据上,训练辅助预测模块在mask掉部分输入信息的情况下得到相同的预测。 这样可以改进模型产生的上下文表示(contextual representations),例如:“traveled to”的后面通常后跟一个地点。
  • 在没有标签的数据集上训练时:首先,是通过主要预测模块得到soft targets p θ ( y │ x i ) p_θ (y│x_i ) pθ(yxi)(输出的标签分布),再通过最小化下面公式来训练辅助预测模块使他们的输出匹配主要预测模块的输出,再这个过程中 p θ ( y │ x i ) p_θ (y│x_i ) pθ(yxi)是固定的,即反向传播不经过主要预测模块。 L C V T ( θ ) = 1 ∣ D u l ∣ ∑ x i ∈ D u l ∑ j = 1 k D ( p θ ( y ∣ x i ) , p θ j ( y ∣ x i ) ) L_{CVT}(θ)=\frac{1}{|D_{ul}|} ∑_{x_i∈D_{ul}}∑_{j=1}^kD(p_θ (y|x_i),p_θ^j (y|x_i)) LCVT(θ)=Dul1xiDulj=1kD(pθ(yxi),pθj(yxi))
  • 合并两个loss得到下面公式: L = L s u p + L C T V L=L_{sup}+L_{CTV} L=Lsup+LCTV
  • 通过在共享的Bi-LSTM编码器之上为其他任务添加额外的预测模块,CVT可以轻松地与多任务学习相结合。训练过程是有标签的batch和没有标签的batch交叉进行,再训练有标签的batch是我们最小化 L s u p L_{sup} Lsup,再训练没有标签的batch时我分为两部,第一步时通过主要预测模块生成预测,第二步将辅助模块根据前一步预测进行训练。
  • 多任务CTV模型:
    • 一个样本有多个任务标签对于要学习的多任务系统是很有用的,但大多数数据集仅有一个任务的标签。
    • 一个对多任务CTV有效的方法是:就是用主要预测模块为没有标签的数据创建所有任务的标签。这提高了模型的数据效率同时也减少了训练时间。

三、模型训练(Cross-View Training Models)

1、编码器:Bi-LSTM Sentence Encoder

  • 我们的任务使用两层的CNN-BiLSTM作为句子编码器。它的输入是一个词序列 x i = [ x i 1 , x i 2 , . . . , x i T ] x_i=[x_i^1 ,x_i^2,...,x_i^T] xi=[xi1,xi2,...,xiT],首先每个词被表示为:embedding向量和character-level Convolutional Neural Network的输出和,最后得到: v = [ v 1 , v 2 , . . . , v T ] v=[v^1,v^2,...,v^T] v=[v1,v2,...,vT],然后将 v v v输入到两层的双向的LSTM。
  • 第一层双向的LSTM的输入是向量v,输出: [ h 1 1 → h 1 2 → , … … , h 1 T → ] [\overrightarrow{h_1^1} \overrightarrow{h_1^2 },……,\overrightarrow{h_1^T} ] [h11 h12 ,,h1T ] [ h 1 1 ← , h 1 2 ← , … … , h 1 T ← ] [\overleftarrow{h_1^1},\overleftarrow{h_1^2},……,\overleftarrow{h_1^T} ] [h11 ,h12 ,,h1T ],再拼接两个向量得到: h 1 = [ h 1 1 → ⊕ h 1 1 ← , h 1 2 → ⊕ h 1 2 ← , … … , h 1 T → ⊕ h 1 T ← ] h_1=[\overrightarrow{h_1^1} ⊕\overleftarrow{h_1^1},\overrightarrow{h_1^2} ⊕\overleftarrow{h_1^2},……,\overrightarrow{h_1^T} ⊕\overleftarrow{h_1^T}] h1=[h11 h11 ,h12 h12 ,,h1T h1T ]
  • 第二层的LSTM的输入是 h 1 h_1 h1,过程与第一层一样,最后输出: h 2 = [ h 2 1 → ⊕ h 2 1 ← , h 2 2 → ⊕ h 2 2 ← , … … , h 2 T → ⊕ h 2 T ← ] h_2=[\overrightarrow{h_2^1} ⊕\overleftarrow{h_2^1},\overrightarrow{h_2^2} ⊕\overleftarrow{h_2^2},……,\overrightarrow{h_2^T} ⊕\overleftarrow{h_2^T}] h2=[h21 h21 ,h22 h22 ,,h2T h2T ]

2、序列标注任务: CVT for Sequence Tagging

  • 对于序列标注任务,每一个词(token) x i t x_i^t xit都有一个相关的标签 y i t y_i^t yit
  • 主要预测模块的计算过程如下: p ( y t ∣ x i ) = N N ( h 1 t ⊕ h 2 t ) = s o f t m a x ( U ⋅ R e L U ( W ( h 1 t ⊕ h 2 t ) ) + b ) p(y^t |x_i)=NN(h_1^t⊕h_2^t)=softmax(U·ReLU(W(h_1^t⊕h_2^t))+b) p(ytxi)=NN(h1th2t)=softmax(UReLU(W(h1th2t))+b)
  • 辅助的预测模块的计算过程:一共有四个辅助预测模型: p θ f w d ( y t ∣ x i ) = N N f w d ( h ← 1 t ( x i ) ) p_θ^{fwd} (y^t |x_i)= NN^{fwd}(\overleftarrow {h}_1^t (x_i)) pθfwd(ytxi)=NNfwd(h 1t(xi)) p θ b w d ( y t ∣ x i ) = N N b w d ( h → 1 t ( x i ) ) p_θ^{bwd}(y^t |x_i) =NN^{bwd}(\overrightarrow{h}_1^t (x_i)) pθbwd(ytxi)=NNbwd(h 1t(xi)) p θ f u t u r e ( y t ∣ x i ) = N N f u t u r e ( h → 1 t − 1 ( x i ) ) p_θ^{future}(y^t |x_i) = NN^{future}(\overrightarrow{h}_1^{t-1} (x_i)) pθfuture(ytxi)=NNfuture(h 1t1(xi)) p θ p a s ( y t ∣ x i ) = N N p a s ( h ← 1 t + 1 ( x i ) ) p_θ^{pas}(y^t |x_i) = NN^pas(\overleftarrow{h}_1^{t+1} (x_i)) pθpas(ytxi)=NNpas(h 1t+1(xi))
  • 模型图:
    Semi-Supervised Sequence Modeling with Cross-View Training_第4张图片

4、Sequence-to-Sequence Learning

  • 论文使用encoder-decoder sequence-to-sequencemodel with attention
  • 样本组成: ( i n p u t : x i = x i 1 , . . . , x i T , o u t p u t : y i = y i 1 , . . . , y i K ) (input:x_i = x_i^1,...,x_i^T,output:y_i=y_i^1,...,y_i^K) (input:xi=xi1,...,xiT,output:yi=yi1,...,yiK)
  • 这里使用LSTM作为decoder来进行预测,其中decoder使用的是bilinear attention mechanism,解码器在时刻t的计算过程如下:
    • 第一步:计算attention的分数: α j ∝ e h j W α h ^ t α_j∝e^{h^j W_α \hat{h}^t } αjehjWαh^t,其中 h ^ t \hat{h}^t h^t是decoder当前隐藏层的状态; h j h^j hj是encoder第 j j j个位置的输出。
    • 第二步:计算上下文向量: C t = ∑ j α j h j C_t=\sum_{j}α_j h^j Ct=jαjhj
    • 第三步:将上下文向量和隐藏层状态拼接合并到attention向量中 a t = t a n h ⁡ ( W a [ c t , h t ] ) a_t=tanh⁡(W_a [c_t,h_t]) at=tanh(Wa[ct,ht])
    • 第四步:经过一个softmax层进行预测: p ( y i t ∣ y i < t , x i ) = s o f t m a x ( W s a t ) p(y_i^t |y_i^{<t},x_i)=softmax(W_s a_t) p(yityi<t,xi)=softmax(Wsat)
  • 添加两个辅助预测模块:
    • 首先,辅助预测模块于主要预测模块共享:embeding(即编码器)和decoder中LSTM参数,不共享的参数是:attention机制参数和softmax层参数。
    • 第一个辅助预测模块,论文中对attention分数进行dropout操作。
    • 第二个辅助预测模块,这个模块被训练来预测目标(输出序列)的下一个词而不是当前词: p θ f u t u r e ( y i t ∣ y i < t , x i ) = s o f t m a x ( W s f u t u r e a t − 1 ( f u t u r e ) ) p_θ^{future}(y_i^t |y_i^{<t},x_i)=softmax(W_s^{future}a_{t-1}^(future )) pθfuture(yityi<t,xi)=softmax(Wsfutureat1(future))
  • 由上面的描述,我得到了一个信息,输出不是一次性得到的,而是经过多次解码得到的,而每次解码需要使用目标(targe)序列上的上一个词作为当前解码器的输入。在没有标签的数据集上没有目标序列,无法进行逐一解码操作,为了解决这个问题,我们先用主要的预测模块加上波束搜索(beam search)为没有目标序列的数据预测出目标(hard targets)序列。

四、相对熵(KL divergence)

  • 计算公式: K L ( y ∣ ∣ y ^ ) = ∑ i y i l o g ( 1 y ^ i ) − ∑ i y i l o g ( 1 y i ) = ∑ i y i l o g ( y i y ^ i ) KL(y||\hat{y})=∑_i y_i log(\frac{1}{\hat{y}_i}) -∑_i y_i log(\frac{1}{y_i} )=∑_i y_i log(\frac{y_i}{\hat{y}_i}) KL(yy^)=iyilog(y^i1)iyilog(yi1)=iyilog(y^iyi)
  • 相对熵越接近0,也就是分布 y ^ \hat{y} y^越接近 y y y

你可能感兴趣的:(NLP模型)