embedding层_BERT的嵌入层是如何实现的?看完你就明白了

b96b31855da4a87fcfb97cf3245f7a44.png
作者:__
编译:ronghuaiyang (AI公园)
原文地址:
BERT的嵌入层是如何实现的?看完你就明白了​mp.weixin.qq.com
db8373dc1f1a8ab03dcea3a4f883af58.png

非常简单直白的语言解释了BERT中的嵌入层的组成以及实现的方式。

介绍

在本文中,我将解释BERT中嵌入层的实现细节,即token嵌入、Segment嵌入和Position嵌入。

简介

这是一张来自论文的图,它恰当地描述了BERT中每一个嵌入层的功能:

c45143b031fa93f075dc16869781ca8f.png

与大多数旨在解决nlp相关任务的深度学习模型一样,BERT将每个输入token(输入文本中的单词)通过token嵌入层传递,以便将每个token转换为向量表示。与其他深度学习模型不同,BERT有额外的嵌入层,以Segment嵌入和Position嵌入的形式。这些附加的嵌入层的原因会在本文的最后变得清楚。

Token嵌入

目的

如前一节所述,token嵌入层的作用是将单词转换为固定维的向量表示形式。在BERT的例子中,每个单词都表示为一个768维的向量。

实现

假设输入文本是“I like strawberries”。下图描述了token嵌入层的作用:

326cbbc6134a33a2968af0e04df60194.png

在将输入文本传递到token嵌入层之前,首先对其进行token化。另外,在tokens的开始([CLS])和结束([SEP])处添加额外的tokens。这些tokens的目的是作为分类任务的输入表示,并分别分隔一对输入文本(更多细节将在下一节中介绍)。

tokens化是使用一种叫做WordPiece token化的方法来完成的。这是一种数据驱动的token化方法,旨在实现词汇量和非词汇量之间的平衡。这就是“strawberries”被分成“straw”和“berries”的方式。对这种方法的详细描述超出了本文的范围。感兴趣的读者可以参考Wu et al. (2016)和Schuster & Nakajima (2012)中的第4.1节。单词token化的使用使得BERT只能在其词汇表中存储30522个“词”,而且在对英语文本进行token化时,很少会遇到词汇表以外的单词。

token嵌入层将每个wordpiece token转换为768维向量表示形式。这将使得我们的6个输入token被转换成一个形状为(6,768)的矩阵,或者一个形状为(1,6,768)的张量,如果我们包括批处理维度的话。

Segment嵌入

目的

BERT能够解决包含文本分类的NLP任务。这类问题的一个例子是对两个文本在语义上是否相似进行分类。这对输入文本被简单地连接并输入到模型中。那么BERT是如何区分输入的呢?答案是Segment嵌入。

实现

假设我们的输入文本对是(“I like cats”, “I like dogs”)。下面是Segment嵌入如何帮助BERT区分这个输入对中的tokens :

a861e0423ad808e60bcd6482681a1ab8.png

Segment嵌入层只有两个向量表示。第一个向量(索引0)分配给属于输入1的所有tokens,而最后一个向量(索引1)分配给属于输入2的所有tokens。如果一个输入只有一个输入语句,那么它的Segment嵌入就是对应于Segment嵌入表的索引为0的向量。

Position嵌入

目的

BERT由一堆Transformers 组成的,广义地说,Transformers不编码其输入的顺序特征。在这个博客文章:https://medium.com/@init/how-self-attention-with-relatedposition-representations-works-28173b8c245a的动机部分更详细地解释了我的意思。总之,有Position嵌入将允许BERT理解给定的输入文本,比如:

I think, therefore I am

第一个“I”不应该与第二个“I”具有相同的向量表示。

实现

BERT被设计用来处理长度为512的输入序列。作者通过让BERT学习每个位置的向量表示来包含输入序列的顺序特征。这意味着Position嵌入层是一个大小为(512,768)的查找表,其中第一行是第一个位置上的任意单词的向量表示,第二行是第二个位置上的任意单词的向量表示,等等。因此,如果我们输入“Hello world”和“Hi there”,“Hello”和“Hi”将具有相同的Position嵌入,因为它们是输入序列中的第一个单词。同样,“world”和“there”的Position嵌入是相同的。

合并表示

我们已经看到,长度为n的token化输入序列将有三种不同的表示,即:

  • token嵌入,形状(1,n, 768),这只是词的向量表示
  • Segment嵌入,形状(1,n, 768),这是向量表示,以帮助BERT区分成对的输入序列。
  • Position嵌入,形状(1,n, 768),让BERT知道其输入具有时间属性。

对这些表示进行元素求和,生成一个形状为(1,n, 768)的单一表示。这是传递给BERT的编码器层的输入表示。

总结

在本文中,我描述了BERT的每个嵌入层的用途及其实现。如果你有任何问题,请在评论中告诉我。

英文原文:https://medium.com/@init/why-bert-has-3-embedding-layers-and-their-implementation-details-9c261108e28a

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值