BERT预训练源码解析

自google在2018年10月底公布BERT在11项nlp任务中的卓越表现后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火、整个ML界略有耳闻的模型,网上相关介绍也很多,但很多技术内容太少,或是写的不全面半懂不懂,重复内容占绝大多数(这里弱弱吐槽百度的搜索结果多样化。。)

一句话概括,BERT的出现,彻底改变了预训练产生词向量下游具体NLP任务的关系,提出龙骨级的训练词向量概念。

一、词向量的发展:word2vec, ELMo, GPT,BERT比较

二、Bert原理介绍

 

三、Bert源代码解读

1、配置文件bert_config.json

----------------------------------------------------------------------------------------------------------------

" attention_probs_dropout_prob": 0.1,         #乘法attention时,softmax后dropout概率
  "hidden_act": "gelu",         #激活函数
  "hidden_dropout_prob": 0.1,        #隐藏层dropout概率
  "hidden_size": 768,                #隐藏单元数
  "initializer_range": 0.02,          #初始化范围
  "intermediate_size": 3072,      #升维维度
  "max_position_embeddings": 512,     #一个大于seq_length的参数,用于生成position_embedding
  "num_attention_heads": 12,    #每个隐藏层中的attention head数
  "num_hidden_layers": 12,       #隐藏层数
  "type_vocab_size": 2,        #segment_ids类别 [0,1]
  "vocab_size": 30522       #词典中词数
----------------------------------------------------------------------------------------------------------------

2、训练集的生成

主要实现在create_pretraining_data.py和tokenization.py两个脚本里。

第一步,读取raw文本,按行分词处理后存储all_documents[doc_0, doc_1, …]里面,doc_i=[line_0, line_1, …], line_i = [token_0, token_1, …],然后shuffle文章。
第二步,重复dupe_factor=10次,每篇文章生成样本,[CLS +A+SEP +B+SEP]作一条样本。

create_instances_from_document函数中

 

存储为TF-Record
输入sentence变量的处理

save format 处理

3、BertModel 模型实例化 

        这部分是总流程,整个modling脚本有900多行代码,所以我列个流程图一部一部走。整体流程如下。首先对input_ids和token_type_ids进行embedding操作,将embedding结果送入Transformer训练,最后得到编码结果。

word embedding

首先看word_embedding部分,它传入input_ids,运用one_hot为中介返回embedding结果

embedding_postprocessor

再看embedding_postprocessor 它包括token_type_embeddingposition_embedding。也就是图中的Segement EmbeddingsPosition Embeddings

embeddingç»æ

但此代码中Position Embeddings部分与之前提出的Transformer不同,此代码中Position Embeddings是训练出来的,而传统的Transformer(如下)是固定值
在这里插入图片描述

Transformer
embedding之后,首先构造一个attention_mask,这个attention_mask表示的含义是将原来的input_mask的[batch_size,seq_length]扩维到[batch_size,from_seq_length,to_seq_length]。保证对于每个from_seq_length都有一个input_mask。之后将他们传入到transformer模型。
transformer整体架构如图所示


transformer_model。首先对embedding进行multi-head attention,对输入进行残差layer_norm。后传入feed forward,再进行残差layer_norm

self_attention
接下来介绍self_attention机制。他运用乘法注意力,自己和自己做attention,使每个词都全局语义信息。同时运用Multi-head attention。即将hidden_size平分为多个部分(head)。每个head进行self_attention。不同head学习不同子空间语义。
å¨è¿éæå¥å¾çæè¿°

Bert整体结构

模型构建https://blog.csdn.net/weixin_39470744/article/details/84401339

训练代码详解https://blog.csdn.net/weixin_39470744/article/details/84619903

四、模型的应用(迁移策略)

下游具体NLP任务主要分为4大类

  •   序列标注:分词、实体识别、语义标注……
  •   分类任务:文本分类、情感计算……
  •   句子关系判断:entailment、QA、自然语言推理
  •   生成式任务:机器翻译、文本摘要

        BERT将传统大量在下游具体NLP任务中做的操作转移到预训练词向量中,在获得使用BERT词向量后,最终只需在词向量上加简单的MLP或线性分类器即可。比如论文中所给的几类任务:

对于左边两幅文本分类任务和文本匹配任务(文本匹配其实也是一种文本分类任务,只不过输入是文本对)来说,只需要用得到的表示(即encoder在[CLS]词位的顶层输出)加上一层MLP就好

a——句子关系判断(句对匹配):

  MultiNLI文本蕴含识别(M推理出N,蕴含/矛盾/中立),QQP(文本匹配),QNLI(自然语言问题推理),STS-B(语义文本相似度1-5),MRPC(微软研究释义语料库,判断文本对语音信息是否等价)、RTE(同MNLI,小数据),SWAG(113k多项选择问题组成的数据集,涉及丰富的基础情境)

b——分类任务(文本匹配):

  SST-2(斯坦福情感分类树),CoLA(语言可接受性预测)

对于左三图抽取式任务,用两个线性分类器分别输出span的起点和终点

c——序列标注(文本抽取):

  SQuAD(斯坦福问答数据集,从phrase中选取answer)

对于左四图序列标注任务,就只需要加softmax输出层

d——序列标注:

  NER命名实体识别

五、参考文章:

从Word Embedding到Bert模型——自然语言处理预训练技术发展史

https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247499341&idx=2&sn=31a806928f2d94d2904e1c2f857c2580&scene=21#wechat_redirect

谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读

https://www.jiqizhixin.com/articles/2018-11-01-9

谷歌BERT模型深度解析

https://www.jiqizhixin.com/articles/2018-12-03

Bert时代的创新:Bert在NLP各领域的应用进展 | 技术头条

https://mp.weixin.qq.com/s/yPq1cGnhcbaNLOjadj91pw

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值