Bert原理与使用

一.简介
1.BERT模型的核心思想有两点,对推动NLP的发展有着重要的作用:(1)Transformer结构;(2)无监督的预训练。Transformer是一个只基于注意力(Attention)机制的序列模型。BERT模型同时需要预训练,从两个无监督任务中获取权重:语言建模(给定左右上下文,预测丢失的单词)以及下一个句子预测(预测一个句子是否跟在另一个句子后面)。

二.NLP预训练过程的发展
1.最开始NLP里面做预训练用的是语言模型,像NNLM,就是输入前面单词的one-hot编码乘以矩阵向量,经过softmax分类器,要求被预测的单词的概率最大化,从而得到被预测的单词和wordembedding矩阵
2.然后出现了Word2Vec,原理和NNLM基本类似
3.词向量虽然可以作为预训练的输出输入到下游任务,但是问题是对多义词没办法区分,出现了ELMO,在此之前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变。ELMO的本质思想是:我事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,但是在使用的时候可以根据单词的上下文意思对它的词向量进行动态调整
ELMO采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练(双层双向LSTM);第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中
预训练训练完后得到单词的三个embedding(单词的,句法的,语义的)。将这个三个加权求和作为补充的新特征给下游任务使用
4.GPT(生成式的预训练)。
第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning(微调)的模式解决下游任务
和ELMO主要不同在于两点:首先,特征抽取器不是用的RNN,而是用的Transformer;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型
然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决手头的问题
5.Bert
Bert采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型
那么Bert本身在模型和方法角度有什么创新呢?就是论文中指出的Masked 语言模型和Next Sentence Prediction
[1]Mask双向语言模型
15%的被上天选中要执行[mask]替身这项光荣任务的单词中,只有80%真正被替换成[mask]标记,10%被狸猫换太子随机替换成另外一个单词,10%情况这个单词还待在原地不做改动。这就是Masked双向语音模型的具体做法
[2]至于说“Next Sentence Prediction”,指的是做语言模型预训练的时候,分两种情况选择两个句子,一种是选择语料中真正顺序相连的两个句子;另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。我们要求模型除了做上述的Masked语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是Bert的一个创新

三.原理介绍
(一).数据处理
1.按行读取数据,将每个样本保存为Inputexample对象,进而将训练集,验证集,测试集都保存为Inputexample对象所在的列表
2.将Inputexample对象转换为InputFeatures字典对象,保存为TFRecord文件,TFRecord二进制编码方案,只要生成一次TFRecord,之后的数据读取和加工处理的效率都会得到提高,使用了多线程使得IO操作不再阻塞我们的模型训练
InputFeatures字典对象总共有5个键
[1].文本向量input_ids,前后分别加了CLS和SEP,通过分词器得到
[2].input_mask,表示这个位置是否有值,有值为1,没有值为0
[3].segment_ids表示所在的句子位置,第一句为0,第二个句子为1
[4].label_id,类别id
[5].is_real_example,判断是否为真实的样本
3.文本向量化过程,总共两个分词器
3.1一个基本的分词器对文本进行清洗,取出空字符串和无效的字符,按照空字符串,标点进行分词
3.2一个词汇级别的分词器,对上面分词后的结果根据最长匹配进行分词,分词之后有一些词汇前面会带有##,因为bert提供的词汇文件都是字级别的,所以得到的结果,如果输入是“我是中国人”,那么得到的是[我,##是,##中,##国,##人],匹配不上的位置用unk代替
4.在将Inputexample对象转换为InputFeatures字典对象的时候会进行文字数字化处理
(二).模型训练
1.读取TFRecord文件,将样本数据转化为批次数据
2.调用bert预训练模型创建模型
2.1读取构建好的一个batch_size的input_id,结合bert提供的词汇表进行查找,构建embedding_output和embedding_table
2.2添加每个字的位置向量和字所在哪句话的向量,并且进行归一化和dropout
2.3根据input_id和input_mask创建attention_mask
2.4构建transformer模块
2.4.1总共有12个transformer模块,对于每个模块,输入是前一个模块的输出
2.4.2每个transformer模块里面有一个attention_layer,也就是multi-headed attention
2.4.3每个multi-headed attention输出进行全连接,dropout,残差连接和归一化
2.4.4直到走完12个transformer结构
2.4.5保存所有transformer层的输出结果
2.5取最后一个transformer的结果的第一个位置的输出,也就是CLS这个位置的输出作为整个bert预训练模型的输出结果
2.6如果是训练的化,经过dropout,然后全连接得到预测值,通过softmax计算得到概率,进而求得每个样本的损失和每个batch_size的损失
3.训练阶段,通过优化器进行优化,参数是构建好的bert模型和损失值
4.验证阶段,计算准准确率和混淆矩阵进行评估
5.测试阶段,进行预测

(三).multi-headed attention
1.将前一层得到的结果传入进行12组不同的线性变换分别得到12组Q,K,V矩阵,然后将每个字的Q向量分别和其他字的K向量点乘得到,然后除以K向量维度的平方根,可以使训练过程中具有更稳定的梯度,最后再进行softmax函数标准化,这个分数表示的是再编码当前单词时对输出句子的其他单词的关注程度
2.将每个字的value向量乘以softmax后的得分,这个实际意义在于保存对当前词的关注度不变的情况下降低对不相关的词的关注
3.得到的结果进行累加。就会产生这个位置self-attention层的输出

在这里插入图片描述四.大致的几个模块
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值