BERT模型

article/2025/9/15 0:59:26

BERT模型

Paper: https://arxiv.org/abs/1810.04805

BERT 全称为Bidirectional Encoder Representation from Transformers(来自Transformers的双向编码表示),谷歌发表的发的论文Pre-traning of Deep Bidirectional Transformers for Language Understanding中提出的一个面向自然语言处理任务的无监督预训练语言模型。是近年来自然语言处理领域公认的里程碑模型。

BERT的创新在于Transformer Decoder(包含Masked Multi-Head Attention)作为提取器,并使用与之配套的掩码训练方法。虽然使用了双编码使得BERT不具有文本生成能力,但BERT在对输入文本的编码过程中,利用了每个词的所有上下文信息,与只能使用前序信息提取语义的单向编码器相比,BERT的语义信息提取能力更强。

下面距离说明单向编码与双向编码在语义理解上的差异

今天天气很差,我们不得不取消户外运动。

将句子中的某个字或者词“挖”走,句子变为

今天天气很{},我们不得不取消户外运动。

分别从单向编码(如GPT)和双向编码(如BERT )的角度来考虑“{}”中应该填什么词。单向编码只会使用“今天天气很”这5个字的信息来推断“{}”的字或词,以人类的经验与智慧,使用概率最大的词应该是:“好”“不错”“差”“糟糕”,而这些词可以被划分为截然不同的两类。

通过这个例子我们可以直观地感觉到,不考虑模型的复杂度和训练数据量,双向编码与单向编码相比,可以利用更多的上下文信息来辅助当前的语义判断。在语义理解能力上,采用双向编码的方式是最科学的,而BERT的成功很大程度上有此决定。

BERT的结构

参数

L L L:Transformer blocks;
H H H:hidden size;
A A A:self-attention heads;
𝐵 𝐸 𝑅 𝑇 𝐁 𝐀 𝐒 𝐄 : 𝐵𝐸𝑅𝑇_{𝐁𝐀𝐒𝐄}: BERTBASE: 𝐿 𝐿 L=12, 𝐻 𝐻 H=768, 𝐴 𝐴 A=12, Total Parameters=110𝑀
𝐵 𝐸 𝑅 𝑇 𝐋 𝐀 𝐑 𝐆 𝐄 𝐵𝐸𝑅𝑇_{𝐋𝐀𝐑𝐆𝐄} BERTLARGE: 𝐿 𝐿 L=24, 𝐻 𝐻 H=1024, 𝐴 𝐴 A=16, Total Parameters=340𝑀

无监督预训练深度双向语言模型

(1) Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务Segment (2) Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务(3) Position Embeddings和之前文章中的Transformer不一样,不是三角函数而是学习出来的

预训练任务

Task1: Masked LM

为了构建一个深层的真双向语言模型,但是标准的语言模型是使用了马尔可夫链进行的单向编码,即使使用 LTR 与 RTL,但也是假的双向编码,性能会受到极大的影响。使用完形填空机制可以避免标准的语言模型的编码瓶颈。

完形填空策略:随机的 mask 掉 15% 的单词,然后使用编码器最后的 hidden state 过一层 softmax 进行完形填空预测。

但是这种策略会有两个缺点,以下是内容和解决方案:
Downside 1: mismatch
这样做构造了一种 mismatch:因为 [MASK] 永运不会出现在 fine-tuning 阶段,所以 pre-training 与 fine-tuning 出现了 mismatch。

缓解方案:对于随机选择的 15% 待 mask 单词,不是直接将它替换为 [MASK],而是再做一次随机:
80%:将该词替换为 [MASK]
10%:将该词替换为一个随机的词语
10%:不替换

原因:Transformer Encoder 不知道哪个单词被要求做预测,哪个单词被随机替换掉了,所以对于每个输入的单词,它都必须保持上下文嵌入;而且,现在这种策略下随机替换掉的单词只有 1.5%,几乎不会影响模型的语言建模能力。

Downside 2: slower
现在使用的 MLM 模型,每个 batch 只有 15% 的单词被预测,所以收敛速度确实慢了。但是效果带来的提升却很大。

Task2: Next Sentence Prediction

NLP 中有很多句子关系性的任务,这部分的能力不能通过 Task1 的 MLM 来俘获到,所以加入了一个二分类任务进行多任务学习。
策略:50% 的句子对,将第二句替换为随机的句子来构建负样本。

其他细节

(1) 训练语料:BooksCorpus 800𝑀 words + English Wikipedia 2,500𝑀𝑤𝑜𝑟𝑑𝑠
(2) batch size:256
(3) Adam: γ \gamma γ=1e−4, β 1 \beta_1 β1=0.9, β 2 \beta_2 β2=−.999,warmup
(4) dropout:0.1
(5) GELU
(6) loss:两个任务的 loss 和

下游监督任务微调

(1) 单句/句子对分类任务:直接使用 [CLS] 的 hidden state 过一层 softmax 进行预测;
(2) QA 任务:将问题和答案所在的段拼接起来,使用最后的答案段的 hidden state 向量来计算某个单词是答案开始单词和结束单词的概率,进而进行预测。
(3) 其中,S 和 E 是需要下游 fine-tuning 阶段训练的开始向量和结束向量。在推断阶段,会强行限制结束的位置必须在开始的位置之后。
(4) 序列标注任务:直接将序列所有 token 的最后一层 hidden state 喂进一个分类层(没有使用自回归、CRF)

BERT:强大的特征提取能力

BERT是由推碟的Transformer Encoder 层组成核心网络,辅以词编码和位置编码而成的。BERT的网络形态与GPT非常相似。简化版本的ELMO、GPT和BERT的网络如下图所示:

(1)ELMO 使用左右编码和自右向左编码的两个LSTM网络,分别以 P ( w 1 ∣ w 1 , . . . , w i − 1 ) P(w_1|w_1,...,w_{i-1}) P(w1w1,...,wi1) P ( w i ∣ w i + 1 , w i + 2 , . . . , w n ) P(w_i|w_{i+1},w_{i+2},...,w_{n}) P(wiwi+1,wi+2,...,wn)为目标函数独立训练,将训练得到的特征向量以拼接的形式实现双向编码。
(2)GPT使用Transformer Decoder作为Transformer Block,以 P ( w i ∣ w 1 , . . . , w i − 1 ) P(w_i|w_1,...,w_{i-1}) P(wiw1,...,wi1)为目标函数进行训练,用Transformer Block取代LSTM作为特征提取器,实现了单向编码,是一个标准的预训练语言模型。
(3)BERT 与ELMo的区别在于使用Transfomer Block作为特征提取器,加强了语义特征提取的能力;与GPT的区别在于使用Transfomer Enoder作为 Transfomer Block,将GPT的单向编码改为双向编码。BERT含弃了文本生成能力,换来了更强的语义理解能力。

将GPT结构中的Masked Multi-Head Attention层替换成Multi-Head Attention层,即可得到BERT的模型结构,如图:

参考

Bert原理
NLP Google BERT模型原理详解
《预训练语言模型》邵浩

欢迎关注公众号:


http://chatgpt.dhexx.cn/article/GI4gVdl3.shtml

相关文章

BERT模型的结构,特点和实践

BERT模型介绍,特点,资源 一、背景介绍二、BERT与语言模型1.feature-based2.fine-tuning3.BERT的语言模型 三、BERT整体概览1. BERT框架2. BERT模型结构2.1输入部分2.2 BERT的预训练任务任务1:Masked Language Model(MLM)任务2:Nex…

Bert算法:语言模型-BERT详细介绍

本文的目的是向NLP爱好者们详细解析一个著名的语言模型-BERT。 全文将分4个部分由浅入深的依次讲解。1.Bert简介 BERT是2018年10月由Google AI研究院提出的一种预训练模型。 BERT的全称是Bidirectional Encoder Representation from Transformers。BERT在机器阅读理解顶级水平…

Bert 模型学习

一、Bert 模型 BERT 模型的全称是 BidirectionalEncoder Representations from Transformer,基于 Transformer 的双向编码器表示,是一个预训练的语言表征模型,它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼…

【理论篇】是时候彻底弄懂BERT模型了(收藏)

引言 本文对BERT模型的理论进行了一个非常详尽的解释,相信看完本篇文章后,你对BERT模型的理解会上升🚀一个层次。 本文是理论篇,下篇是实战篇。 BERT的基本思想 BERT如此成功的一个原因之一是它是基于上下文(context-based)的嵌…

Hive !!!

文章目录 Hive数据处理方法论step1 了解产品/运营的需求step2 数据收集(数据准备)step3 数据处理(数据调研)step4 数据分析 Hive背景Hive简介引入原因安装hive注意事项一些代码Hive SQL VS SQL Hive的数据类型数据类型Hive架构 Hi…

Shark简介

简介 Shark是一个新的数据分析系统,在集群上进行查询处理和复杂分析。Shark使用一种新的分布式内存抽象,为SQL查询和复杂分析函数提供了统一的运行引擎,并能够有效的容错。这种新的分布式内存抽象使得shark执行SQL查询的速度比Hive快100倍&a…

Vue3中shallowReactive 与 shallowRef 的用法

shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式(浅响应式)。 shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。 什么时候使用? 如果有一个对象数据,结构比较深, 但…

2018华为软挑--模拟退火+FF解决装箱问题【C++代码】

算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索算法、蚁群算法、模拟退火算法等等,本次使用模拟退火,它的优点是在参数合适的情况下基本上可以100%得到全局最优解,缺点…

2020华为软挑热身赛代码开源-思路大起底(华为软件精英挑战赛编程闯关)

本文首发于个人公众号【两猿社】,后台回复【华为】,获取完整开源代码链接。 昵称:lou_shang_shi_bian_tai 成绩:0.032 社长没有针对硬件做任何优化,热身赛成绩也一般。但有些比赛的trick我想与大家一起分享,希望对继续…

2021华为软挑-成渝复赛复盘

成渝赛区 团队名:newWorld 初赛 rank 22,复赛 rank 22。 github源码:https://github.com/Yin-Freedom/codecraft_2021 赛题介绍 赛题网址:https://competition.huaweicloud.com/advance/1000041380/circumstance 本次赛题来源…

2020华为软挑热身赛

基于高斯贝叶斯分类的C优化器 摘要:2020华为软件挑战赛如期举行,本次挑战赛分为热身赛、初赛、复赛、总决赛4个部分,其中热身赛结合当前机器学习中分类问题以及鲲鹏服务器性能相关来出题。为了解决该问题,达到算法准确率和程序时…

华为软挑赛2023-初赛笔记

前言 比赛介绍 官方链接: 2023华为软件精英挑战赛——普朗克计划 (huaweicloud.com) 赛题介绍 场景介绍 官方赛题介绍: 2023华为软件精英挑战赛初赛赛题及相关材料发布_2023华为软件精英挑战赛_华为云论坛 (huaweicloud.com) 比赛场景如图所示 简单来说,在一…

【C++】2018华为软挑:模拟退火+贪心FF解决装箱问题

本文的主要工作是补充这篇博客的缺失代码,使之能够运行。 2018华为软挑--模拟退火FF解决装箱问题【C代码】_小马哥MAX的博客-CSDN博客算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索…

2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

本文始发于个人公众号【两猿社】。 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验。 他来了,他来了,他带着面试绿卡走来了。 他来了,他来了,他带着20w大奖走来了。 一年一度…

2018华为软挑参赛体验

第一次接触到这个比赛应该是研究生刚入学的时候,在教研室看到了师姐的一份简历,上面就有华为软挑的参赛经历。研一利用空余时间加强C和STL的学习,看完了《C primer》《Effective STL》,自己也写了一些demo,感觉这个比赛…

2022华为软挑编程问题报错总结

for i in number_feature: TypeError: ‘int’ object is not iterable的错误 错误原因:是因为在python里,整型(int)数据是不能直接用于迭代的,而是应该用range()函数 改为如下图:

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

前期工作: 2021华为软挑初探——代码实现 2021华为软挑再探——代码实现 1 关于打包 在windows系统下,先把你写的程序写在src里面的CodeCraft-2021里面 然后在这个页面,将这三个文件压缩就可以上传啦: 2 关于标准输入 标准输…

华为软挑2019

参加软挑的一些感悟 写在前边的话 我本科一直在做嵌入式相关的项目,这是第一次参加软件类的竞赛,不得不说过程确实很刺激,最后止步杭厦赛区50强也很是遗憾,明明很接近,最后输在了代码效率上,本地成绩很好的 python代码 ,上传测评运行时间超限(官测环境比本地性能好&…

2021华为软挑初探——代码实现

其他工作: 2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码) 2021华为软挑再探——代码实现 这几天华为软挑好多人也是做的热火朝天,作为一个渣渣小孙也来探探,不探…

2020华为软挑总结

文章目录 一、热身赛编程闯关:评价标准:问题分析 二、初赛问题描述评价标准:问题分析思路一:思路二:思路三:针对思路三的提速: 最终结果: 三、code记录初赛两篇不错的总结三、复活赛…