zoukankan      html  css  js  c++  java
  • NLP中的预训练技术

    关于NLP领域内预训练的一些知识。记得很杂乱,主要用于个人理解,精华内容在学习资料。

    一. 学习资料

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

    nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    神经网络语言模型

    二. NLP里的预训练

    预训练是通过设计好一个网络结构来做语言模型任务,然后把大量甚至是无穷尽的无标注的自然语言文本利用起来,预训练任务把大量语言学知识抽取出来编码到网络结构中,当手头任务带有标注信息的数据有限时,这些先验的语言学特征当然会对手头任务有极大的特征补充作用,因为当数据有限的时候,很多语言学现象是覆盖不到的,泛化能力就弱,集成尽量通用的语言学知识自然会加强模型的泛化能力。

    语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,如果你能把单词放到正确的上下文中去,才说明你掌握了它的意义。

    这是现代统计自然语言处理最成功的思想之一。

    为什么预训练模型有用

    • 底层特征的可复用性

    • 之后再fine-tuning的目的:与当前任务更具相关性。

    三. 阶段1 one-hot

    离散表示

    存在的问题:

    • 丢失了语言学的韵味。比如这些同义词的意思实际上还是有微妙的差别:adept, expert, good, practiced, proficient, skillful不能表达单词的细微差别
    • 不能包括最新的词汇
    • 主观化
    • 需要耗费大量人力去整理
    • 不能准确计算词汇之间的相似度

    one-hot

    无论是规则学派,还是统计学派,过去都用独热码来表示词语。词语只是词表长度的one-hot向量,这是一种localist representation(大概是借用localist“局部”的意项)。

    在不同的语料中,词表大小不同。Google的1TB语料词汇量是1300万,这个向量的确太长了。

    缺点:根据词表大小来定义向量。高纬稀疏向量,且单词之间没有任何关系,独立存在,不符合文本需求。

    四. 阶段2 word-embedding

    1. 语言模型

    语言模型:预测一个句子出现的概率。

    最开始用的是n-gram模型,虽然利用了马尔可夫假设但仍然会有许多句子的概率为0,又采取了各种smooth平滑策略,但是效果终究不是很好。NNLM是用神经网络建立的语言模型。

    2. NNML

    神经网络语言模型

    同样是求(P(X_n|X_1^{n-1})) ,NNML通过输入一段文本,预测下一个单词的方式来建立模型。

    NNLM过程:

    1. 统计所有word个数为V。将所有word用one-hot表示,维度为|V|
    2. 输入的文本单词乘矩阵(|V|*m),得到维度大小1*m,将所有单词concat成(n-1)m,将这个输入到隐藏层(tanh),最后再输入到输出层(softmax)

    在做语言模型任务时,用NNML意外得到了word embedding层,可以将原来的one-hot向量表示成低纬稠密向量,而且向量能表示单词之间的关系。(同义词向量空间距离近)

    最关键的就是利用训练语言模型得到了学习word embedding层的参数矩阵Q,Word Embedding矩阵Q是网络Onehot层到embedding层映射的网络参数矩阵。

    3. word2vec

    NNLM的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,而word embedding只是无心插柳的一个副产品。但是Word2Vec目标不一样,它单纯就是要word embedding的,这是主产品,所以它完全可以随性地这么去训练网络。所以它专门通过做语言模型任务为了得到embedding,具体有下面两种训练模型:

    CBOW

    • 核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词。即给上下文,预测中间的一个单词的语言模型任务。

    Skip-gram

    输入某个单词,要求网络预测它的上下文单词的语言模型任务。

    4. GloVE

    五. 阶段3:基于特征融合的预训练

    这种预训练本质上和图像领域的预训练有区别

    ELMO

    论文:‘Deep contextualized word representation’

    通过双层LSTM提取三种embedding特征,加权和得到最终的embedding给其他任务。

    优点:解决了之前多义词的问题

    缺点:LSTM特征抽取能力弱

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

    六. 阶段4 基于Fine-tuning的模式

    基于fine-tune的模式就是典型的两阶段的迁移学习在nlp领域的应用,首先用过预训练将提取出重要的语言学特征,之后将预训练模型应用到下游任务中去。

    两阶段模型:超大规模预训练+具体任务Fine-tuning

    GPT

    论文:Improving Language understanding by Generative Pre-Training

    第一阶段和ELMO不同点:

    1. 使用Transformer
    2. 单向而非双向

    预训练在第一阶段是单向还是双向取决于它训练语言模型使用的方式。GPT是通过输入一段文本预测下一个word所以是单向;而BERT通过类似MLM这种完形填空式的训练方法就是双向。

    第二阶段:向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了。与图像领域里的预训练一样

    缺点:不是双向

    BERT

    双向+Tranformer

    Bert采用和GPT完全相同的两阶段模型。第一阶段是双向语言模型预训练,第二阶段使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。

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

    XLNet、RoBERTa、ALBert、Google T5

  • 相关阅读:
    JS 实现的年月日三级联动
    【代码总结● Swing中的一些操作与设置】
    S7通信协议之你不知道的事儿
    .NetCore程序在Linux上面部署的实现
    什么是哈希表?
    什么是队列?
    什么是栈?
    什么是数组?
    什么是数据结构?
    什么是链表?
  • 原文地址:https://www.cnblogs.com/z1xiang/p/12679994.html
Copyright © 2011-2022 走看看