Bert论文解读及相关代码实践

news2024/10/4 22:02:45

Bert:Bidirectional Encoder Representations from Transformers

Transformer中双向Encoder表达学习。BERT被设计为通过在所有层中对左右上下文进行联合调节,从未标记文本中预训练深度双向表示。预训练的BERT模型可以通过仅一个额外的输出层进行微调,从而为广泛的任务创建最先进的模型。Bert paper

借鉴CV中的大规模预训练然后进行迁移学习就能得良好的效果,因此BERT也是两部分,预训练,然后微调。在预训练中,模型在不同任务无标签的数据上进行。微调则是以预训练的参数进行初始化,然后再用下游任务有标签的数据进行训练。每个下游任务都有各自微调的模型,尽管他们初始化时用的同样预训练参数。如下则是示例:

可见除了输出层,预训练模型和微调模型使用的结构都是一样的,CLS是每个句子/输入开头都有的特殊符号(huggingface中说为分类器token,The classifier token which is used when doing sequence classification (classification of the whole sequence   instead of per-token classification). It is the first token of the sequence when built with special tokens.) ,SEP则是分隔符。

attention is all you need:此paper中Transformer的结构也是BERT的基本结构,BERT base模型恰好是12层(也就是L=12,encoder 6层,decoder 6层??存疑哈),隐层参数H=768,self-attention head有12个,A=12,头还挺多的。总参数110M,bert-large L=24层(猜测encoder和decoder各12层),H=1024,A=16,总参数340M。Bert-base大小是为了与OpenAI,GPT对比。严格的说,Bert 的Transformer结构中使用的双向self-attention,而GPT的Transformer是使用的受限的self-attention,也就是说每个token只能与它左边的context进行attention。本文中注释为:前者这种双向的attention是Transformer encoder,而后者只能左边attention的记为Transformer decoder(因为它能用于文本生成)。

输入和输出表示:为了处理更多下游任务,输入形式必须明确,可以是单个sentence,也可以是一对sentence,此sentence是泛指,可以是单个句子,也可以是多个连续的句子。采用wordPiece embedding,词典大小30k,每个句子第一个token是一个classification token [CLS],在分类任务中这个token最后的隐层状态是用来聚合sentence表达。sentence对则集中成一个sentence,区别这些sentence有两种方式,1,采用特殊token[SEP]分割;2,增加一个embedding给每个token,表明他们是属于sentenceA还是sentenceB,正如上图左边所示,C就是CLS token的,对于一个给定的输入,三个embedding相加后得到输入表达,三个embedding分别为position embedding,segment embedding,token embedding,position embedding和token embedding都很好理解,只有segment embedding,它是表示token属于哪个sentence的embedding,同样,这三个embedding维度都一样,不然不能元素相加,如下:

 预训练Bert:并不是传统的从左边到右边,或从右边到左边的语言模型去预训练,而是第一个图中的两个任务,1):MLM,直观上,一个深度双向model是比一个left-to-right或者left-to-right和right-to-left 浅concat 要更有power。不巧的是,标准的条件语言模型(conditional language model)只能以left-to-right 或者right-to-left方式进行训练,因为双向的条件会使得每个词间接地“see itself”,模型会很容易预测出目标词。为了训练一个深度双向表达,简单的随机掩盖一些比例的输入,然后预测这些掩盖的词,这就是Masked LM,最终的mask token的隐层向量被喂到所有词典之上的输出softmax,意思就是拿词典中所有的词进行softmax。每个句子随机mask 15% 的WordPiece token。这种方式获得的预训练模型可能在微调中不匹配,因为,mask 的token可能在微调中没有出现。为此,并不是一直以实际的[mask] token替代实际被掩盖的词,即,训练集随机选择15%的token位置预测,如果第i个选中,80%可能性以[MASK]替代,10%可能性以随机token,10%并不改变。

2)NSP(Next sentence prediction),上述语言模型并不能获取像QA,NLI(自然语言推断inference)的信息。为了是训练的模型理解sentence之间的关系,预训练了一个二分类任务,也就是下一个sentence的预测。对句子A和B预训练时,50%可能B就是出现在A的后面,label为IsNext,50%可能是语料中的随机句子,label 为NotNext。正如图1中的C,它用于NSP预训练。然而,在先前的工作中,只有语句嵌入被传递到下游任务,其中BERT传递所有参数以初始化最终任务模型参数。

预训练数据:采用BooksCorpus(800M词)和英语维基百科(2500M词),后者只提取文本信息,忽略列表,和表头。而且严格使用文本级别语料,而不是打乱顺序的句子级别语料。

微调Bert:对于涉及文本对的应用程序,一种常见的模式是在应用双向交叉注意力之前独立地对文本对进行编码。BERT使用自我注意机制来统一这两个阶段,因为用自我注意编码串联文本对有效地包括两个句子之间的双向交叉注意力。在输入端,来自预训练的句子A和句子B类似于(1)释义中的句子对,(2)暗示中的假设前提对,(3)问答中的问题-段落对,以及(4)退化文本-∅ 文本分类或序列标记中的配对。在输出端,token表示被送入token级任务的输出层,如序列标记或问题回答,[CLS]表示被送入输出层进行分类,如修饰或情感分析。相对于预训练,微调相对划算。所有的paper都可在预训练模型基础上用几个小时单个GPU进行复现。

几个数据集:

The General Language Understanding Evaluation  -GLUE多样的自然语言理解任务

The Stanford Question Answering Dataset -SQuAD v1.1 100k问答对。

The Situations With Adversarial Generations -SWAG 113k基础常识句子对

几个任务:也可能是数据集

Multi-Genre Natural Language Inference -MNLI 给定一对句子,目标是预测第二个句子相对于第一个句子是隐含的、矛盾的还是中性的。

Quora Question Pairs -QQP 二分类任务,目标是确定Quora上的两个问题在语义上是否相等

Question Natural Language Inference -QNLI 斯坦福QA数据集,二分类任务,正例是(疑问句、句子)对,其中包含正确答案,反例是来自同一段落的(疑问句),其中不包含答案。

The Stanford Sentiment Treebank -SST-2  二分类任务,从电影评论中提取的句子,以及情感注释

The Corpus of Linguistic Acceptability -CoLA 二分类任务(单句),目标是预测英语句子在语言上是否“可接受”

The Semantic Textual Similarity Benchmark -STS-B 从新闻标题和其他来源提取的句子对的集合,语义相似性分数,从1~5

Microsoft Research Paraphrase Corpus -MRPC 从网上新闻提取的句子对,并且有注释这两个句子对在语义上是否一样。

Recognizing Textual Entailment -RTE 类似于MNLI,二分类,但训练集少、

Winograd NLI -WNLI 小的NLI数据集

Bert 与GPT训练时如何不同:Bert用BooksCorpus(800M词)和维基百科(2500M词),而GPT只用前者。也就是数据集GPT少了很多。

Bert学习SEP,CLS以及sentence A/B 的embedding在预训练中,而GPT只在微调时引入SEP,CLS。

batch_size不同:Bert  128k词一个batch,而GPT   32k词一个batch

学习率不同:Bert 选择适合微调任务的最好的学习率,而GPT使用lr=5e-5的学习率在所有微调任务中。

codes:此代码是预训练的bert及预训练的模型。

先看Bert模型:其中并没有decoder阶段,因此上面所说的L=12仅指encoder阶段,(主要为self-attention 然后是ResNet和LayerNorm,其中也有dense阶段)这个算一层,12层即可。

WordPiece tokenization:的先是空白分词,然后对一些词再分词,比如john johanson ' s , → john johan ##son ' s

自有数据预训练及微调:采用现成的句子分割工具spacy,然后用create tfrecord (如下示例)也可加入2%的噪声,生成的tfrecord用于预训练(如下run_pretraining)

python create_pretraining_data.py \
  --input_file=./sample_text.txt \
  --output_file=/tmp/tf_examples.tfrecord \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --do_lower_case=True \
  --max_seq_length=128 \
  --max_predictions_per_seq=20 \
  --masked_lm_prob=0.15 \
  --random_seed=12345 \
  --dupe_factor=5

python run_pretraining.py \
  --input_file=/tmp/tf_examples.tfrecord \
  --output_dir=/tmp/pretraining_output \
  --do_train=True \
  --do_eval=True \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --train_batch_size=32 \
  --max_seq_length=128 \
  --max_predictions_per_seq=20 \
  --num_train_steps=20 \
  --num_warmup_steps=10 \
  --learning_rate=2e-5

测试预训练的模型:示例

export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue

python run_classifier.py \
  --task_name=MRPC \
  --do_train=true \
  --do_eval=true \
  --data_dir=$GLUE_DIR/MRPC \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0 \
  --output_dir=/tmp/mrpc_output/

微调示例:

python run_squad.py \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=$SQUAD_DIR/train-v1.1.json \
  --do_predict=True \
  --predict_file=$SQUAD_DIR/dev-v1.1.json \
  --train_batch_size=12 \
  --learning_rate=3e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=/tmp/squad_base/

预训练需要注意的点:

1)修改 bert_config.json中的vocab_size ,否则可能出现NaN

2)在已有Bert模型基础上再预训练lr应该降低(原本是1e-4),可以试试2e-5

3)长序列开销很大,因为attention是其长度的平方复杂度。64个序列长度为512的seqs比256个序列长度为128的seqs更难训练。

4)预训练花费巨大,时间长达2weeks,花费TPU约 $500

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AVS-试听分割-论文阅读

题目: Audio-Visual Segmentation 论文地址:https://arxiv.org/abs/2207.05042 GitHub地址:https://github.com/OpenNLPLab/AVSBench 项目主页:https://opennlplab.github.io/AVSBench/ 相关博客https://arxiv.org/abs/2203.03821 摘要 We propose to explore a new pro…

(附源码)ssm汽车租赁 毕业设计 271621

基于ssm的汽车租赁平台的设计与实现 摘 要 随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了汽车租赁平台.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬…

微电网和直流电网中最优潮流(OPF)的凸优化(Matlab代码实现)

📋📋📋本文目录如下:⛳️⛳️⛳️ 目录 1 概述 2 最优潮流 3 电力系统强大的CVX 4 直流电网中最优潮流(OPF)的凸优化 4.1 Matlab代码 4.2 运行结果 5 微电网中最优潮流(OPF)的凸优…

go gin web综合教程,包括 mysql redis log 路由

前言 在学习go许久,没看到网上有比较综合的gin web教程,很多都是最基础的教程,完全就是启动个服务返回参数,没有过多的结合实际开发。下面我结合一下我的经验,来写一篇深入的综合教程,包括数据库Mysql、re…

JMeter启动时常见的错误

很多小伙伴在学工具这一块时,安装也是很吃力的一个问题,之前记得有说过怎么安装jmeter这个工具。那么你要启动jmeter的时候,一些粉丝就会碰到如下几个问题。 1.解压下载好的jmeter安装,Windows 平台,双击 jmeter/bin …

基于python实现的SGM半全局立体匹配算法

文章目录前言一、SGM是什么?1.代价计算2.代价聚合3.视察计算4.视察优化二、基于python实现SGM算法?总结前言 开始正是入门立体匹配算法啦,会不断更新立体匹配的算法和代码。   水平有限,旨在先了解和读懂别人的代码的实现方式&a…

3D立体匹配入门 - 视差计算

经典假设 1、左右视图成功匹配的窗口,具有相同的像素 这个是最经典的假设,几乎所有视差图计算都用上了他,通过匹配左右窗口像素,得到最佳匹配对应的x轴坐标差,就是视差 2、像素P的视差只与其领域有关 这个是基于马尔…

外汇天眼:即使与世界第一的差价合约提供商交易也会被骗!

你能想象,当你与世界第一的差价合约提供商进行交易时,也可能会被骗吗? 在投资理财多元化的今天,外汇投资理财也备受大家的关注,而与此同时,骗子的诈骗渠道也与时俱进,各类外汇投资骗局也层出不穷…

VMware Workstation 17.0 Pro SLIC Unlocker for Linux

VMware_Dell_2.6_BIOS-EFI64_Mod;macOS Unlocker,支持 macOS Ventura 请访问原文链接:VMware Workstation 17.0 Pro SLIC & Unlocker for Windows & Linux,查看最新版。原创作品,转载请保留出处。 作者主页&a…

多模式直方图的视网膜图像增强

论文题目:Retinal Image Enhancement in Multi-Mode Histogram 1 摘要 视网膜图像的评估被广泛用于帮助医生诊断许多疾病,如糖尿病或高血压。从采集过程来看,视网膜图像往往具有较低的灰度对比度和动态范围。本文提出了一种基于直方图分析的…

MySQL回表

1.索引结构 1.1.B-Tree(B树)和BTree(B树) 前面是B-Tree,后面是BTree,两者的区别在于: B-Tree中,所有的节点都会带有指向具体记录的指针;BTree中只有叶子节点才会带有指向具体记录的指针;B-Tree中,不同的叶子之间没有连在一起;BTree中所有的叶子节点通过指针连接在一起;B-Tree中…

java版商城之 Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管理、商家端(PC端、手机端)、买…

浴室预约小程序毕业设计,洗澡预约澡堂预约系统设计与实现,微信小程序毕业设计论文怎么写毕设源码开题报告需求分析怎么做

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序浴室预约系统,前台用户使用小程序,后台管理使用JavaMysql开发,后台使用了springboot框架;通过后台添加设定浴室类型、录入浴室和管理浴室、管理…

CTPN+CRNN算法端到端实现文字识别的实战开发

本文分享自华为云社区《CTPNCRNN 算法端到端实现文字识别》,作者:HWCloudAI。 OCR介绍 光学字符识别(英语:Optical Character Recognition,OCR)是指对文本资料的图像文件进行分析识别处理,获取…

Java规则引擎Drools急速入门

文章目录1.Drools规则引擎简介2.Drools API开发步骤3.SpringBoot整合Drools案例4.Drools基础语法5.Drools条件语法部分6.Drools结果操作部分7.Drools内置属性部分8.Drools高级语法部分1.Drools规则引擎简介 (1)什么是规则引擎 ​ 全称为业务规则管理系…

类与对象(上篇)

类与对象面向过程和面向对象类的引入类的定义类的访问限定符及封装访问限定符封装类的作用域类的实例化类对象类对象的存储方式类成员函数的this指针this指针的引出this指针的特性面向过程和面向对象 C语言是面向过程,注重的是过程,先分析求解问题的步骤…

【计算机视觉】目标检测中Faster R-CNN、R-FCN、YOLO、SSD等算法的讲解(图文解释 超详细必看)

觉得有帮助请点赞关注收藏~~~ 一、基于候选区域的目标检测算法 基于候选区域的深度卷积神经网络(Region-based Convolutional Neural Networks)是一种将深度卷积神经网络和区域推荐相结合的物体检测方法,也可以叫做两阶段目标检测算法。第一…

Web大学生网页作业成品——环保垃圾分类网站设计与实现(HTML+CSS+JavaScript) web前端开发技术 web课程设计 网页规划与设计

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

RFID标签让企业海量固定资产实现科学化管理

近年来,随着物联网、IoT、移动技术、云计算技术的成熟,越来越多的企业开始使用RFID标签管理企业海量的固定资产。优化固定资产标准化管理流程,有效管理和库存固定资产,进一步提高企业实物资产管理和库存效率。 包括资产申购、验收…

【操作系统】计算机大脑CPU

1.CPU组成机构和存储器层级 (1)CPU是计算机硬件系统的核心部件-大脑 结构:运算器控制器(两个部件里面有寄存器组)通过CPU内部的总线进行通信 (2)单核CPU架构 控制器Control Unit简称【CU】 …