BERT (2)

BERT -- Bidirectional Encoder Representations from Transformers

 

使用 LSTM,数据只能在一个方向以顺序方式读取。虽然双向 LSTM 通过向前和向后读取数据解决了这个问题,但文本仍然是顺序处理而不是并行处理。这就是Transformer模型发挥作用的地方。
Transformer 模型依靠注意力机制 并行处理整个文本文档。
在注意力机制中,不是按顺序处理文本,而是并行处理文本,这允许注意力系统以并行方式为文本的重要部分分配权重。

 

 

为什么要使用 BERT?


BERT 模型能够生成捕获本地上下文的单词表示。例如,对于词嵌入,即使我们谈论“apple Iphone”或将 apple 作为水果,“apple”一词的表示也是相同的。使用 BERT,将生成不同的单词表示。此外,BERT 模型将单词分为词干和叶片段。例如,“Judgmental”一词被视为两个独立的标记 “Judgement”和“al”,这使得词的表示更加灵活。

 

 

BERT 文本分类步骤
通常,BERT 模型用于生成文本表示,然后可以将其与 LSTM 或 CNN 网络一起使用来构建文本分类或任何其他类型的模型。但是,BERT 还包含序列分类模型,也可用于对文本进行分类。
使用BERT序列模型 进行文本分类涉及的步骤如下:
•  第一步,必须生成 BERT tokens。为此,可以使用 BERT Tokenizer。
•  第二步, 将数据转换成BERT模型可以使用的格式,并使用BERT进行词嵌入。
•  为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

 

 

 

BERT, RoBERTa, DistilBERT, XLNet 到底哪家强?

BERT 以及后续模型
谷歌基于 transformer 的 BERT 系列一经问世就在 NLP 领域掀起了一场风暴,在几项任务中的表现可谓势头强劲,已经超越了先前沿用的最先进的技术。最近,谷歌对 BERT 进行了改版,我将对比改版前后主要的相似点和不同点,以便你可以选择在研究或应用中使用哪一种。

BERT

是一个双向 transformer,用于对大量未标记的文本数据进行预训练,以学习一种语言表示形式,这种语言表示形式可用于对特定机器学习任务进行微调。虽然 BERT 在几项任务中的表现都优于 NLP 领域沿用过的最先进的技术,但其性能的提高主要还是归功于双向 transformer掩蔽语言模型对任务的训练以及结构预测功能,还包括大量的数据和谷歌的计算能力

最近,又提出了几种方法改进 BERT 的预测指标或计算速度,但是始终达不到两者兼顾。XLNet 和 RoBERTa 改善了性能,而 DistilBERT 提高了推理速度。下表对它们进行了比较:


图 1:比较 BERT 和最近的一些改进情况

GPU 计算时间是估算的(使用 4 个 TPU Pod 进行为时 4 天的原始训练)
使用大量的小批次数据,根据掩蔽程序的差异进行学习速度和延长时间的训练
数据来源是原始论文

XLNet

是一种大型双向 transformer,它使用的是改进过的训练方法,这种训练方法拥有更大的数据集和更强的计算能力,在 20 个语言任务中 XLNet 比 BERT 的预测指标要更好。

为了改进训练方法,XLNet 引入了置换语言建模,其中所有标记都是按随机顺序预测的。 这与 BERT 的掩蔽语言模型形成对比,后者只预测了掩蔽(15%)标记。 这也颠覆了传统的语言模型,在传统语言模型中,所有的标记都是按顺序而不是按随机顺序预测的。 这有助于模型学习双向关系,从而更好地处理单词之间的关系和衔接。此外使用 Transformer XL 做基础架构,即使在不统一排序训练的情况下也能表现出良好的性能。

XLNet 使用了超过 130 GB 的文本数据和 512 TPU 芯片进行训练,运行时间为 2.5 天,XLNet 用于训练的资料库要比 BERT 大得多

RoBERTa

在 Facebook 上推出的 Robustly 是 BERT 的优化方案,RoBERTa 在 BERT 的基础上进行再训练,改进了训练方法,还增加了 1000%的数据,强化了计算能力。

为了优化训练程序,RoBERTa 从 BERT 的预训练程序中删除了结构预测(NSP)任务引入了动态掩蔽,以便在训练期间使掩蔽的标记发生变化。在这过程中也证实了大批次的训练规模在训练过程中的确更有用。

重要的是,RoBERTa 使用 160 GB 的文本进行预训练,其中包含了 16GB 的文本语料库和 BERT 使用的英文 Wikipedia。其他数据包括 CommonCrawl News 数据集(6300 万篇文章,76 GB),Web 文本语料库(38GB)和普通爬虫的故事(31 GB)。 再加上 1024 个 V100 的 Tesla GPU 每天都在运行,这使得 RoBERTa 具备了进行预训练的基础。

因此,RoBERTa 在 GLUE 基准测试结果上优于 BERT 和 XLNet:

  图 2:RoBERTa 的性能比较。 作者:AI科技评论 https://www.bilibili.com/read/cv3608516/ 


另一方面,为了减少 BERT 或相关模型的计算(训练,预测)时间,理应选择使用较小的网络以达到相似的性能。其实有许多方法可以做到这一点,包括剪枝,蒸馏和量化,然而,所有这些都会导致预测指标更低

DistilBERT

学习了 BERT 的蒸馏(近似)版本保留了 95%的性能,但只使用了一半的参数。 具体来说,它没有标记类型和池化层的嵌入,只保留了谷歌 BERT 中一半的层。 DistilBERT 使用了一种叫做蒸馏的技术,它与谷歌的 BERT(也就是由较小的神经网络构成大型神经网络)相似。 这个原理是,一旦要训练一个大型神经网络,就可以使用较小的网络来预估其完整的输出分布。这在某种意义上类似于后验近似。 在贝叶斯统计中用于后验近似的关键优化函数之一是 Kulback Leiber 散度,自然在这里也被用到了。
提示:在贝叶斯统计中,我们接近真实的后验值(来自数据),而对于蒸馏,我们只能做到接近在较大网络中学习到的后验值。

如何使用
如果你真的需要推理速度快一点,可以接受代价是预测精度稍微下降那么一些的话,那么 DistilBERT 会是一个合适的选择,但是,如果你还在寻找最佳的预测性能,你最好使用 Facebook 的 RoBERTa。
从理论上讲,基于 XLNet 置换的训练应该能处理好依赖关系,并且可能在长期运行中能表现出更好的性能。
但是,Google 的 BERT 确实提供了良好的基线,如果你没有上述任何关键需求,就可以使用 BERT 维持系统的正常运行。

总结
大多数性能的改善(包括 BERT 本身)都是由于增加了数据量计算能力或训练过程。 虽然它们确实具有自己的价值,但它们往往倾向于在计算和预测指标之间进行权衡。当前真正需要的是在使用更少的数据和计算资源的同时还可以使性能得到基本的改进

原文作者:SuleimanKhan

原文链接:https://towardsdatascience.com/bert-roberta-distilbert-xlnet-which-one-to-use-3d5ab82ba5f8

作者:AI科技评论 https://www.bilibili.com/read/cv3608516/ 出处:bilibili

 

https://www.zhihu.com/question/476969690

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章