ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【NLP之transformer | Datawhale-9月】Task03:学习BERT

2021-09-17 23:04:46  阅读:190  来源: 互联网

标签:NLP transformer 训练 BERT 模型 Transformer 单词 任务


图解BERT

BERT的预训练+微调(finetune):

先在大规模无监督语料上进行预训练;

然后在预训练好的参数基础上增加一个与任务相关的神经网络层;

并在该任务的数据上进行微调训,最终取得很好的效果。

现已成为NLP主流解决方案。

1 BERT句子分类

步骤:

下载无监督预料上的BERT模型,包含:BERT模型配置文件(用来确定Transformer的层数,隐藏层大小),BERT模型参数,BERT词表(BERT所能处理的所有token)。

在BERT模型上增加一个任务相关的神经网络,然后在特定任务监督数据上进行微调训练。

微调:学习率较小,训练epoch数量较少,对模型整体参数进行轻微调整。

例如:

  • 输入:电影或者产品的评价。输出:判断这个评价是正面的还是负面的。
  • 输入:两句话。输出:两句话是否是同一个意思。

为了能够使用BERT进行句子分类,我们在BERT模型上增加一个简单的classifier层,由于这一层神经网络参数是新添加的,一开始只能随机初始化它的参数,所以需要用对应的监督数据来训练这个classifier。由于classifier是连接在BERT模型之上的,训练的时候也可以更新BERT的参数。

2 模型结构

BERT原始论文提出了BERT-base和BERT—large两个模型,base的参数量比large少一些。

BERT结构基本是Transformer的encoder部分。

BERT-base对应的是12层encoder,BERT-large对应的是24层encoder。

BERT-base为12层的encoder:
在这里插入图片描述

3 模型输入

BERT模型输入有一点特殊的地方是在一句话最开始拼接了一个[CLS] token。这个特殊的[CLS] token经过BERT得到的向量表示通常被用作当前的句子表示。BERT将一串单词作为输入,这些单词多层encoder中不断向上流动,每一层都会经过 Self-Attention和前馈神经网络。

3.1 [CLS]
3.1.1 BERT 为什么第一个词为[CLS]

[CLS]就是classification的意思,可以理解为用于下游的分类任务。

因为做next sentence predict任务,就取[CLS]对应的最后的隐状态(hidden_state)过MLP,也就是最后的[batch_size,len1+len2,hidden_size]。

用[batch_size,1,hidden_size]去预测是不是下一句:
在这里插入图片描述
(1)名词解释:

MLP:多层感知器(MLP,Multilayer Perceptron)是一种前馈人工神经网络模型,其将输入的多个数据集映射到单一的输出的数据集上。

多层感知机层与层之间是全连接的。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。
在这里插入图片描述

3.1.2 BERT的[CLS]有什么用

主要用于以下两种任务:

  • 单文本分类任务:对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,并将该符号对应的输出向量作为整篇文本的语义表示,用于文本分类,如下图所示。可以理解为:与文本中已有的其它字/词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个字/词的语义信息。

  • 语句对分类任务:该任务的实际应用场景包括:问答(判断一个问题与一个答案是否匹配)、语句匹配(两句话是否表达同一个意思)等。对于该任务,BERT模型除了添加[CLS]符号并将对应的输出作为文本的语义表示,还对输入的两句话用一个[SEP]符号作分割,并分别对两句话附加两个不同的文本向量以作区分。

3.2 Token

WordPieces作为最小的处理单元。

4 模型输出

BERT输入的所有token经过BERT编码后,会在每个位置输出一个大小为 hidden_size(在 BERT-base中是 768)的向量。

对于上面提到的句子分类的例子,我们直接使用第1个位置的向量输出(对应的是[CLS])传入classifier网络,然后进行分类任务。

5 预训练任务:Masked Language Model

5.1 BERT的无监督训练

基于Masked language model进行预训练的:将输入文本序列的部分(15%)单词随机Mask掉,让BERT来预测这些被Mask的词语。

这种训练方式最早可以追溯到Word2vec时代,典型的Word2vec算法便是:基于词C两边的A、B和D、E词来预测出词C。

(1)名词解释:

Masked language model:掩码语言模型(MLM),MLM 随机选出一些词用 [MASK] 标记,然后去预测被 MASK 的词。但由于被 MASK 的词并不出现在fine-tuning(微调)的过程中,会导致预训练和微调的过程出现不一致性。针对这种情况,BERT 通过 80% [MASK],10% 随机 token,10% 原 token 的方式来进行 mask。
在这里插入图片描述

6 预训练任务:相邻句子判断

除了masked language model(掩码语言模型),BERT在预训练时,还引入了一个新的任务:判断两个句子是否是相邻句子。

输入是sentence A和sentence B,经过BERT编码之后,使用CLS token的向量表示来预测两个句子是否是相邻句子。

7 BERT的应用

可以用来判断两个句子是否相似,判断单个句子的情感,用来做抽取式问答,用来做序列标注。

8 BERT特征提取

BERT模型:使用输入序列所对应的token的向量表示。因此不仅可以使用最后一程BERT的输出,连接上任务网络,进行微调,还可以直接使用这些token的向量当作特征。

比如,可以直接提取每一层encoder的token表示当作特征,输入现有的特定任务神经网络中进行训练。

BERT特征提取:
在这里插入图片描述

9 拓展阅读

9.1 对比CNN

BERT的编码过程,与计算机视觉中使用VGGNet等网络的卷积神经网络+全连接网络做分类任务的基本训练方法和过程是类似的。

9.2 词嵌入(Embedding)进展
9.2.1 回顾词嵌入

单词不能直接输入机器学习模型,而需要某种数值表示形式,以便模型能够在计算中使用。通过Word2Vec,我们可以使用一个向量(一组数字)来恰当地表示单词,并捕捉单词的语义以及单词和单词之间的关系(例如,判断单词是否相似或者相反,或者像 “Stockholm” 和 “Sweden” 这样的一对词,与 “Cairo” 和 "Egypt"这一对词,是否有同样的关系)以及句法、语法关系(例如,“had” 和 “has” 之间的关系与 “was” 和 “is” 之间的关系相同)。

相比于在小规模数据集上和模型一起训练词嵌入,更好的一种做法是,在大规模文本数据上预训练好词嵌入,然后拿来使用。因此,我们可以下载由 Word2Vec 和 GloVe 预训练好的单词列表,及其词嵌入。

9.2.2 语境问题

缺陷:如果我们使用 Glove 的词嵌入表示方法,那么不管上下文是什么,单词 “stick” 都只表示为一个向量。

解决方法:语境化的词嵌入模型应运而生——ELMO。

语境化的词嵌入,可以根据单词在句子语境中的含义,赋予不同的词嵌入。

ELMo没有对每个单词使用固定的词嵌入,而是在为每个词分配词嵌入之前,查看整个句子,融合上下文信息。它使用在特定任务上经过训练的双向LSTM来创建这些词嵌入。(也就是根据上下文来决定该单词不同语境下的不同向量)

ELMo LSTM 会在一个大规模的数据集上进行训练,然后我们可以将它作为其他语言处理模型的一个部分,来处理自然语言任务。

优越性的原因:ELMo 通过训练,预测单词序列中的下一个词,从而获得了语言理解能力,这项任务被称为语言建模。要实现 ELMo 很方便,因为我们有大量文本数据,模型可以从这些数据中学习,而不需要额外的标签。

ELMo预训练过程的语言模型:以 “Let’s stick to” 作为输入,预测下一个最有可能的单词。当我们在大规模数据集上训练时,模型开始学习语言的模式。例如,在 “hang” 这样的词之后,模型将会赋予 “out” 更高的概率(因为 “hang out” 是一个词组),而不是输出 “camera”。

隐藏层状态在词嵌入过程中派上用场。ELMo 通过将LSTM模型的隐藏成表示向量(以及初始化的词嵌入)以某种方式(向量拼接之后加权求和)结合在一起,实现了带有语境化的词嵌入。

ELMO 训练:
在这里插入图片描述

9.2.3 Transformer:超越LSTM

随着Transformer论文和代码的发布,以及它在机器翻译等任务上取得的成果,开始让人们认为它是LSTM的替代品。

一部分原因是:

  1. 因为 Transformer 可以比 LSTM 更好地处理长期依赖;
  2. Transformer可以对输入进行并行运算。
9.2.4 OpenAI Transformer:预训练一个Transformer Decoder进行语言建模

沿着LSTM语言模型预训练的路子,将LSTM替换成Transformer结构后(相当于),直接语言模型预训练的参数给予下游任务监督数据进行微调,与最开始用于翻译seq2seq的Transformer对比来看,相当于只使用了Decoder部分。有了Transformer结构和语言模型任务设计,直接使用大规模未标记的数据不断得预测下一个词:只需要把 7000 本书的文字依次扔给模型 ,然后让它不断学习生成下一个词即可。

现在,OpenAI Transformer 已经经过了预训练,它的网络层藏书经过很多次调整,可以很好地用向量表示文本了。

句子分类任务(把电子邮件分类为 ”垃圾邮件“ 或者 ”非垃圾邮件“):

对于形形色色的NLP任务,OpenAI 的论文列出了一些列输入变换方法,可以处理不同任务类型的输入。

9.2.5 BERT:Decoder到Encoder

OpenAI Transformer为我们提供了一个基于Transformer的预训练网络。但是在把LSTM换成Transformer 的过程中,有些东西丢失了。比如之前的ELMo的语言模型是双向的,但 OpenAI Transformer 只训练了一个前向的语言模型。

我们是否可以构建一个基于 Transformer 的语言模型,它既向前看,又向后看(用技术术语来说 - 融合上文和下文的信息)。那答案就是BERT:基于双向Transformer的encoder,在Masked language model上进行预训练,最终在多项NLP下游任务重取得了SOTA效果。

标签:NLP,transformer,训练,BERT,模型,Transformer,单词,任务
来源: https://blog.csdn.net/alicedog/article/details/120358238

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有