赞
踩
一、BERT模型概述
在处理语言时,几乎所有的场景都可以认为是分类场景,所以从这个角度来说,BERT可以用于任何需要分类的场景。BERT使用命名实体识别(NER)来对组成语句的词汇、词组或者短语进行分类,对于1个NER任务,输出使用了token而不是[CLS]。 在问答场景下,问题部分和答案部分使用分隔符[SEP]进行连接,而答案有开始和结束注释。我们可以直接使用BERT模型或者可以根据需要修改它的结构或者模型实现。
BERT是一个基于自编码的语言分类模型,依赖于原生Transformer架构的左侧部分(encoder),可以高效解决语言分类问题。从输入到输出的过程可以看做是一个语言编码和解码的过程,然后基于Encoder和Decoder的多层次神经网络输出结果,输出结果产生的误差,可以通过反向传播来调整网络参数,从而提供训练效果:
下面是BERT数据输入处理的流程,最上面是语句输入,首先需要进行预处理,加上特殊的token如[CLS]和[SEP], 接下来是输入编码,然后通过线性处理(Linear projections)来产生Keys, Queries, Values, 使用自注意力机制基于每个head来进行并行处理,之后再次通过线性处理回到原有的维度。需要注意的是,这里的前馈神经网络会对每个词汇都进行处理,而不是让它们相互作用(已经在多头注意力机制中完成),这样处理的目的是可以并行处理词汇,这样的神经网络称为Position-wise 神经网络。
BERT能够成功处理任务的关键在于它所采用的Transformer的encoder架构是用一种称作"dense vectors"的形式来表达输入,dense vector包含了上下文信息,历史信息,相互作用信息等,这些vectors很容易被非常简单的分类器(如做一些线性操作)转化为输出。
二、BERT模型内部机制
1.输入内容编码(Word embeddings):
有3个步骤进行处理:
分词处理(默认为WordPiece算法)产生1个个的token:
数字化处理,通过词库把词汇用ID进行标识:
神经网络使用向量来表达信息,所以通过查询相关的矩阵进行编码转换:
由于BERT有各种训练任务,所以会给输入加上特殊的token, 如[CLS]表示语句的开始,[SEP]表示两个句子之间的分隔符,另外BERT规定在一个批次中每个语句的长度是一样的,所以针对不同的语句会做padding的操作:
2.位置编码(Postional Encoding):
语言是有先后顺序的,所以需要进行位置编码。
位置编码采用以下sin()和cos()公式, 三角公式可以有效表达相对位置(偏移量)信息:
3.输入编码(Input embeddings)
BERT是在Transformer的基础上针对BERT的训练任务进行了调整, 输入编码包含了3层编码,其中sentence embedding的作用是标识输入是属于哪个语句,这在实际操作中很重要,譬如在问答场景中,需要区别哪部分是问题,哪部分是答案。Token embeddings是为了处理特殊的token如表示全局信息的[CLS]和用于语句分割的[SEP],使用[CLS]来分类:
4.Encoder block
内部处理机制包含多头注意力机制,残差网络,正则化和前馈神经网络:
5.多头注意力机制(Multi-Head Attention)
使用多个head来从不同的角度表达信息,在输出端使用Concat把每个head的信息连接起来,
连接之后的维度可能跟输入不一样,就要进行线性操作来回到原有的维度(Linear), 计算自注意力的过程就是基于输入编码,通过线性转换生成Queries, Keys, Values, Q和K相乘得到attention的score, 然后再和V进行相乘。
6.Position-wise前馈神经网络
多头注意力计算输出给残差网络和正则化,然后由前馈神经网络进行处理,前馈神经网络在接收到信息后,通常要进行维度的调整,前馈神经网络本身具有层次信息,是为了每个token在通过多头自注意力机制之后能够更精细化地表达信息,由于token之间没有相互作用,所以只能扩大维度来更好地捕获信息:
7.残差网络和正则化
残差网络体现了Bayesian的思想,而正则化有利于模型的收缩和模型训练的质量,在正常运行中会有dropout, 是因为每个批次在训练时采用随机的方式来去掉一些训练的神经元,去掉这些神经元后,相当于产生了一个新的神经网络,可以设定去掉的比例。对dropout处理后的内容进行训练,得到的结果会和多头自注意力机制计算后的结果进行相加,这就是第一个残差网络的处理,在前馈神经网络处理后也会进行类似的操作。从数学原理看,这样的残差网络操作是和反向传播的梯度相关,这是因为如果是一个很大的网络,可能会造成很多次训练之后无法拟合的问题,这里面也涉及到自我学习的机制。
三、BERT的预训练任务
BERT的预训练任务包括以下两大类,通过这2个任务来训练模型。
1.Masked Language Model
对部分的token进行掩码操作,这是个自监督的过程,这里被掩码的token会有参考答案,那么掩码的作用是通过比较新的输出和原始的输出的误差,然后使用反向传播来调整参数。一般是选择15%的词汇token进行掩码操作,在这15%的部分,掩码的操作有3种级别划分:
1.80%的情况用<MASK>来替换原有token,这会增加模型训练的复杂度
2.10%的情况用随机的token来替换原有的token,这会增强模型训练时的柔韧性或者弹性
3.10%的情况是放入原有的内容,这会保证模型训练结果不会太离谱
2.Next Sentence Prediction
通过token[SEP]来判断两个句子是否是连贯的,最原始的做法是在一份文档中抽取2个句子,让它们保持先后顺序,这就是正样本,如果来自两个文档,那就是负样本,另外一种做法是在同一个文档中,有意颠倒2个句子的顺序来制造负样本,BERT原生的方式是第一种方式,需要使用标签如[CLS]来标识这2个句子是否有相互关系。在BERT的一个训练例子里,选取了50%的句子具有相邻关系,另外50%的句子没有相邻关系。
四、BERT微调
在具体训练时,会有一个微调的阶段,微调是面向任务的,使用微调来适配各种任务,本质上就是在做分类,[CLS]通过线性操作起到多分类或者多个标签的分类的作用。微调的时候如果有足够多的打标签的数据,就可以改变预训练模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。