https://github.com/zhanlaoban/NLP_PEMDC
NLP Predtrained Embeddings, Models and Datasets Collections(NLP_PEMDC)
https://github.com/Separius/awesome-sentence-embedding
A curated list of pretrained sentence and word embedding models 包含各种Embeddings和Pretrained Models
【Great】https://github.com/thunlp/PLMpapers
Must-read Papers on pre-trained language models 各预训练模型层次衍生关系图
Pre-trained Models for Natural Language Processing: A Survey - 2020
Article: NLP集大成之预训练模型综述
【Great】NLP中各种各样的编码器 - 2020
文本编码有哪些不同的模型可用?是否存在一个适用于所有事情的模型,还是模型都是依赖于任务的?包括:语义相关、语法探索、信息检索、通用句子编码等!
8 Excellent Pretrained Models to get you Started with NLP - 2019
包括:ULMFiT, Transformer, BERT, Transformer-XL, GPT-2, ELMo, Flair, StanfordNLP
Chinese:8种优秀预训练模型大盘点,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
词嵌入已死,语言模型当立
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的方法:
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),不过效果不是特别好。
Chinese: 2019: 属于BERT预训练语言模型之年
Top 6 Open Source Pretrained Models for Text Classification you should use
Chinese: 6个用于文本分类的最新开源预训练模型
https://github.com/PaddlePaddle/LARK (PaddlePaddle)
BERT, EMLo and ERNIE Implementation with PaddlePaddle
【Great】https://github.com/huggingface/transformers (PyTorch)
A library of SOTA pretrained models for NLP
包含8个主流预训练模型(BERT, OpenAIGPT, GPT2, TransfoXL, XLNet, XLM, RoBERTa, OpenCLaP),提供整套API:Tokenize, 转化为字符的ID, 计算隐藏向量表征等
Chinese: BERT、GPT-2这些顶尖工具到底该怎么用到我的模型里? - 2019
https://github.com/zalandoresearch/flair (PyTorch)
Flair: 混合了BERT, EMLo, GPT-2
Article: Text Classification with State of the Art NLP Library — Flair - 2018
Chinese: 简单易用NLP框架Flair发布新版本 - 2018
https://github.com/bytedance/byseqlib
字节:业内第1个实现的CUDA版的Transformer, BERT, GPT2
中文预训练语言模型
Pre-Training with Whole Word Masking for Chinese BERT - HIT2019
中文BERT-wwm预训练模型
Code: https://github.com/ymcui/Chinese-BERT-wwm (Tensorflow & PyTorch)
Article: 中文最佳,哈工大讯飞联合发布全词覆盖中文BERT预训练模型
YAO: HERE HERE HERE
ALBERT: A Lite BERT for Self-supervised Learning of Language Representations - Google2019
海量中文预训练ALBERT模型:参数更少,效果更好
Code: https://github.com/brightmart/albert_zh (Tensorflow)
RoBERTa: A Robustly Optimized BERT Pretraining Approach - Wangshtaon2019
Code: https://github.com/brightmart/roberta_zh (Tensorflow)
RoBERTa for Chinese 目前只是base版训练数据:10G文本,包含新闻、社区问答、百科数据等
Article: RoBERTa中文预训练模型,你离中文任务的SOTA只差个它
NEZHA: Neural Contextualized Representation for Chinese Language Understanding - Huawei2019
Code: https://github.com/huawei-noah/Pretrained-Language-Model
Article: “哪吒”出世!华为开源中文版BERT模型
https://github.com/thunlp/OpenCLaP (PyTorch)
OpenCLaP:多领域开源中文预训练语言模型仓库 可被PyTorch-Transformers直接使用 包含:百度百科BERT, 民事文书BERT, 刑事文书BERT
GPT2: https://github.com/morizeyao/gpt2-chinese (PyTorch)
Chinese version of GPT2 training code, using BERT tokenizer
https://github.com/zhanlaoban/ccf_bdci_2019_datafountain350 (PyTorch)
CCF BDCI 2019 互联网新闻情感分析 复赛top8 代码,3分类
已整理为支持BERT/BERT-wwm/ERNIE/XLNet/RoBERTa/ALBERT等基于transformer模型的文本分类工具,支持transformer接CNN/LSTM/GRU等
Article: 互联网新闻情感分析复赛top8(8/2745)解决方案及总结
【Great】https://github.com/zhanlaoban/Transformers_for_Text_Classification (PyTorch)
基于Transformers的文本分类,模型有:BERT, BERT+CNN, BERT+LSTM, BERT+GRU, XLNET, XLNET+LSTM, XLNET+GRU
https://github.com/cdj0311/keras_bert_classification (Keras)
使用 chinese_L-12_H-768_A-12,模型为BERT + FC/LSTM
https://github.com/songyingxin/bert-textclassification (PyTorch)
Implemention some Baseline Model upon Bert for Text Classification
https://github.com/YC-wind/embedding_study (Tensorflow)
中文预训练模型生成字向量学习,测试BERT,ELMO的中文效果
https://github.com/renxingkai/BERT_Chinese_Classification (Tensorflow)
用BERT进行中文情感分类的详细操作及完整程序
Deep contextualized word representations - AllenAI2018
EMLo: Embeddings from Language Model,是第一个使用预训练模型进行词嵌入的方法,将句子输入ELMO,可以得到句子中每个词的向量表示。
低层编码器提取语料中的句法信息,高层编码器提取语料中的语义信息。
https://github.com/allenai/allennlp (PyTorch)
https://github.com/allenai/bilm-tf (Tensorflow)
A Step-by-Step NLP Guide to Learn ELMo for Extracting Features from Text - 2019
NLP详细教程:手把手教你用ELMo模型提取文本特征
https://github.com/searobbersduck/ELMo_Chin (Tensorflow)
use ELMo in chinese environment
站在BERT肩膀上的NLP新秀们 - 2019
给 BERT 模型增加外部知识信息,使其能更好地感知真实世界,主要讲了 ERNIE from Baidu 和 ERNIE from THU
主要讲了 XLMs from Facebook, LASER from Facebook, MASS from Microsoft 和 UNILM from Microsoft
主要看看预训练模型中的增强训练(多任务学习/数据增强)以及BERT多模态应用: MT-DNN from Microsoft, MT-DNN-2 from Microsoft, GPT-2 from OpenAI 和 VideoBERT from Google
Understanding searches better than ever before - 2019
Chinese: 谷歌搜索用上BERT,10%搜索结果将改善
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding - Google2019
https://github.com/google-research/bert (Tensorflow)
https://github.com/hanxiao/bert-as-service
a sentence encoding service for mapping a variable-length sentence to a fixed-length vector
The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)
Github: https://github.com/jessevig/bertviz
Reference: Deconstructing BERT: Distilling 6 Patterns from 100 Million Parameters
Reference: Deconstructing BERT, Part 2: Visualizing the Inner Workings of Attention
https://github.com/xmxoxo/BERT-train2deploy (Tensorlfow)
BERT模型从训练到部署
文本分类实战(十)—— BERT 预训练模型 - 2019 (Tensorflow)
Multi-label Text Classification using BERT – The Mighty Transformer
Chinese:手把手教你用BERT进行多标签文本分类
https://github.com/bamtercelboo/PyTorch_Bert_Text_Classification (PyTorch)
PyTorch Bert Text Classification
Siamese and Dual BERT for Multi Text Classification
Chinese: [用Siamese和Dual BERT来做多源文本分类]
YAO: 多源是指输入=新闻标题+简介,分别使用单路BERT, 双路BERT, Siamese BERT
YAO: 对话系统意图识别、语音交互Query判不停、多粒度分词、
https://github.com/renxingkai/BERT_Chinese_Classification (Tensorflow)
用BERT进行中文情感分类,记录了详细操作及完整程序
RoBERTa: A Robustly Optimized BERT Pretraining Approach - Washington2019
MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices - CMU2020
【Great!!!】Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks - Germany2019
Code: https://github.com/UKPLab/sentence-transformers
Article: Sentence-BERT: 一种能快速计算句子相似度的孪生网络
YAO: TODO 适用于评论!为每个评论生成Sentence BERT Embedding!!!
https://github.com/dkozlov/awesome-knowledge-distillation
Awesome Knowledge Distillation
一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型,方便部署
蒸馏的目标:让student学习teacher的泛化能力,而非直接拟合训练数据
背景:qi = softmax(exp(zi/T)),T是超参数,越大,概率分布越趋于均匀
YAO: OK
数据间的结构相似性:大模型,比如识别猫的ImageNet,对猫的预测概率p1为0.9,对狗的概率p2为0.001,对汽车的概率p3为0.00001,虽然p2,p3远小于p1,可正确预测出猫,但p2比p3高2个数量级,也正确学习到了狗比汽车更接近猫的这一先验知识,这就是数据间的结构相似性。越大的模型越能学习到更丰富的数据结构间的相似信息。这可以解释以下2点:
GPT1: Improving Language Understanding by Generative Pre-Training - OpenAI2018
GPT2: Language Models are Unsupervised Multitask Learners - OpenAI2019
GPT1: https://github.com/huggingface/pytorch-openai-transformer-lm (PyTorch)
GPT1: https://github.com/openai/finetune-transformer-lm (Tensorflow)
GPT2: https://github.com/CyberZHG/keras-gpt-2 (Keras)
GPT2: https://github.com/morizeyao/gpt2-chinese (PyTorch)
Chinese version of GPT2 training code, using BERT tokenizer
GPT2: https://github.com/openai/gpt-2 (Tensorflow)
GPT1: Improving Language Understanding with Unsupervised Learning
GPT2: The Illustrated GPT-2 (Visualizing Transformer Language Models) - 2019
Chinese: 完全图解GPT-2:看完这篇就够了(一)
Universal Language Model Fine-tuning for Text Classification - fastAI2018
在 Kaggle 和其他竞赛中,ULMFit 的效果都超越了其他模型。
百度提出知识增强的语义表示模型 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
ERNIE: Enhanced Language Representation with Informative Entities - THU2019
BERT, 百度ERNIE, 清华ERNIE
Learned in Translation: Contextualized Word Vectors - Salesforce2017
https://github.com/salesforce/cove (PyTorch)
https://github.com/rgsachin/CoVe (Keras)
XLNet其实本质上还是ELMO, GPT, Bert这一系列两阶段模型的进一步延伸
Cross-lingual Language Model Pretraining - Facebook2019
XLNet: Generalized Autoregressive Pretraining for Language Understanding - CMU2019
https://github.com/zihangdai/xlnet (Tensorflow)
https://github.com/brightmart/xlnet_zh (Tensorflow & PyTorch)
XLNet中文预训练模型
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。