背景
之前在知乎上回答了一个问题,为什么Bert的三个Embedding可以相加。这是个老问题了。这次重答一下顺便打自己脸,然后推一下国霖(LightGBM作者)在ICLR2021的论文Rethinking Positional Encoding in Language Pre-training。
原问题: Token Embedding、Segment Embedding、Position Embedding的意义我已经清楚了,但是这三个向量为什么可以相加呢?相加后向量的大小和方向就变了,语义不就变了吗?
这个问题一年多,1.3k关注,34个回答。每次看到这种关注多,回答少的问题就两眼放光。说明是一个大家都关注比较有价值的问题,但是也不是那么容易回答。也有不少公众号转了我知乎之前的回答(其实是有毛病的,倒是知乎养了一大波自媒体号),那就从这个问题出发,探讨下Bert起作用的机制吧。
去年3月份,我在知乎上想当然地回答了这个问题,后来国霖(LightGBM作者)也亲自回答了这个问题,并纠正了我想法的一些错误,大佬在做的论文通过实验,把我想当然的想法一顿打脸。对于这种行为,我只想说,求多来几次!
大家来找茬
我回答的基本观点是,
1. transformer不具有很好的上下文感知能力,这里的相加,是特征交叉的表达方法。可以带来上下文的语义信息。
2.Bert输入的token是BPE和中文char。这个要比单词,和中文词粒度更粗,分布更均匀一些。加上位置的Embedding能把这些粒度更粗的token带来个性化的表达能力。
3.因为表征空间含义的不同,这里的加算不上池化(avg pooling*3),只能是为了带入位置信息的交叉操作。
看起来似乎没啥问题。
再仔细想想最初回答的毛病在哪呢?
其实是2和3,仔细想一下,似乎token的位置,跟他的语义关系差别不大。跟token间的相对位置关系和组合更大一点。
重新思考位置embeding
国霖在这个方向研究的更深了。
它论文真的是针对这个点来研究的,就是位置的embedding到底要不要和token的embedding做交叉。
在这个地方,不仅仅是这里做了加这个操作的交叉,在这还好。在selfattention里,融合后的Embedding,直接做了更复杂的特征交叉融合。具体可以通过公示来看。在不考虑seg embedding的情况下:
算attention里相似度参数的这个式子有四项,w是token embedding,p是位置embedding,拆开位置和token的表达,中间两项涉及到了w和p的乘交叉。
论文从可解释的角度,论证了一下为啥这个交叉可能没用。
从左到右分别是 token-to-token, token-to-position, position-to-token, position-to-position 在 attention 里面算出来的权重. 可以看到 position 和 token 之间的关联并不是特别强。(这里原文引用了大佬的知乎回答)
他的推演其实不难。就是把位置和token做乘法的项给去掉。
注意根号2d是为了维持量纲。
实验结果也表示了,这样做的效果有好几个好处:
第一,预训练收敛更快了。
第二,下游任务的平均分,GLUE评测上,都有不少的提升。
原文还有其他细节,比如特殊处理了[CLS] token 的 position,防止这么干造成positional locality 而忽略了整个句子的信息。推荐大家去仔细看看原文!
后话
总结起来,带入位置信息可以,不要想当然地和token交叉了,这种操作没有好处哦。
反过头来想想,transformer每一层都要补一下位置信息的输入,如果像前面说的词在什么位置,有什么含义就记住了。
那是真的没有必要这么搞了。
嗯,深度玄学,直觉的东西可能不合理,顺着一点线索实验,可能就是一篇有启发的文章啦。提醒我们应该通过实验来验证自己的想法,不要太想当然了。
【引用】
1.原问答 https://www.zhihu.com/question/374835153/answer/1080315948
2.Ke G, He D, Liu T Y. Rethinking positional encoding in language pre-training[J]. arXiv preprint arXiv:2006.15595, 2020.