NLP文本特征抽取器

NLP任务的特点:

输入不定长的一维线性序列(有序)

         因文本可能存在长距离特征,特征提取器能否具备长距离特征捕获能力这一点对于解决NLP任务来说也是很关键的。一个特征抽取器是否适配问题领域的特点,有时候决定了它的成败,而很多模型改进的方向,其实就是改造得使得它更匹配领域问题的特性

NLP四大类任务:

       NLP四大任务类型:分类、序列标注、文本匹配、文本生成。 

  1. 第二类是分类任务,比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分类类别即可。
  2. 一类是序列标注,这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。
  3. 第三类任务是文本匹配,比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系;
  4. 第四类是文本生成,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需要自主生成另外一段文字。 

        深度学习的优点是“端到端”,意思是以前研发人员得考虑设计抽取哪些特征,而端到端时代后,这些你完全不用管,把原始输入扔给好的特征抽取器,它自己会把有用的特征抽取出来。也就是说你需要做的是:选择一个好的特征抽取器,喂给它大量的训练数据,设定好优化目标(loss function),告诉它你想让它干嘛。那么特征抽取器的设计成为重中之重。

1. Bag-of-Words (BoW)

BoW (Bag of Words) 是一种常用的文本表示方法,用于将文本转换为数值向量。BoW 的基本思想是将文本看作是一个袋子(或集合)中的词语,忽略了词语之间的顺序和语法结构,只关注词语出现的频率。具体步骤如下:

  1. 构建词汇表:首先,将所有文本中出现的不重复词语构建成一个词汇表。

  2. 特征向量表示:对于每个文本样本,根据词汇表中的词语,在样本对应位置上标记该词语的出现次数或者使用其权重。

  3. 向量化表示:将特征向量矩阵作为文本的数值表示,即将每个文本样本映射为一个稀疏的数值向量。

使用 BoW 进行文本表示的优点包括:

  1. 简单直观:BoW 方法易于理解和实现,不需要考虑语法和词语顺序。

  2. 忽略无关信息:BoW 可以过滤掉一些无关的语法和词序信息,更关注于文本中词语的频率。

然而,BoW 方法也存在一些限制和缺点:

  1. 词序信息丢失:BoW 忽略了词语之间的顺序关系,因此无法捕捉到词语之间的上下文和语义信息。

  2. 高维稀疏向量:对于大型词汇表和大规模的文本数据集,BoW 表示会生成高维度的稀疏向量,导致计算和存储开销增加。

尽管 BoW 有一些限制,但它仍然是许多文本处理任务的基础方法,可以作为其他更复杂的文本表示方法的基础。

2. RNN

           

        上图可以看出, 每个输入对应隐层节点,而隐层节点之间形成了线性序列,信息由前向后在隐层之间逐步向后传递。

        一开始RNN采取线性序列结构不断从前往后收集输入信息,但是反向传播路径长容易导致梯度消失或梯度爆炸问题。为了解决这个问题,引入了LSTM和GRU模型,通过增加中间状态信息直接向后传播,以此缓解梯度消失问题,获得了很好的效果,于是很快LSTM和GRU成为RNN的标准模型。

        因为RNN的结构天然适配解决NLP的问题,NLP的输入往往是个不定长的线性序列句子,而RNN本身结构就是个可以接纳不定长输入的由前向后进行信息线性传导的网络结构,而在LSTM引入三个门后,对于捕获长距离特征也是非常有效的。所以RNN特别适合NLP这种线形序列应用场景,这是RNN为何在NLP界如此流行的根本原因。 

        RNN的缺点:隐藏层计算依赖两个输入,一个是句子输入的单词,一个是依赖于前一隐藏层状态的输出。也就是最后的结果需要按照时间步,一步一步的顺序计算,也就是序列依赖。正是因为序列依赖结构对并行计算不大友好,计算慢,很容易被快的后起之秀替代。

        CNN和Transformer就不存在这种序列依赖问题,可以并行计算。

2.3  word Embedding

和词袋模型不一的的词嵌入(word Embedding),如word2Vec 和GLoVe。

        核心函数P的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率),数值越大代表这越像一句人话。给你很多语料做这个事情,如何训练好一个神经网络,训练好之后,以后输入一句话的前面几个单词,要求这个网络输出后面紧跟的单词应该是哪个,你会怎么做?——神经网络语言模型(NNLM)。

 任意单词W用onehot编码作为原始输入,乘以矩阵Q后得向量C(W))(也就是单词对应的Word Embedding,Q行对应单词Word Embedding值,Q是需要学的)每个单词C(W)拼接,上接隐层,然后接softmax去预测后面应该后续接哪个单词。通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵Q,这就是单词的Word Embedding是被如何学会的。

2.3.1 Word2Vec

Word2Vec的网络结构和NNLM是基本类似 ,但是训练方法不一样。NNLM是输入一个单词的上文,去预测这个单词,就是看到上文预测下文,word embedding是副产品。

Word2Vec有两种训练方法,

  1.  CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词;
  2. Skip-gram,和CBOW正好反过来,输入某个单词,要求网络预测它的上下文单词。

但是Word2Vec目标不一样,它单纯就是要word embedding的,这是主产品,所以它完全可以随性地这么去训练网络。

Word Embedding这种做法是预训练过程,怎么说?

这个要看学会word embedding后下游任务怎么用它的。

在NNLM中,句子中每个单词以Onehot形式作为输入,然后乘以学好的Word Embedding矩阵Q,就直接取出单词对应的Word Embedding了。Q其实就是网络Onehot层到embedding层映射的网络参数矩阵。Word Embedding等价于把Onehot层到embedding层的网络用预训练好的参数矩阵Q初始化了。只是Word Embedding初始化第一层网络参数而已。这是18年之前NLP领域里面采用预训练的典型做法。Word Embedding对于很多下游NLP任务是有帮助的,只是效果没有那么好,为什么呢?

因为没有考虑多义词问题。

多义词对Word Embedding来说有什么负面影响?同一个词意思不同但是用相同的word embedding表示。比如多义词Bank,有两个常用含义,但是Word Embedding在对bank这个单词进行编码的时候,是区分不开这两个含义的,这导致两种不同的上下文信息都会编码到相同的word embedding空间里去。所以word embedding无法区分多义词的不同语义,这就是它的一个比较严重的问题。

虽然很多人提出了解决办法,但是成本高或者繁琐,而ELMO提供了一种简洁优雅的解决方案。

2.3.2 ELMO

在此之前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变。

ELMO的本质思想是:我事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,(混合了多种语义)。在实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。

 ELMO采用了典型的两阶段过程,

  • 第一个阶段是利用语言模型进行预训练;
  • 第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。

第一阶段预训练:

       如上图展示的是其预训练过程,它的网络结构采用了双层双向LSTM,目前语言模型训练的任务目标是根据单词 W的上下文去正确预测单词 W, W之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。

        左端双层LSTM是正向编码器,输入是预测W的的上文Context-before;右侧是逆向双层LSTM编码器,输入的是从右到左逆序句子下文Context-after。每个编码器的深度都是两层LSTM叠加。这个网络结构其实在NLP中是很常用的。使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子 Snew ,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构,而这两者后面都有用。

第二阶段:下游任务的使用

        上图展示了下游任务的使用过程,比如我们的下游任务是QA问题,此时对于问句X,输入预训练好的ELMO网络中,获得对应的三个Embedding,之后给予这三个Embedding中的每一个Embedding一个权重a,这个权重可以学习得来,根据各自权重累加求和,将三个Embedding整合成一个。然后将整合后的这个Embedding作为X句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。对于上图所示下游任务QA中的回答句子Y来说也是如此处理。因为ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。

        实验表明,任务覆盖范围比较广,包含句子语义关系判断,分类任务,阅读理解等多个领域,这说明其适用范围是非常广的,普适性强,这是一个非常好的优点。

那有什么缺点?

  • LSTM抽取特征能力远弱于Transformer。
  • 拼接方式双向特征融合能力偏弱。

        除了以ELMO为代表的这种基于特征融合的预训练方法外,NLP里还有一种典型做法,这种做法和图像领域的方式就是看上去一致的了,一般将这种方法称为“基于Fine-tuning的模式”,而GPT就是这一模式的典型开创者。

3 Transformer

3.1 GPT

 GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,

  • 第一个阶段是利用语言模型进行预训练。
  • 第二阶段通过Fine-tuning的模式解决下游任务。

其实和ELMO是类似的,主要不同在于两点:

  • 首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到过它的特征抽取能力要强于RNN,这个选择很明显是很明智的;RNN一直受困于其并行计算能力,这是因为它本身结构的序列性依赖导致的。CNN虽然易于做并行计算,速度快,但是在捕获NLP的序列关系尤其是长距离特征方面天然有缺陷,不是做不到而是做不好,虽然有很多改进模型,但是特别成功的不多。Transformer同时具备并行性好,又适合捕获长距离特征。
  • 其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。这个选择现在看不是个太好的选择,原因很简单,它没有把单词的下文融合进来,这限制了其在更多应用场景的效果,白白丢掉了很多信息。

        对于不同的下游任务来说,本来你可以任意设计自己的网络结构,现在不行了,你要向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决手头的问题。

        对于NLP各种花样的不同任务,怎么改造才能靠近GPT的网络结构呢?

        GPT论文给了一个改造施工图如上,其实也很简单:对于分类问题,不用怎么动,加上一个起始和终结符号即可;对于句子关系判断问题,比如Entailment,两个句子中间再加个分隔符即可;对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。从上图可看出,这种改造还是很方便的,不同任务只需要在输入部分施工即可。 

        GPT的效果是非常令人惊艳的,在12个任务里,9个达到了最好的效果,有些任务性能提升非常明显。

GPT缺点:

  1. 语言模型不是双向的
  2. 炒作能力弱

3.2 Bert

        Bert采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。所以这里Bert的预训练过程不必多讲了。 

        在第二阶段,Fine-Tuning阶段,这个阶段的做法和GPT是一样的。当然,它也面临着下游任务网络结构改造的问题,在改造任务方面Bert和GPT有些不同,下面简单介绍一下。     

​​​​​​ 

上图给出示例,

  • 对于句子关系类任务,很简单,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。
  • 对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;
  • 对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。

        从这里可以看出,上面列出的NLP四大任务里面,除了生成类任务外,Bert其它都覆盖到了,而且改造起来很简单直观。尽管Bert论文没有提,但是稍微动动脑子就可以想到,其实对于机器翻译或者文本摘要,聊天机器人这种生成式任务,同样可以稍作改造即可引入Bert的预训练成果。只需要附着在S2S结构上,encoder部分是个深度Transformer结构,decoder部分也是个深度Transformer结构。根据任务选择不同的预训练数据初始化encoder和decoder即可。这是相当直观的一种改造方法。当然,也可以更简单一点,比如直接在单个Transformer结构上加装隐层产生输出也是可以的。不论如何,从这里可以看出,NLP四大类任务都可以比较方便地改造成Bert能够接受的方式。这其实是Bert的非常大的优点,这意味着它几乎可以做任何NLP的下游任务,具备普适性,这是很强的。 

        Bert其实和ELMO及GPT存在千丝万缕的关系,比如如果我们把GPT预训练阶段换成双向语言模型,那么就得到了Bert;而如果我们把ELMO的特征抽取器换成Transformer,那么我们也会得到Bert。所以你可以看出:Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型。

        对于Transformer来说,怎么才能在这个结构上做双向语言模型任务呢?直接将LSTM换为Transformer?并不是。

        CBOW的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文Context-Before和下文Context-after去预测单词。其实Bert怎么做的?Bert就是这么做的。从这里可以看到方法间的继承关系。Bert作者说是受到完形填空任务的启发。所以Bert在模型方面其实没有太大创新,更像一个最近几年NLP重要技术的集大成者。

        那么Bert本身在模型和方法角度有什么创新呢?就是论文中指出的Masked 语言模型(细节有改变)和Next Sentence Prediction。

Masked 语言模型:随机选择语料中15%的单词,把它抠掉,也就是用[Mask]掩码代替原始单词,然后要求模型去正确预测被抠掉的单词。但是这里有个问题:训练过程大量看到[mask]标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对[mask]这个标记的,但是实际使用又见不到这个标记,这自然会有问题。为了避免这个问题,Bert改造了一下,15%的被上天选中要执行[mask]替身这项光荣任务的单词中,只有80%真正被替换成[mask]标记,10%被狸猫换太子随机替换成另外一个单词,10%情况这个单词还待在原地不做改动。这就是Masked双向语音模型的具体做法。

Next Sentence Prediction:指的是做语言模型预训练的时候,分两种情况选择两个句子,

  • 一种是选择语料中真正顺序相连的两个句子;
  • 另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。

我们要求模型除了做上述的Masked语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是Bert的一个创新。

        对比试验可以证明,跟GPT相比,双向语言模型起到了最主要的作用,对于那些需要看到下文的任务来说尤其如此。而预测下个句子来说对整体性能来说影响不算太大,跟具体任务关联度比较高。

总结:

  1. 首先是两阶段模型,第一阶段双向语言模型预训练,这里注意要用双向而不是单向,第二阶段采用具体任务Fine-tuning或者做特征集成;
  2. 第二是特征抽取要用Transformer作为特征提取器而不是RNN或者CNN;
  3. 第三,双向语言模型可以采取CBOW的方法去做(当然我觉得这个是个细节问题,不算太关键,前两个因素比较关键)。

Bert最大的亮点在于效果好及普适性强,几乎所有NLP任务都可以套用Bert这种两阶段解决思路,而且效果应该会有明显提升。可以预见的是,未来一段时间在NLP应用领域,Transformer将占据主导地位,而且这种两阶段预训练方法也会主导各种应用。

        预训练这个过程本质上是在做什么事情,本质上预训练是通过设计好一个网络结构来做语言模型任务,然后把大量甚至是无穷尽的无标注的自然语言文本利用起来,预训练任务把大量语言学知识抽取出来编码到网络结构中,当手头任务带有标注信息的数据有限时,这些先验的语言学特征当然会对手头任务有极大的特征补充作用,因为当数据有限的时候,很多语言学现象是覆盖不到的,泛化能力就弱,集成尽量通用的语言学知识自然会加强模型的泛化能力。如何引入先验的语言学知识其实一直是NLP尤其是深度学习场景下的NLP的主要目标之一,不过一直没有太好的解决办法,而ELMO/GPT/Bert的这种两阶段模式看起来无疑是解决这个问题自然又简洁的方法,这也是这些方法的主要价值所在。

3.3 RoBERTa

        原始的Bert模型是个未完成的半成品,而RoBERTa才是遵循Bert思路的完成品。RoBERTa看作是得到充分训练的Bert模型,这个微小差异,能够极大提升原始版本Bert模型的效果。RoBERT原始Bert模型的基础上,

  1. 进一步增加预训练数据数量,能够改善模型效果;
  2. 延长预训练时间或增加预训练步数,能够改善模型效果;
  3. 急剧放大预训练的每个Batch的Batch Size,能够明显改善模型效果;
  4. 拿掉预训练任务中的Next Sentence Prediction子任务,它不必要存在;( 影响不大)
  5. 输入文本的动态Masking策略有帮助;(影响不大)

为什么说RoBERTa是预训练模型中的强基准?

  1. 首先,尽管看上去RoBERTa也没做啥技术或者模型改进,只是把Bert模型训练得更充分了一些,但是,它的效果是非常好的。
  2. 其次,对于一个改进模型来说,理论上都应该引入RoBERTa作为对比Baseline,而改进模型的效果,如果不能具备说服力地超过RoBERTa的话,那么这种改进的有效性,多少是成问题的,除非你强调改进模型的优势不在效果好,而在其它方面,比如更小更快等。
  3. 再次,后续的改进预训练模型,从策略角度讲,应该在设计之初,就站在RoBERTa的巨人肩膀上,就是说在增加一定数据量的前提下,增大Batch Size,加长预训练时间,让模型得到充分训练。因为,如果你不这么做,大概率你的效果是很难比过RoBERTa的,而目前我们能够见到的效果很突出的模型,你如果细究,会发现其实都已经引入了RoBERTa的关键要素了。

        目前的主流模型大都采用Transformer作为特征抽取器,但是怎么用它搭建模型结构学习效率更高?这是一个问题。所谓学习效率高,就是给定相同大小规模的训练数据,它能编码更多的知识到模型里,这就意味着它的学习效率更高。不同Transformer用法,会产生不同的模型结构,就会导致不同结构的差异化的学习效率。关于模型结构的现有研究结论,会介绍常见的五种模型结构,一般还包含自监督的学习方法,常见的学习方法包括AutoEncoding(简称AE)和AutoRegressive(简称AR)。AE即我们常说的双向语言模型,而AR则代表从左到右的单向语言模型。

4 . CNN 

        最早将CNN引入NLP的是Kim在2014年做的工作,论文和网络结构参考上图。 

        卷积层本质上是个特征抽取层,可以设定超参数F来指定卷积层包含多少个卷积核(Filter)。对于某个Filter来说,可以想象有一个d*k大小的移动窗口从输入矩阵的第一个字开始不断往后移动,其中k是Filter指定的窗口大小,d是Word Embedding长度。对于某个时刻的窗口,通过神经网络的非线性变换,将这个窗口内的输入值转换为某个特征值,随着窗口不断往后移动,这个Filter对应的特征值不断产生,形成这个Filter的特征向量。这就是卷积核抽取特征的过程。卷积层内每个Filter都如此操作,就形成了不同的特征序列。Pooling 层则对Filter的特征进行降维操作,形成最终的特征。一般在Pooling层之后连接全联接层神经网络,形成最后的分类过程。

这就是最早应用在NLP领域CNN模型的工作机制,用来解决NLP中的句子分类任务,看起来还是很简洁的,之后陆续出现了在此基础上的改进模型。但是CNN在NLP的领域,不如RNN。这说明这个版本的CNN还是有很多问题的,其实最根本的症结主要是到了新环境没有针对新环境的特性做出针对性的改变,所以面临水土不服的问题。

问题:关键在于卷积核覆盖的那个滑动窗口,CNN能捕获到的特征基本都体现在这个滑动窗口里了,它捕获到的是单词的k-gram片段信息,k的大小决定了能捕获多远距离的特征。对此很多人对此进行改进。目前NLP主流的CNN是什么样的呢?

        通常由1-D卷积层来叠加深度,使用Skip Connection来辅助优化,也可以引入Dilated CNN等手段。 

参考文章:

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 - 知乎

乘风破浪的PTM:两年来预训练模型的技术进展 - 知乎

放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较 - 知乎

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值