为什么Bert的三个Embedding可以进行相加?

点击上方,选择星标置顶,每天给你送干货

阅读大概需要9分钟

跟随小博主,每天进步一丢丢

整理:zenRRan

来自:深度学习自然语言处理公众号

学术分享,侵删~

知乎问题:

Token Embedding、Segment Embedding、Position Embedding的意义我已经清楚了,但是这三个向量为什么可以相加呢?相加后向量的大小和方向就变了,语义不就变了吗?(可能是我数学学得不好,不能理解)

链接:https://www.zhihu.com/question/374835153

高赞一:苏剑林

高赞一:苏剑林

那只能说明你还不了解Embedding的意义。

Embedding的数学本质,就是以one hot为输入的单层全连接。请参考: https://kexue.fm/archives/4122

也就是说,世界上本没什么Embedding,有的只是one hot。

现在我们将token,position,segment三者都用one hot表示,然后concat起来,然后才去过一个单层全连接,等价的效果就是三个Embedding相加。

高赞二:海晨威

这是一个很有意思的问题,苏剑林老师给出的回答,真的很妙:

Embedding的数学本质,就是以one hot为输入的单层全连接。
也就是说,世界上本没什么Embedding,有的只是one hot。

在这里想用一个简单的例子再尝试理解一下:

假设 token Embedding 矩阵维度是 [4,768];position Embedding 矩阵维度是 [3,768];segment Embedding 矩阵维度是 [2,768]。

对于一个字,假设它的 token one-hot 是[1,0,0,0];它的 position one-hot 是[1,0,0];它的 segment one-hot 是[1,0]。

那这个字最后的 word Embedding,就是上面三种 Embedding 的加和。

如此得到的 word Embedding,和concat后的特征:[1,0,0,0,1,0,0,1,0],再过维度为 [4+3+2,768] = [9, 768] 的全连接层,得到的向量其实就是一样的。

再换一个角度理解:

直接将三个one-hot 特征 concat 起来得到的 [1,0,0,0,1,0,0,1,0] 不再是one-hot了,但可以把它映射到三个one-hot 组成的特征空间,空间维度是 4*3*2=24 ,那在新的特征空间,这个字的one-hot就是[1,0,0,0,0...] (23个0)。

此时,Embedding 矩阵维度就是 [24,768],最后得到的 word Embedding 依然是和上面的等效,但是三个小 Embedding 矩阵的大小会远小于新特征空间对应的 Embedding 矩阵大小。

当然,在相同初始化方法前提下,两种方式得到的 word Embedding 可能方差会有差别,但是,BERT还有Layer Norm,会把 Embedding 结果统一到相同的分布。

BERT的三个Embedding相加,本质可以看作一个特征的融合,强大如 BERT 应该可以学到融合后特征的语义信息的。

高赞三:包大人

题主你是这样提问的: Embedding的意义我已经清楚了,但是这三个向量为什么可以相加呢?相加后向量的大小和方向就变了,语义不就变了吗?(可能是我数学学得不好,不能理解)

其实你已经回答了自己的问题了。

观察了一下其他答主的回答,还是没有回答到点子上,这个问题的答案就是合理地构造语义的变化。

这里的相加是特征交叉而不是特征池化。

神经网络中相加是构造特征交互的方法,类似的还有elementwise乘,减法。

Bert这类的方法一个极大的优势就是通过BPE和字级别把词向量空间的稀疏性压缩下来,如果你在普通的embedding+nn里做这件事情,是有得有失的,好处是长尾的词变得更稠密了,使网络容易学习,对应的缺点就是损失了学的好的词的个性化。这样的操作更有利于神经网络的泛化。

我们怎么在其中找一个平衡点呢?通过特征的交叉,分别是token,position,segment。高阶的交叉带来更强的个性化表达能力,即带来丰富语义的变化。规避了transformer因为位置信息丢失造成的上下文语义感知能力。既能高速并行,又能上下文敏感,这简直让lstm羡慕死了。

而相加,是神经网络特征交叉的一种形式,注意,多个enbedding的向量空间是不同的,不然,相加和池化就没有区别了,只带来信息的聚合,而不是个性化的表达。

这套方法论起源于因子分解机FM。核心是寻找泛化和记忆的平衡,而搞定长尾是又是解决大部分NLP问题的有效方法。预训练又是另外一大神器,结合这个问题想想为什么ELMo没有取得这么好的效果,不得不不说,太妙了。

高赞四:柯国霖

我们最近的一个工作刚好和这个相关,具体可以看刚挂出来的论文 Rethinking Positional Encoding in Language Pre-training 和 GitHub 代码 https://github.com/guolinke/TUPE 。

TL;DR 把 positional embedding 从 input 拆开会更好。

先简单说一下背景。因为 Transformer 在结构上不能识别来自不同位置的 token,一般需要用 positional embedding 来辅助。最简单的做法就是在 input token embedding 上直接加 positional embedding (NSP loss现在基本不用,所以这里不再考虑 segment embedding)。然后在 Transformer 的 self-attention 里,会把 input 用三个矩阵映射到不同的空间,Q,K,V,接着把 Q 和 K 做点积,过 softmax ,得到 attention 的 weight 。因此,在第一层 Transformer 的 QK 点积 ,我们可以得到:

其中, 是 softmax 之前对 pair (i, j) 的 logits, 是 token embedding, 是 positional embedding, 是映射到 Q 和 K 所用的矩阵。在上面展开的式子里,我们发现两个问题:1)中间两项引入了 token 和 position 的交叉。这里有回答说引入这些交叉有好处,但我们觉得这并不一定(毕竟炼丹),没有理由说某个位置和某个词一定有很强的关联。为了验证整个,我们对展开后的四项做了可视化。如下图所示,可以看到中间两项看起来很均匀,说明position 和 token 之间确实没有太强的关联;2)token 和 position 用了相同的矩阵做 QKV 的变换。但 position 和 token 所包含的信息不一样,共享矩阵也不合理。

从左到右分别是 token-to-token, token-to-position, position-to-token, position-to-position 在 attention 里面算出来的权重. 可以看到 position 和 token 之间的关联并不是特别强

为了解决上述两个问题,我们做了个简单的改动:

其中, 是把 positional embedding 映射到 Q 和 K 所用的矩阵, 用于维持 的量纲 (这里要考虑 layer normalization,具体细节参考我们的论文)。简单来说,我们去掉了 position 和 token 之间的交叉,同时用了不同的变换矩阵。需要注意的是,在多层的 Transformer 模型里,比如 BERT,上面式子的第二项在不同层之间是共享的。因此,这里仅需要算一次,几乎没有引入额外的计算代价。

实验结果表明,按上面的式子把 positional embedding 从 input 拆开后,不仅 pre-training loss 收敛得更快,下游任务的表现也更好。另外,我们还特殊处理了 [CLS] token 的 position,使其不会因 positional locality 而忽略了整个句子的信息。这个也能带来不小的提升。整体的实验结果如下,可以看到,我们的方法不仅最后比 baseline 要好很多,并且可以在 30% (300k-step) 的时候,就达到 baseline 在 1000k-step 时的效果。

下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!

后台回复【五件套】
下载二:南大模式识别PPT

后台回复【南大模式识别】

说个正事哈

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐两个专辑给大家:

专辑 | 李宏毅人类语言处理2020笔记

专辑 | NLP论文解读

专辑 | 情感分析


整理不易,还望给个在看!
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值