预训练中Word2vec,ELMO,GPT与BERT对比

预训练

先在某个任务(训练集A或者B)进行预先训练,即先在这个任务(训练集A或者B)学习网络参数,然后存起来以备后用。当我们在面临第三个任务时,网络可以采取相同的结构,在较浅的几层,网络参数可以直接加载训练集A或者B训练好的参数,其他高层仍然随机初始化。底层参数有两种方式:frozen,即预训练的参数固定不变,fine-tuning,即根据现在的任务调整预训练的参数。
优势:
1、当前任务数据量少,难以训练更多的网络参数,可以加载预训练的模型,然后根据当前的任务对参数进行fine-tuning,以适合当前的任务。
2、即使当前任务的数据量不少,使用预训练模型可以加快模型的收敛。
原理:
1、在底层抽出来的特征与任务无关,越具备任务的通用型,所以可以使用底层预训练好的参数初始化新的任务。
2、高层任务与具体的任务关联性较大,所以在高层不使用预训练参数或者采用fine-tuning方式在当前数据集上清洗掉高层无关的特征提取器。

Word2vec

word2vec就是nlp中预训练的一种方式。但是word2vec有一个缺点就是无法解决多义词,因为每一个词只有用一个向量表示。

ELMO

ELMO是“Embedding from Language Models"简称。在此之前word embedding本质是个静态方式,静态的意思就是说单词训练好之后就固定了,在以后使用时,单词不会跟着上下文场景变化而变化。
ELMO的本质思想是:事先用一个语言模型去学习单词的word embedding, 当我在使用时,单词已经具备了特定的上下文,这时候可以根据上下文的语义去调整单词的word embedding, 这样经过调整的word embedding更能表达这个上下文中具体的含义,也就解决了一词多义问题,故ELMO本质就是根据当前上下文对Word Embedding进行动态调整的过程。

Elmo采用典型的两阶段过程:第一阶段使用预训练语言模型进行训练,第二阶段当做具体的下游任务时,从预训练的网络中提取对应的词的Word Embedding作为特征补充到下游任务中。
第一阶段,预训练:采用双层双向LSTM对上下文进行编码,上下文使用静态的word embedding, 对每层LSTM,将上文向量与下文向量进行拼接作为当前向量,利用大量的预料训练这个网络。对于一个新的句子,可以有三种表示,最底层的word embedding, 第一层的双向LSTM层的输出,这一层能学习到更多句法特征,第二层的双向LSTM的输出,这一层能学习到更多词义特征。经过elmo训练,不仅能够得到word embedding, 又能学习到一个双层双向的神经网络。
第二阶段,下游任务使用:将一个新的句子作为elmo预训练网络的输入,这样该句子在elmo网络中能获得三个embedding, 可以将三个embedding加权作为word embedding, 并将此作为下游任务的输入,这被称为“Feature-based Pre-Training"。

GPT

GPT是Generative Pre-Training的简称。与ELMO相似,采用两阶段的模式:利用语言模型进行预训练,通过fine-tuning模式应用到下游任务
利用语言模型进行预训练:与elmo不同的是,GPT使用transformer进行提取特征,并且是单向的transformer,只是根据上文来预测某个词。
fine-tuning: 想GPT网络看起,根据GPT网络来更改自己任务结构。这样就可以使用手头数据对当前任务进行fine-tunining.

BERT

BERT是“Bidirectional Encoder Representations from Transformers"的简称。
同GPT采用两阶段模式:利用双向语言模型进行预训练,通过fine-tuning模式解决下游任务。
BERT创新: Masked语言模型Next Sentence Prediction
Masked语言模型, 即随机选择一部分单词进行mask,然后预测这些单词,其方式和CBOW类似,为了解决fine-tuning阶段不需要mask,所以bert中只选择15%作为mask的候选,在这15%中80%不做处理,10%进行mask,10%进行替换【不太理解为什么成立】
next sentence prediction:之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。
BERT的输入: 输入的部分是个线性序列,两个句子之间使用sep进行分割,在开头和结尾分别加一个特殊字符。对于每一个字符都是由三种embedding组成,位置信息embedding, 单词embedding和句子embdding,三种embedding叠加便是bert的输入。

总结

word2vec: nlp中最早的预训练模型,缺点是无法解决一词多义问题.
ELMO:
优点: 根据上下文动态调整word embedding,因为可以解决一词多义问题;
缺点:1、使用LSTM特征抽取方式而不是transformer,2、使用向量拼接方式融合上下文特征融合能力较弱。
GPT:.
优点:使用transformer提取特征
缺点:使用单项的语言模型,即单向transformer.
BERT: 优点:使用双向语言模型,即使用双向transformer;使用预测目标词和下一句这中多任务学习方式进行训练。

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

原文地址:https://www.cnblogs.com/zhaopAC/p/11219600.html

时间: 2024-11-05 23:32:31

预训练中Word2vec,ELMO,GPT与BERT对比的相关文章

fine-tuning:预训练中的迁移

什么是fine-tuning? 概述 在实践中,由于数据集不够大,很少有人从头开始训练网络.常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器. 以下是常见的两类迁移学习场景: 卷积网络当做特征提取器.使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余部分当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量).这样提取的特征叫做CNN codes.得到这样的特征后,可以使用

自然语言处理(NLP)——语言模型预训练方法(ELMo、GPT和BERT)

1. 引言 在介绍论文之前,我将先简单介绍一些相关背景知识.首先是语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布.具体来说,语言模型的作用是为一个长度为m的文本确定一个概率分布P,表示这段文本存在的可能性.在实践中,如果文本的长度较长,P(wi | w1, w2, . . . , wi−1)的估算会非常困难.因此,研究者们提出使用一个简化模型:n元模型(n-gram model).在 n 元模型中估算条件概率时,只需要对当前词的前n个词进行计算.在n元模型中,

深度双向Transformer预训练【BERT第一作者分享】

目录 NLP中的预训练 语境表示 语境表示相关研究 存在的问题 BERT的解决方案 任务一:Masked LM 任务二:预测下一句 BERT 输入表示 模型结构--Transformer编码器 Transformer vs. LSTM 模型细节 在不同任务上进行微调 GLUE SQuAD 1.1 SQuAD 2.0 SWAG 分析 预训练的影响 方向与训练时间的影响 模型规模的影响 遮罩策略的影响 多语言BERT(机器翻译) 生成训练数据(机器阅读理解) 常见问题 结论 翻译自Jacob Dev

文本分类实战(一)—— word2vec预训练词向量

1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 textCNN 模型 charCNN 模型 Bi-LSTM 模型 Bi-LSTM + Attention 模型 RCNN 模型 Adversarial LSTM 模型 Transformer 模型 ELMo 预训练模型 BERT 预训练模型 所有代码均在textClassifier仓库中, 觉得有帮助,

BERT论文翻译:用于语言理解的深度双向Transformer的预训练

Jacob Devlin Ming-Wei Chang Kenton Lee kristina Toutanova Google AI Language {jacobdevlin, mingweichang, kentonl, kristout}@google.com 摘要 本文介绍了一种新的语言表示模型BERT,意为“来自transformer的双向编码器表示”(Bidirectional Encoder Representations from Transformers).与最近的语言表示模

在 C/C++ 中使用 TensorFlow 预训练好的模型—— 直接调用 C++ 接口实现

现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过直接调用 TensorFlow 的 C/C++ 接口来导入 TensorFlow 预训练好的模型. 1.环境配置 点此查看 C/C++ 接口的编译 2. 导入预定义的图和训练好的参数值 // set up your input paths const string pathToGraph = "/ho

[转] 轻松使用多种预训练卷积网络抽取图像特征

选自GitHub,机器之心整理. 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征.对于每一个模型,它们都会输出最后的全连接层,即 AlexNet 的第七个全连接层.VGG_19 的第 8 个全连接层等.这些层级将最终抽取出图像的特征,并能进一步用于图像分类和聚类等.机器之心简要地介绍了该项目,并测试了使用Inception_V1预训练模型抽取图像特征. 项目地址:https://github.com/cameronfabbri/Compu

如何使用“预训练的词向量”,做文本分类

不多比比了,看代码!!! def train_W2V(w2vCorpus, size=100): w2vModel = Word2Vec(sentences=w2vCorpus, hs=0, negative=5, min_count=5, window=8, iter=1, size=size) w2vModel.save(inPath+'w2vModel.model') return w2vModel def load_W2V(W2V_path, loader_mySelf=1): if l

CNN基础二:使用预训练网络提取图像特征

上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始训练(training from scratch),因为训练代价高,且很难避免过拟合问题.相对的,通常会采用一种更高效的方法--使用预训练网络. 预训练网络的使用通常有两种方式,一种是利用预训练网络简单提取图像的特征,之后可能会利用这些特征进行其他操作(比如和文本信息结合以用于image capti