![]()
BERT 预训练模型问世以来,改变了很多 NLP 任务的习惯。很多 NLP 任务都会直接在 BERT 的基础上做一个 fine-tune,构建一个 baseline 模型,既快捷也使用,但 BERT 在做文本表达任务时也有一些明显的缺点。
既然有缺点,那这么卷的深度学习领域肯定会有解决方法。于是 BERT-flow、BERT-whitening 及 SimCSE 就来了。
最近刚好也在做文本表达类的任务,就把这个任务相关的文章学习总结了一下,欢迎交流学习。
BERT存在的两个问题
1.1 BERT encode出来的向量表达具有各向异性
什么叫各向异性?举个例子,一些电阻原件,正接是良导体,反接是绝缘体或者电阻很大,沿不同方向差异很大。在 BERT 出来的向量中表现为,用不同的方式去衡量它,他表现出不同的语义,差别很大,也就是不能完整的衡量出 BERT 向量中全部语义信息。
在 ICLR 里有两篇文章(ICLR 2019 文章
[1]
、 ICLR 2020
[2]
)也对这种现象进行了一个研究,表面 Transform 模型出来的向量表达(如 BERT、GPT2)就是会产生各向异性,且也给出了各向异性的表现状态,就是向量会不均匀分布,且充斥在一个狭窄的锥形空间下。
这种性质也限制了句子向量的语义表达能力,因此当采用计算 BERT encode 句子相似度,采用 cos 或 dot 是无法很好的衡量出两个句子的相似度的,因为 BERT 向量不是基于一个标准正交基得到的。
1.2 分布不均匀,低频词分布稀疏,高频词分布紧密
也就是高频词会集中在头部,离原点近,低频词会集中在尾部,离远点远高频词与低频词分布在不同的区域,那高频词与低频词之间的相识度也就没法计算了。这也反映出来的就是明显的低频词没有得到一个很好的训练。同时,高频词频次高,也会主宰句子表达。
![]()
以上是 BERT encode 句子向量具有的两个明显的问题:1)句子向量具有各向异性;2)向量分布不均匀,低频词稀疏,高频词紧密,且聚集于不同的分布空间。
既然问题已经定义清楚了,那这么卷的 NLP 领域肯定会有解决方法。因此 BERT-flow 还有 Bert-whitening 就出现了,这两篇文章解决的都是问题是一致的,都是想解决句子 embedding 的各向异性及向量的分布不均匀问题。
流式变换BERT-flow
![]()
On the Sentence Embeddings from Pre-trained Language Models
EMNLP 2020
https://arxiv.org/abs/2011.05864
https://github.com/bohanli/BERT-flow
BERT-flow 在文中详细总结并分析了以上两个问题之后,思想也比较直接,既然 BERT 出来的 embedding 向量存在各向异性,进而也产生了分布不均匀问题,那我就采用一个变换,将 BERT encode 的句子表达转换到一个各向同性且分布较均匀的空间。而标准的高斯分布刚好是一个各向同性的空间,且是一个凸函数,语义分布也更平滑均匀。
![]()
于是,变换就来了。BERT-flow 采用一种流式可逆变换,记为:
![]()
其中 u 就是 BERT 空间向量(observe space),z 即是高斯空间向量(latent space),
则是一个可逆变换,这个变换也是模型需要学出来的。
![]()
那模型优化目标的也就是最大化这个 u 的边际概率。
![]()
最后,通过无监督的方式 maximize 这个优化目标,得到可逆的映射变换 f,这其实就是在 Bert pre-train model 后接了一个 flow 变换的模型,让其继续 pre-train,学出 flow 变换,从而完成向量空间的 transform。
BERT-flow 完整分析了BERT 句子 embedding 里存在的向量各向异性及分布不均匀问题,并列出了完整的实验结果佐证了这一现象。同时提出了一种 flow 变换,将各向异性的 BERT 向量转换到一个标准的高斯分布空间,从而有效的提升了无监督领域的文本表达效果(另外 BERT-flow 还提了个小技巧,采用 BERT 输出的 first-layer+last-layer 平均会更好,这点原文 avg-last-2layer 可能有误,GitHub issue
[3]
有讨论)。
虽然这种 BERT-flow 方法站在现在的角度看还是复杂了些,但 BERT-flow 这篇文章完整的梳理出了问题脉络,并对这些问题通过实验做出了完整的剖析与实验佐证,读起来很顺畅,推荐大家看语义向量表达的问题时可以从这篇看起。
![]()
带白化处理的BERT-whitening
在解决问题的路上,方法总是会朝着简单的方向进行迭代更新。于是 BERT-whitening 带着更简单的变换方法来了。
![]()
Whitening Sentence Representations for Better Semantics and Faster Retrieval
https://arxiv.org/abs/2103.15316
https://github.com/bojone/BERT-whitening
既然是要做一个向量的转换,那有没有简单一点的方法,直接校正句向量?BERT-whitening 提出通过一个白化的操作直接校正局向量的协方差矩阵,简单粗暴,也达到了与 BERT-flow 差不多的效果。
方法很简单,思路也很直接,就是将现存的 BERT 向量空间分布记
,其中均值为
,协方差
,进行白化操作,转换成
,
为单位阵的分布,也就是进行如下表达转换:
![]()
所以问题就变成计算 BERT 向量分布的均值
以及协方差
。
假设向量集合为
,怎么求解均值
以及协方差
,下面图是作者苏神的博客你可能不需要 BERT-flow:一个线性变换媲美 BERT-flow
[4]
的推导,基础的数学知识就能看懂,可以去博客看完整推导,很详细,这里就不做详细阐述了。
![]()
BERT-whitening 确实在 BERT-flow的基础上,更简单更直接的对原 BERT 向量进行空间分布转换,也达到 BERT-flow 差不多甚至更好的效果,加上作者的完整推导分享,思路也很清晰易懂,同时在 SVD 矩阵分解那一步,可以针对对角阵 Λ 进行一个降维操作,只保留特征值大的前 n 个维度,剔除冗余维度,这无疑在工程上应用节省了内存,也提升了性能。
![]()
对比学习的SimCSE
![]()
SimCSE: Simple Contrastive Learning of Sentence Embeddings
EMNLP 2021
https://arxiv.org/abs/2104.08821
https://github.com/princeton-nlp/simcse
SimCSE 是陈丹琦组的文章,陈丹琦组的文章总是会带来的不一样的惊喜。这篇文章有点重剑无锋,大巧不工的意思,采用简单的 dropout 方法+对比学习在文本表达上就达到 SOTA 了。
![]()
SimCSE 分为无监督与有监督版本,但基本思想上没有什么区别,只是在正负样本数据构造上不同。
无监督版本
上,就是将一个句子输入 encoder 两次,由于 bert encoder 是一个随机 dropout mask encoder,因此输入一个句子两次会得到两个不同的 embedding,产生的这两个 embedding 作为训练中相互对比的正样本,同一个 batch 中其他句子产生的 embedding 则作为负样本,以此来构造一个对比学习的无监督训练。(所以这里的 batch 数量应当尽可能的大一些,防止 batch 内出现与自身文本是相同语义的样本出现作为负样本,减少在 loss 中这种相同语义样本占的比重)。
思路很简单,loss 也容易理解,就是常规对比学习的 loss 设计,max(正样本间的距离),min(负样本间的距离), 加了一个温度因子 t 进行平滑调节。
![]()
有监督版本
上,因为有监督数据了就不是重复输入一个文本两次,将自身文本以及正样本 entailment 以及负样本 contradiction 分别输入 encoder,得到对应 embedding,entailment 样本即为正样本,同一 batch 内其他样本的 embedding 作为负样本进行对比学习,loss 上与无监督是一致的,只是数据构造上的区别。
在理解 SimCSE 有效之前,首先得定义一下 alignment 和 uniformity 这两个指标,这两指标 Wang and Isola(2020)提出
[5]
,用来评估对比学习中 embedding 的效果,都是越小越好。
![]()
Alignment:
评估的是相似的样本向量间的一致性,也就是说相似样本间有相似的feature,差距应该小。
![]()
uniformity:
评估的是向量整体分布的均匀程度,也就是说向量应该均匀分布在球面上,不应该出现 BERT 那种分布不均(高频词分布集中紧凑,低频词稀疏)。
![]()
文章中设置不同的 dropout 率做了八组实验,其中 fixed 0.1 是使用同样的 dropout mask 做两次(也就是自己与正样本得到一样的 embedding),这里发现 dropout=0、dropout=fix 0.1 差别很大,按道理来说,自身与自身产生的正样本
与
是一样的 embedding,怎么会差别这么大?
![]()
文中对于上述情况,做了一个结果反推现象上的分析,画出了训练过程迭代中 Alignment、uniformity 指标分析图,发现随着迭代进行 4 个方法都可以减少 uniform,也就是分布都会走向均匀分布。但 fixed0.1 和 no dropout 优化不动 alignment,反而增大了。
![]()
有些遗憾的是,文章中并没有看到对 dropout=0、dropout=fix 0.1 反差很大的这种情况做出由因及果的理论上的分析,感觉只看到了结果,没有找到合理的解释原因少了点什么,可能是 dropout=0.1 破坏了原有句子的基础 embedding 语义信息,使得效果还比不上 dropout=0。
SimCSE 方法上大道至简,在解决像 BERT 这种 Transformer结构出来的 embedding 的各向异性及分布不均匀问题上,提出了一个更简单易行的方案,在有监督及无监督任务上都达到了 SOTA,证明了通过 dropout 构造的样本进行对比学习有效性可行性。
[1] https://arxiv.org/abs/1907.12009
[2] https://openreview.net/forum?id=ByxY8CNtvr
[3] https://github.com/bohanli/BERT-flow/issues/11
[4] https://spaces.ac.cn/archives/8069
[5] http://proceedings.mlr.press/v119/wang20k/wang20k.pdf
感谢 TCCI 天桥脑科学研究院对于 PaperWeekly 的支持。TCCI 关注大脑探知、大脑功能和大脑健康。
![]()
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
![]()
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
![]()