十三、BERT

BERT(Bidirectional Encoder Representation from Transformers),基于 Transformer 的双向编码表示,模型训练时的两个任务是预测句子中被掩盖的词以及判断输入的两个句子是不是上下句。

论文中介绍了2种版本:BERT_BASE 和 BERT_LARGE。两个 BERT 的模型相比于 Transformer 有更多的编码器层数、前馈神经网络和多注意力头,如 BERT_BASE 有12层、768 个隐藏层神经元,12个多注意力头;BERT_LARGE 有24层,1024 个隐藏层神经元、16个多注意力头。

BERT 的基础集成单元是 Transformer 的 Encoder 编码层,整体框架是由多层 Transformer 的encoder 堆叠而成的,每一层的编码器 encoder 则是由一层 muti-head-attention 和一层 feed-forword 组成。

关于 Transformer 的编码器 Encoder 原理介绍请参考:

1 模型输入

我们知道文本预处理最重要的一步就是分词(Tokenize),执行分词的算法模型称为分词器(Tokenizer) ,划分好的一个个词称为 Token,这个过程称为 Tokenization 。

我们将一个个的 token(可以理解为小片段)表示成向量,我们分词的目的就是尽可能的让这些向量蕴含更多有用的信息,然后把这些向量输入到算法模型中。

在 BERT 中,输入的向量 X = (batch_size, max_len, embedding) 是由三种不同的 embedding 求和 WordPiece Token Embedding + Segment Embedding + Position Embedding 而成,使用字符 [CLS](分类标识 Classification Token) 对 Token 进行分类以及 [SEP](特殊标识 Special Token)对 Token 进行分隔。

假设 batch_size = 1,输入的句子长度 = 512,每个词的向量表示的长度 = 768,那么整个模型的输入就是一个 512*768 维的 tensor。 

1.1  WordPiece Embedding

WordPiece Embedding 是指把 Word 拆成 Piece 一片一片的,使得我们的此表会变得精简,并且寓意更加清晰。 

1.1.1 古典分词方法

古典分词方法是把一句话分成一个个词。比如按标点符号分词 、按语法规则分词和按照空格进行分词。

古典分词方法的缺点:参考Tokenizer-BPE算法原理

  • 对于未在词表中出现的词(Out Of Vocabulary, OOV ),模型将无法处理(未知符号标记为 [UNK])
  • 词表中的低频词稀疏词在模型训无法得到训练(因为词表大小有限,太大会影响效率)
  • 最困难的是很多语言难以用空格进行分词,例如 "loved", "loving", "loves" 这三个单词。其实本身的语义都是“爱”的意思,但是如果我们以单词为单位,那它们就算不一样的词,在英语中不同后缀的词非常的多,就会使得词表变的很大,训练速度变慢,训练的效果不好;又比如模型也无法通过 "old", "older", "oldest" 之间的关系学到 "smart", "smarter", "smartest" 之间的关系,增加了训练冗余,另一方面也造成了大词汇量问题

1.1.2 拆分为单个字符方法

拆分为单个字符方法直接把一个词分成一个一个的字母和特殊符号。虽然能解决 OOV 问题,也避免了大词汇量问题,但缺点也明显,粒度太细,训练花费的成本太高,增加了建模难度。

1.1.3 基于子词的分词方法(Subword Tokenization)

基于子词的分词方法(Subword Tokenization),简称为 Subword 算法,意思就是把一个词切成更小的一块一块的子词。通过一个有限的词表来解决所有单词的分词问题,同时尽可能将结果中 token 的数目降到最低。

BPE(Byte-Pair Encoding)双字节编码,又称 digram coding 双字母组合编码,是 Subword Tokenization 的一种主要的实现方式,通过将数据压缩,来在固定大小的词表中实现可变⻓度的子词。

 BPE 的训练过程:参考BPE算法原理及案例

  • 首先准备足够大的训练语料库;确定期望的 subword 词表大小;
  • 将语料库中所有词分成一个一个的单个字符,然后在末尾添加停止符后缀 "</ w>"(不加 "</ w>" 该子词可以出现在词首;加了 "</ w>" 表明该子词位于词尾,并统计每个字符出现的频率;
  • 挑出频次最高的字符组成字符对合并成新的 subword,将新组成的 subword 加入词表,然后将语料中所有该字符对融合(merge)成 subword(新字符依然可以参与后续的  merge)
  • 重复第 4 步直到达到第 2 步设定的 subword 词表大小或下一个最高频的字节对出现频率为 1 才结束。

BPE 算法通过训练,能够把上面的 3 个单词 "loved", "loving", "loves" 拆分成 "lov", "ed", "ing", "es" 四部分,这样可以把词的本身的意思和时态分开,有效的减少了词表的数量。

1.2 Position Embedding

Position Embedding 是将单词的位置信息编码成特征向量(因为我们的网络结构没有 RNN 或者 LSTM,因此我们无法得到序列的位置信息,所以需要构建一个 Position Embedding)

BERT 和 Transformer 中 Position Embedding 的区别:

BERT 是初始化一个 Position Embedding,然后通过训练将其学出来;而 Transformer 则是通过制定规则来构建一个 Position Embedding。

1.3 Segment Embedding

Segment Embedding 是用于区分两个句子的向量表示。这个在问答等非对称句子中是用区别的。

2 网络结构

BERT 的每一层由一个 Transformer 的 编码层 encoder(一个 Multi-Head-Attention + Residual Connection + Layer Normalization + Feed-Forword + Residual Connection + Layer Normalization)叠加产生。

3 预训练

3.1 训练方法

BERT 的训练方法分为预训练(Pre-Training)和微调(Fine-Turning)两个阶段。参考深入理解预训练(pre-learning)和微调(fine-tuning)

3.1.1 预训练

预训练就是指预先训练的一个模型或者指预先训练模型的过程(现在我们常用的预训练模型都是网上他人调试好的优秀网络模型)

3.1.2 微调

微调就是指将预训练过的模型作用于自己的数据集,并使参数适应自己数据集的过程。

如果不做微调的话:

  • 从头开始训练,需要大量的数据,计算时间和计算资源;
  • 存在模型不收敛,参数不够优化,准确率低,模型泛化能力低,容易过拟合等风险。

3.2 训练任务

3.2.1 掩码语言模型(Masked Language Model, MLM)

BERT 采取了一种随机屏蔽的方法实现双向编码表示,在输入数据中随机将部分字符利用特殊标志 [MASK] 替代,然后预测 [MASK] 替代位置的原本字符是什么。这样处理的优点是在预测 [MASK] 的过程中,模型通过 Self-Attention 机制能够捕获 [MASK] 位置前后的信息,实现了真正的双向表示。

为了减少预训练阶段与微调阶段存在的差异,在 BERT 实际预训练过程中,15% 训练数据的字符 WordPiece Token 会被选择进行以下三种操作中的一种。

① 80% 的概率选择用 [MASK] 替换,例如 “这个篮球是黑色的” 被替换成 “这个篮球是 “ [MASK] ”;

② 10% 的概率选择用另一个随机单词替换,例如 “这个篮球是黑色的” 可能被替换成 “这个篮球是绿色的”;

③ 10% 的概率保持原本单词不变,例如 “这个篮球是黑色的” 保持原语句不变。

3.2.2 下一句预测(Next Sentence Prediction, NSP)

下一句预测是指预测一个句子是否跟在另一个句子后面。选择语料中 50% 的句子,与其相应的下一句一起形成上下句,作为正样本;其余 50% 的句子随机选择一句和非下一句一起形成上下句,作为负样本。通过对模型进行训练,使其能够根据当前句子信息预测出下一个句子的内容。

在句子预测任务中,BERT 预训练模型可以推断两个句子之间的联系。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot和Echarts的全国地震可视化分析实战

目录 前言 一、后台数据服务设计 1、数据库查询 2、模型层对象设计 3、业务层和控制层设计 二、Echarts前端配置 1、地图的展示 2、次数排名统计 三、最终结果展示 1、地图展示 2、图表展示 总结 前言 在之前的博客中基于SpringBoot和PotsGIS的各省地震震发可视化分…

鸿蒙车载原生开发,拓展新版图

一天内连发“五弹”、HiCar 4.0首次上车 华为鸿蒙狂扩“汽车朋友圈”-上游新闻 汇聚向上的力量 3月15日&#xff0c;在“华为云&华为终端云服务创新峰会2024”上&#xff0c;华为首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车加入鸿蒙生态合作&#xff0c;华为…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行&#xff1a;…

【Eviews实战】——多元线性回归模型的建立(二)

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器

wsl 中安装虚拟环境 virtualenv 注意&#xff1a; 不能将虚拟环境安装到 /root 目录下&#xff0c;在 window 文件管理中&#xff0c;没有权限访问 wsl 中的 /root 目录 安装虚拟环境 sudo pip install virtualenv sudo pip install virtualenvwrapper配置环境变量 1、创建…

html5的css使用display: flex进行div居中的坑!

最近做项目的时候&#xff0c;有个需求&#xff0c;一个高度宽度不确定的Div在另一个Div内上下左右居中。 然后以前上下居中用的都是很繁琐的&#xff0c;就打算去百度搜索一个更优秀的方法。 百度AI自己给我一个例子&#xff1a; /* div在容器里居中显示&#xff0c;设置外容…

Tomcat Session集群---会话绑定

实验配置&#xff1a; 7-1安装Nginx 7-2和7-3安装Tomcat 1.配置7-1 1.做负载均衡&#xff0c;反向代理 [rootlocalhost ~]# vim /etc/nginx/nginx.conf17 http {18 upstream tomcat {19 server 192.168.91.102:8080;20 server 192.168.91.103:8080;2…

移动云COCA架构实现算力跃升,探索人工智能新未来

近期&#xff0c;随着OpenAI正式发布首款文生视频模型Sora&#xff0c;标志着人工智能大模型在视频生成领域有了重大飞跃。Sora模型不仅能够生成逼真的视频内容&#xff0c;还能够模拟物理世界中的物体运动与交互&#xff0c;其核心在于其能够处理和生成具有复杂动态与空间关系…

sqllab第二十三关通关笔记

知识点&#xff1a; mysqli_query() 返回值为资源型或布尔型如果内容为查询语句则返回资源型数据&#xff1b;如果内容为插入、更新、删除等语句则返回布尔类型结果mysql_fetch_array() 从结果集中取出一行作为关联数组或数字数组输入内容为指定查询的结果集单引号闭合绕过联…

IP证书有什么作用?怎么申请?

关于IP地址证书&#xff0c;它的主要作用有这么几个点&#xff1a; 1.验明正身&#xff1a;就像身份证一样&#xff0c;它可以证明某个服务器的IP地址是真的、合法的&#xff0c;让咱知道咱们连接的就是正确的服务器&#xff0c;而不是冒牌货。这样一来&#xff0c;就可以降低像…

SpringMVC 02

这里先附上前一篇的地址,以上系列均为博主的学习路线,仅供参考 初识Spring MVC-CSDN博客 下面我们从SpringMVC传递数组开始讲起 1.传递数组 传递数组的方式和传递普通变量的方式其实是相同的,下面我们附上传递的图片 RequestMapping("/r7")public String r1(String[…

uniapp小程序:使用uni.getLocation通过腾讯地图获取相关地址信息详情(超详细)

先看运行结果&#xff1a; 流程&#xff1a; 1、在edge网页搜索腾讯位置服务 搜索后点击这里 已经有账号的就进行登录&#xff0c;没有账号的进行注册即可 点击控制台&#xff1a; 进去后点击成员管理---->我的应用---->创建应用 输入相应的参数应用名称&#xff08;随便…