5 Star 13 Fork 7

liuyaox / roadmap_nlp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
07-Pretrained_Model.md 37.60 KB
一键复制 编辑 原始数据 按行查看 历史
liuyaox 提交于 2020-09-13 16:43 . update

7. Pretrained Model

7.1 Overview

Github

Paper

Article

  • 8 Excellent Pretrained Models to get you Started with NLP - 2019

    包括:ULMFiT, Transformer, BERT, Transformer-XL, GPT-2, ELMo, Flair, StanfordNLP

    Chinese8种优秀预训练模型大盘点,NLP应用so easy!

  • Generalized Language Models - 2019

    包括:CoVe, ELMo, Croww-View Training, ULMFiT, GPT, BERT, GPT-2

    Chinese上下文预训练模型最全整理:原理、应用、开源代码、数据分享

  • Language Models and Contextualised Word Embeddings - 2018

    对 ELMo, BERT 及其他模型进行了一个简单的综述

  • 【Great】从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 - 张俊林 - 2018

    YAO: OK

    NLP里面做预训练一般的选择是用语言模型任务来做;预训练+Finetuning将成为NLP领域的流行方法;

    Word2Vec

    Word Embedding作为预训练过程的方式:Embedding矩阵是网络的Onehot层到Embedding层映射的初始化参数矩阵,初始化后可以Frozen OR Finetuning

    这是2018年之前NLP预训练的典型做法,但Word Embedding有一个致命缺点:多义词问题,Word Embedding是静态的,无法区分多义词的不同语义。直接解决这个问题比较成本太高或太繁,从而催生了更简洁优雅的解决方案:ELMo

    ELMo

    解决多义词问题的理念:事先用语言模型学好单词Bank的Embedding,是静态的,也无法区分多义性,但随后在实际使用时,单词Bank具备了特定的上下文,这时再根据上下文去调整Bank的Embedding。ELMO本质思想是:根据上下文对Embedding动态调整

    预训练阶段:输入原始静态Embedding,通过多层编码器学习一个通用语言模型,ELMo预训练好的是各层编码器的参数,或者说是一个通用语言模型

    TODO: 每层编码器是两层RNN,对应一个Embedding?还是说两层RNN对应两个Embedding?

    使用阶段:输入1个句子,对于句子中的1个单词,每层编码器都会输出1个动态的Embedding,再结合下游任务学习权重,把各层的Embedding加权整合为一个,就是下游任务中该单词的Embedding,所以ELMo代表的是一种基于特征融合的预训练方法。由于ELMo给下游提供的是每个单词的特征形式,所以这一类预训练方法被称为Feature-based Pre-Training。

    TODO: 补充特征?Embedding加权整合为一个后,还需要再加上原始静态的Embedding吗?

    尧:形象来说,预训练模型朝上竖着站立,ELMo是横着各层给右侧的下游任务;而Bert和GPT是上面最后一层给上面的下游任务。???

    对比Bert和GPT,ELMo的缺点有:RNN/LSTM抽取特征的能力远远弱于Transformer;双向拼接这种特征融合能力可能弱于Bert那种一体化的特征融合方式(只是推断,没有实验证明)。

    GPT

    预训练阶段:与ELMo比,有2点不同:一是使用Transformer(的Decoders)来替代RNN进行特征抽取;二是语言模型是单向的,即只使用上文来预测下一单词,并未使用下文,这一点并不明智。

    使用阶段:对于不同的下游任务,要把任务的网络结构改造成和GPT一样的网络结构,然后使用预训练阶段学到的参数去初始化这个网络结构,这样通过预训练学到的语言知识就引入到下游任务中了。另外,这个网络结构可以Finetuning。这种模式与图像领域使用预训练的模式是一样的:先构建一样的结构,然后加载预训练好的参数

    任务结构改造的重点其实只需要修改输入的形式,GPT论文里有详细说明,比如:

    • 文本分类:Text --> START + Text + EXTRACT

    • 文本推断:Premise + Hypothesis --> START + Premise + DELIM + Hypothesis + EXTRACT

    • 文本相似:Text1 + Text2 --> (START + Text1 + DELIM + Text2), (START + Text2 + DELIM + Text1)

    • 多项选择:Context + Answer1 + Answer2 + Answer3 --> (START + Context + DELIM + Answer1 + EXTRACT), (START + Context + DELIM + Answer2 + EXTRACT), (START + Context + DELIM + Answer3 + EXTRACT)

    GPT缺点:语言模型是单向而非双向的

    BERT

    特征提取,ELMo使用的是RNN,GPT使用的是Transformer的Decoders(Masked SelfAttention,单向),而BERT使用的是Transformer的Encoders(SelfAttention,双向),数据规模要比GPT大。BERT其实并没太大创新,更像是一个最近几年NLP重要技术的集大成者。

    ELMo + 特征提取由RNN改成Transformer --> BERT

    GPT + 语言模型由单向改成双向 --> BERT

    预训练阶段:受完型填空任务的启发,BERT用上下文去预测中间的单词,即Masked LM,本质思想与CBOW类似;另外还有一个Next Sentence Prediction,句子连续性预测。

    • Masked LM:随机选择语料中15%的单词,这些单词,有80%被Mask标记,10%随机替换成另外一个单词,10%保持不变,训练任务是基于上下文预测这个单词

    • Next Sentence Prediction: 句子级负采样,即从语料库中选两个句子A和B构成一条样本,50%的时候B的确取自A的后面,是A的Next Sentence,另外50%的时候B是从语料库中随机选择的,训练任务是判断B是否是A的Next Sentence (因此BERT可以直接得出一个整句的Embedding表示)

    这2种训练方法一起做,是个多任务过程,因为NLP很多任务是句子关系判断任务,单词粒度的数据训练不到句子粒度,增加第2个任务有助于下游的句子关系任务。样本数据示例如下:

    Input = '[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]'
    Label = IsNext
    
    Input = '[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight birds [SEP]'
    Label = NotNext

    输入部分是个线性序列,两个句子通过[SEP]分割,最前面加个[CLS],最后面加个[SEP],句子中每个单词有3种Embedding,它们叠加后是BERT的输入:

    • Token Embeddings: 单词Toekn原始的静态Embedding

    • Sentence Embeddings: 样本中有2个句子,每个句子都有个整体的Embedding,然后对应给每个单词,[CLS]跟随第1个句子,[SEP]跟随它前面那个句子

    • Position Embeddings: 位置Embedding,同Transformer

    keras_bert源码里前2个分别被称为Input-Token, Input-Segment, 第3个没有Input,直接在后面与前2个结合,结合方法有三种:ADD, CONCAT, EXPAND,详见HERE

    TODO:Input-Masked另有它用,是MLM的Input的Mask?还有一个Input-Task?

    def get_inputs(seq_len):
        """Get input layers.  :param seq_len: Length of the sequence or None."""
        names = ['Token', 'Segment', 'Masked']
        return [keras.layers.Input(shape=(seq_len, ), name='Input-%s' % name) for name in names]

    有效因子分析:与GPT相比,双向语言模型起最主要作用,尤其对于那些需要看到下文的任务,而NSP(Next Sentence Prediction)对整体性能影响不算大,跟具体任务关联度比较高。

    使用阶段:与GPT类似,也需要改造下游任务的网络结构(输入输出形式),详情参考下面的"李宏毅-ELMO、BERT、GPT视频笔记"。BERT普适性很强,几乎可以做任何NLP下游任务。

    归纳来说,BERT的特点如下:

    • 两阶段模型:阶段1是双向语言模型预训练,阶段2是具体任务Finetuning或做特征集成

    • 特征抽取:使用Transformer而非RNN/CNN

    • 双向语言模型:采用CBOW那样的方法去做

    预训练的本质:设计一个网络结构来做语言模型任务,然后用大量的无标注语料预训练这个语言模型,从而把大量语言学知识抽取出来编码到网络结构中,作为各种下游任务的先验知识。

  • NLP's ImageNet moment has arrived - 2018

    词嵌入已死,语言模型当立

  • nlp中的预训练语言模型总结(单向模型、BERT系列模型、XLNet) - 2019

  • NLP的游戏规则从此改写?从word2vec, ELMo到BERT - 2018

  • 就最近看的paper谈谈预训练语言模型发展 - 2019

  • 李宏毅-ELMO、BERT、GPT视频笔记 - 2019

    Video: https://www.bilibili.com/video/av46561029/?p=61

    YAO: OK

    Onehot Vector --> Word Embedding --> Contextualized Word Embedding

    ELMo - Embeddings from Language Models

    属于RNN-based Language Models范畴

    训练方法:给一个sentence,对于每个timestep,即对于每个token,经过上下2个RNN Cell后预测下一个token,预测出来的token会用于下一个timestep,2个timestep之间相应层的左右2个RNN Cell也有连接,则上下2个RNN Cell之间的向量即为当前token的Contextualized Word Embedding,记为$h_{1,1}$,它会考虑到当前token和之前所有token。

    当是BiRNN时,也会考虑之后所有token,此时的Contextualized Word Embedding是正向和反向2个向量的拼接$h_1=concat(h_{1,1}, h_{1,2})$;以上只是一层编码器(上下2个RNN Cell),EMLo实际上可以有多层编码器,每层都对应一个$h_i$,同时最开始每个token有个原始的静态的Embedding,记为$h_0$,最终EMLo取它们的Weighted Sum,即$h=\sum_{i=0}\alpha_ih_i$

    原始静态Embedding表示的是单词的单词特征,EMLo各层编码器输出的$h_i$表示的是单词的句法特征、语义特征等更加Contextual的特征

    注意$\alpha_i$ is learned with downstream task,而$h_i$在接task前是训练好的,与task一起学习的仅仅是$\alpha$,EMLo后接不同的task,会学到不同的$\alpha$,从而学到不同的最终的Embedding。

    BERT - Bidirectional Encoder Representations from Transformers

    BERT = Encoders of Transformer. Learned from a large amount of text without annotations. TODO: 不属于Language Models范畴?

    对于中文来说,char粒度可能比word粒度更合适一些,因为常用char大约4千左右,而word无法穷举,使用char的话,输入时onehot向量没word时那么大。也有弊端,中文里word与其中的char可能含义差别很大,于是有了ERNIE,它mask的是word,如"黑龙江"而非"龙"或"黑"。

    TODO: 使用char的onehot向量?不使用char或word的静态Embedding吗?应该是的,好像xi是onehot向量,而ai=W*xi中的ai就相当于静态Embedding,而W就相当于Embedding Matrix。能不能让BERT直接接收ai作为输入,ai是char/word的静态Embedding,比如Word2Vec,GloVe这些?

    BERT有很多层Encoder,比如12/24/48层,每层关注不同的特征,下游Task有2种使用BERT的方法:

    • Fine-tuning: 改变BERT参数,与下游Task一起参与训练,效果最好
    • Feature Extraction: 抽取若干Encoder层的输出并Concat在一起,效果差于Fine-tuning,但好处是预先保存好Concat后的向量后,可重复使用,且快速使用

    BERT是一个句子级别的语言模型,不像ELMo在后接下游Task时需要每层加上权重做全局池化,BERT可以直接获得一整个句子的唯一向量表示(对[CLS]进行深度encoding)

    有人做过实验,观察每一层的侧重点:方法是类似于EMLo,每一层输出经Weighted Sum后得最终结果并输入到下游Task,观察每一层的Weight(learned from task),可以分析各个层更适用于哪些Task,即更关注哪类特征。如靠前的层更关注文法相关的特征如POS,Consts,Deps等,靠后的层更关注复杂的如Coref.,SRL,而Entities,Relations,SPR这些Task被几乎所有层均匀关注。

    Traning of Bert:

    BERT是一个多任务模型,以下2种训练其实是同时使用

    Approach1:Masked LM

    输入token以15%概率被mask,一起输入BERT里,mask输入对应的那个输出vector,再输入一个Linear Multi-class Classifier里,让它去预测这个mask输入。Linear分类器其实很简单,这就要求BERT输出的那个vector,要对mask输入有很强的表征能力才行,于是vector就可以是mask输入的Embedding。如果2个token填在同一个位置没有违和感,那它们就有类似的Embedding.

    Approach2:Next Sentence Prediction

    输入2个句子,以<SEP>分隔,在开头添加一个<CLS>,一起输入BERT里,<CLS>对应的那个输出vector,再输入一个Linear Binary Classifier里,让它去预测这2个句子是否是接在一起的。BERT和Linear Binary Classifier是一起训练学习的,前者是finetuning,后者是Learned from Scratch,共同学习到vector,于是vector就可以是XXX的Embedding。

    YAO: vector是谁的Embedding???

    Usecase of Bert :

    Usecase1: 单标签分类

    输入1个句子,输出1个class,则<CLS>对应的vector后接1个Linear Classifier用于预测这个class

    Usecase2: 序列标注

    输入1个句子,输出T个class,则句子中每个token都对应1个vector,每个vector都后接1个Linear Classifier用于预测这个token的标注类别

    Usecase3: 自然语言推断NLI

    输入2个句子,句子1是假设,句子2是推断,输出1个class,则<CLS>对应的vector后接1个Linear Classifier用于判断推断是正确、错误或未知

    Usecase4: 抽取式QA

    输入1篇文章D={d1,d2,...,dn}和1个问题Q={q1,q2,...,qm},输出2个整数(s,e),表示问题的答案是D中的片段A={ds,...,de},di和qj都是token。红色向量与d1,d2,...,dn对应的各个输出vector做dot product后经softmax后输出n个概率值,最大概率值对应的i即为s,同理蓝色向量得到的最大概率值对应的i即为e,红色向量和蓝色向量与各个vector的维度相同,都是与Bert一起训练出来。

    GPT: Generative Pre-Training

    GPT = Decoders of Transformer. 使用的是Decoders里的Masked SelfAttention,也属于Language Models范畴。当前输入的所有tokens经很多层的Masked SelfAttention后输出$O^3$来预测下一个token,预测完后当作下一个timestep的输入$a^4$,重复之前的行为。

    GPT-2很神奇,可以做到Zero-shot Learning,即在完全没有训练语料的情况下去做Reading Comprehension(输入document和query,再输入一个'A:',随即便能输出Answer), Summarization(输入document,再输入一个'TL;DR:',随即便能输出摘要), Translation(输入多个英法句子对,如english sentence=french sentence,之后输入1个english sentence和'='后,便能输出相应的french sentence),不过效果不是特别好。

  • 2019: The Year of BERT - 2019

    Chinese: 2019: 属于BERT预训练语言模型之年

  • BERT时代与后时代的NLP - 2019

  • NLP算法面试必备!史上最全!PTMs:NLP预训练模型的全面总结 - 2020

  • Top 6 Open Source Pretrained Models for Text Classification you should use

    Chinese: 6个用于文本分类的最新开源预训练模型

Code

Practice

Library

7.2 Chinese

中文预训练语言模型

Paper

Code

Practice

7.3 EMLo

Deep contextualized word representations - AllenAI2018

EMLo: Embeddings from Language Model,是第一个使用预训练模型进行词嵌入的方法,将句子输入ELMO,可以得到句子中每个词的向量表示。

低层编码器提取语料中的句法信息,高层编码器提取语料中的语义信息。

Code

Article

Practice

7.4 BERT

7.4.1 Overview

Article

7.4.2 BERT

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding - Google2019

Github

Library

Article

Practice

7.4.3 Other BERT

Paper

7.4.4 Model Compression

Github

Article

  • 模型压缩实践系列之——layer dropout - 2020

  • 模型蒸馏Distillation - 2019

    一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型,方便部署

    蒸馏的目标:让student学习teacher的泛化能力,而非直接拟合训练数据

  • 蒸馏神经网络到底在蒸馏什么?(设计思想篇)- 2018

    背景:qi = softmax(exp(zi/T)),T是超参数,越大,概率分布越趋于均匀

    • Step1: 用较大的T训练大模型Teacher,Teacher能够产生更加均匀分布的Soft Target(各个qi,01之间的数值)
    • Step2: 用相同的T训练小模型Student,Label用Soft Target,让Student学到数据的结构分布特征
    • Step3: 应用阶段,令T=1,Student输出的概率分布变得不那么均匀分布了,会偏向正确Label
    • 其他:有时Label是Soft和Hard Target的加权平均

    YAO: OK

    数据间的结构相似性:大模型,比如识别猫的ImageNet,对猫的预测概率p1为0.9,对狗的概率p2为0.001,对汽车的概率p3为0.00001,虽然p2,p3远小于p1,可正确预测出猫,但p2比p3高2个数量级,也正确学习到了狗比汽车更接近猫的这一先验知识,这就是数据间的结构相似性。越大的模型越能学习到更丰富的数据结构间的相似信息。这可以解释以下2点:

    • 较大T值:p2与p3高2个数量级,但p2和p3还是太小,Student直接学习的话,不容易学习,于是令T较大(升温),Soft Target中p2,p3就没那么小了,Student较容易学习(热了好吸引,也使用较大的T)。应用环节,令T=1(降温),p2,p3恢复原来的很小的状态,Student就容易预测(冷静下来后好决策)
    • Soft Target作为Student的Label: Hard Target中猫是1,狗和汽车都是0,没有体现出狗与猫的相似性,而大模型通过复杂精妙的结构可以学习到这一先验知识,蕴含在Soft Target中,拿给Student当Label,Label本身包含了丰富的先验知识,比Hard Target更好,Student不必自己从零学习先验知识,直接用即可
  • 模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结 - 2020

  • Tiny-NEZHA:预训练语言模型与蒸馏压缩技术 - 2020

  • Transformer中16个注意力头一定要比1个注意力头效果好吗 - 2020

7.5 GPT

GPT1: Improving Language Understanding by Generative Pre-Training - OpenAI2018

GPT2: Language Models are Unsupervised Multitask Learners - OpenAI2019

Code

Practice

Article

7.6 ULMFit

Universal Language Model Fine-tuning for Text Classification - fastAI2018

在 Kaggle 和其他竞赛中,ULMFit 的效果都超越了其他模型。

Code

Library

Article

7.7 ERNIE (Baidu & THU)

7.7.1 ERNIE - Baidu

百度提出知识增强的语义表示模型 ERNIE(Enhanced Representation from kNowledge IntEgration),并发布了基于 PaddlePaddle 的开源代码与模型,在语言推断、语义相似度、命名实体识别、情感分析、问答匹配等自然语言处理(NLP)各类中文任务上的验证显示,模型效果全面超越 BERT。

ERNIE: Enhanced Representation through Knowledge Integration - Baidu2019

ERNIE 2.0: A Continual Pre-training Framework for Language Understanding - Baidu2019

Code

Article

7.7.2 ERNIE - THU

ERNIE: Enhanced Language Representation with Informative Entities - THU2019

Article

7.8 CoVe

Learned in Translation: Contextualized Word Vectors - Salesforce2017

Code

7.9 XLM

XLNet其实本质上还是ELMO, GPT, Bert这一系列两阶段模型的进一步延伸

Cross-lingual Language Model Pretraining - Facebook2019

Code

7.10 XLNet

XLNet: Generalized Autoregressive Pretraining for Language Understanding - CMU2019

Code

Article

7.11 T5 Model: NLP Text-to-Text

Article

7.12 Application

Python
1
https://gitee.com/liuyaox/roadmap_nlp.git
git@gitee.com:liuyaox/roadmap_nlp.git
liuyaox
roadmap_nlp
roadmap_nlp
master

搜索帮助