为什么BERT有3个嵌入层,它们都是如何实现的

目录

  • 引言
  • 概览
  • Token Embeddings
    • 作用
    • 实现
  • Segment Embeddings
    • 作用
    • 实现
  • Position Embeddings
    • 作用
    • 实现
  • 合成表示
  • 结论
  • 参考文献

本文翻译自Why BERT has 3 Embedding Layers and Their Implementation Details

引言

? 本文将阐述BERT中嵌入层的实现细节,包括token embeddings、segment embeddings, 和position embeddings.

概览

? 下面这幅来自原论文的图清晰地展示了BERT中每一个嵌入层的作用:

? 和大多数NLP深度学习模型一样,BERT将输入文本中的每一个词(token)送入token embedding层从而将每一个词转换成向量形式。但不同于其他模型的是,BERT又多了两个嵌入层,即segment embeddings和 position embeddings。在阅读完本文之后,你就会明白为何要多加这两个嵌入层了。

Token Embeddings

作用

? 正如前面提到的,token embedding 层是要将各个词转换成固定维度的向量。在BERT中,每个词会被转换成768维的向量表示。

实现

? 假设输入文本是 “I like strawberries”。下面这个图展示了 Token Embeddings 层的实现过程:

? 输入文本在送入token embeddings 层之前要先进行tokenization处理。此外,两个特殊的token会被插入到tokenization的结果的开头 ([CLS])和结尾 ([SEP]) 。它们视为后面的分类任务和划分句子对服务的。

? tokenization使用的方法是WordPiece tokenization. 这是一个数据驱动式的tokenization方法,旨在权衡词典大小和oov词的个数。这种方法把例子中的“strawberries”切分成了“straw” 和“berries”。这种方法的详细内容不在本文的范围内。有兴趣的读者可以参阅 Wu et al. (2016)Schuster & Nakajima (2012)。使用WordPiece tokenization让BERT在处理英文文本的时候仅需要存储30,522 个词,而且很少遇到oov的词。

? Token Embeddings 层会将每一个wordpiece token转换成768维的向量。这样,例子中的6个token就被转换成了一个(6, 768) 的矩阵或者是(1, 6, 768)的张量(如果考虑batch_size的话)。

Segment Embeddings

作用

? BERT 能够处理对输入句子对的分类任务。这类任务就像判断两个文本是否是语义相似的。句子对中的两个句子被简单的拼接在一起后送入到模型中。那BERT如何去区分一个句子对中的两个句子呢?答案就是segment embeddings.

实现

? 假设有这样一对句子 (“I like cats”, “I like dogs”)。下面的图成仙了segment embeddings如何帮助BERT区分两个句子:

? Segment Embeddings 层只有两种向量表示。前一个向量是把0赋给第一个句子中的各个token, 后一个向量是把1赋给第二个句子中的各个token。如果输入仅仅只有一个句子,那么它的segment embedding就是全0。

Position Embeddings

作用

? BERT包含这一串Transformers (Vaswani et al. 2017),而且一般认为,Transformers无法编码输入的序列的顺序性。 博客更加详细的解释了这一问题。总的来说,加入position embeddings会让BERT理解下面下面这种情况:

I think, therefore I am

第一个 “I” 和第二个 “I”应该有着不同的向量表示。

实现

? BERT能够处理最长512个token的输入序列。论文作者通过让BERT在各个位置上学习一个向量表示来讲序列顺序的信息编码进来。这意味着Position Embeddings layer 实际上就是一个大小为 (512, 768) 的lookup表,表的第一行是代表第一个序列的第一个位置,第二行代表序列的第二个位置,以此类推。因此,如果有这样两个句子“Hello world” 和“Hi there”, “Hello” 和“Hi”会由完全相同的position embeddings,因为他们都是句子的第一个词。同理,“world” 和“there”也会有相同的position embedding。

合成表示

? 我们已经介绍了长度为n的输入序列将获得的三种不同的向量表示,分别是:

  • Token Embeddings, (1, n, 768) ,词的向量表示
  • Segment Embeddings, (1, n, 768),辅助BERT区别句子对中的两个句子的向量表示
  • Position Embeddings ,(1, n, 768) ,让BERT学习到输入的顺序属性

? 这些表示会被按元素相加,得到一个大小为(1, n, 768)的合成表示。这一表示就是BERT编码层的输入了。

结论

? 在本文中,笔者介绍了BERT几个嵌入层的作用以及实现。

参考文献

原文地址:https://www.cnblogs.com/d0main/p/10447853.html

时间: 2024-10-11 21:59:19

为什么BERT有3个嵌入层,它们都是如何实现的的相关文章

请问JAVA三层架构,持久层,业务层,表现层,都该怎么理解?和MVC三层模型有什么区别

持久层用来固化数据,如常说的DAO层,操作数据库将数据入库业务层用来实现整体的业务逻辑 如 前台获得了数据,逻辑层去解析这些数据,效验这些数据等操作表现层很好解释  你现在看到的网页 一些界面 都属于表现层的东西可以用一些Html,jsp,Swing来实现至于mvc么对应的是 model(模型) view(视图) Controller(控制)在javaweb中就很好理解了再XX系统中,前台页面属于view 贯穿前台后台持久层的一套模型就是model(EJB,Spring来实现)  而连接前台后台

BERT论文解读

本文尽量贴合BERT的原论文,但考虑到要易于理解,所以并非逐句翻译,而是根据笔者的个人理解进行翻译,其中有一些论文没有解释清楚或者笔者未能深入理解的地方,都有放出原文,如有不当之处,请各位多多包含,并希望得到指导和纠正. 论文标题 Bert:Bidirectional Encoder Representations from Transformers 一种从Transformers模型得来的双向编码表征模型. 论文地址 https://arxiv.org/pdf/1810.04805 Abstr

FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器[转]

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一.Lua的轻量.小巧.概念之简单,都使他变得越来越受欢迎.本人也使用过python做嵌入式脚本,二者各有特点,关于python之后会写相关的文章,python对于我而言更喜欢用来编写工具,我前边一些相关的算法也是用python来实现的.今天主要讲Lua相关的开发技术.Lua具有如下特点: Lua 拥有虚拟机的概念,而其全部用标准C实现,不依赖任何库即可编译安装,更令人欣喜的是,整个Lua 的实现代码并不算多,

深度学习中Embedding层的作用

使用Embedding的原因: 使用One-hot 方法编码的向量会很高维也很稀疏.假设我们在做自然语言处理(NLP)中遇到了一个包含2000个词的字典,当时用One-hot编码时,每一个词会被一个包含2000个整数的向量来表示,其中1999个数字是0,要是我的字典再大一点的话这种方法的计算效率岂不是大打折扣? 训练神经网络的过程中,每个嵌入的向量都会得到更新.如果你看到了博客上面的图片你就会发现在多维空间中词与词之间有多少相似性,这使我们能可视化的了解词语之间的关系,不仅仅是词语,任何能通过嵌

用深度学习做命名实体识别(六)-BERT介绍

什么是BERT? BERT,全称是Bidirectional Encoder Representations from Transformers.可以理解为一种以Transformers为主要框架的双向编码表征模型.所以要想理解BERT的原理,还需要先理解什么是Transformers. Transformers简单来说是一个将一组序列转换成另一组序列的黑盒子,这个黑盒子内部由编码器和解码器组成,编码器负责编码输入序列,然后解码器负责将编码器的输出转换为另一组序列.具体可以参考这篇文章<想研究B

BERT模型内部结构解析

BERT强大的特征抽取能力在各方面的应用如火如荼的展开,今日准备要对BERT输出的特征进行组合,以期能具有更好地变现,现在对model对象做详细的分析. 直观上,我们能够利用bert的信息有:1)pool out [CLS]:2)encoder layer:3)hidden state first output 我们加载bert的过程如下: model = modeling.BertModel(config=bert_config, is_training=self.__is_training,

数据预处理:分类变量实体嵌入做特征提取

实体嵌入(embedding)目的将表格数据中的分类属性(一个至多个)向量化. 1.实体嵌入简介: 实体嵌入是主要应用于深度学习中处理表格分类数据的一种技术,或者更确切地说NLP领域最为火爆,word2vec就是在做word的embedding. 神经网络相比于当下的流行的xgboost.LGBM等树模型并不能很好地直接处理大量分类水平的分类特征.因为神经网络要求输入的分类数据进行one-hot处理.当分类特征的水平很高的时候,one-hot经常带来维度爆炸问题,紧接着就是参数爆炸,局部极小值点

Winform应用程序实现通用遮罩层二

之前先后发表过:<Winform应用程序实现通用遮罩层>.<Winform应用程序实现通用消息窗口>,这两款遮罩层其实都是基于弹出窗口的,今天为大家分享一个比较简单但界面相对友好的另一种实现方案,废话不多说,直接进入主题. 一.实现思路(解决问题顺序): 透明遮罩: 1.实现可设置透明的Panel控件(MaskPanel): 2.Panel控件(MaskPanel)能够覆盖父容器(一般是当前窗体form对象)客户区区域(即:与父容器客户区区域大小相同),并处于最上层,保证父容器上的

Bluetooth Low Energy链路层

1. 介绍 1.1 链路状态机 链路层操作可以描述为链路状态机(The Link Layer State Machine) 链路状态机有如下五种状态 - Standby State: 准备,不传输或接受数据包 - Advertising State: 广播, advertiser,发送advertising channel packets,接受来自scanner的响应 - Scanning State: 监听/扫描, scanner,监听来自advertiser的advertising chan