来自:NLP从入门到放弃
今天分享的论文解决了我很久以来的一个疑惑,名字叫做:On the Sentence Embeddings from Pre-trained Language Models[1]:
这个论文主要探讨两个问题:
本文主要聊第一点,先说一下结论:
Bert向量空间并不平滑,有些区域不好被定义,也就是说是存在问题的,导致简单的相似性度量不能很好起到度量作用。
简单说就是Bert输出向量语义信息是足够的,但是consine这种简单东西不能很好的度量出来而已。
那么就有大致两个解决办法:转化Bert的输出空间或者使用其他的有用的相似性度量函数。
论文使用的是第一种,对Bert的输出空间做了一个转化,这个不细说,大家去看原论文。
我简单说一下我之前遇到的问题:
Bert出来之后,在下游任务上,横扫各大榜单。
一个最基础的应用是使用【cls】的输出向量微调做文本分类任务;
这样做的前提我们认为因为由于自注意力的存在,【cls】可以看到全局的信息。
但是需要注意的是,上面这句话绝对不代表没有在具体任务微调过的【CLS】向量可以代表整个句子的语义信息。
为什么这么说呢?
我们使用【CLS】向量做无监督的文本匹配,会发现一个非常奇怪的现象。
一般直觉上认为,由于Bert强大的编码能力,应该可以很好的表示语义信息,所以做无监督语义匹配,准确度应该还不错。
但是结果会发现相似度都比较大,没有什么区分度。
更进一步,我们可以对Bert输出,不仅仅是【CLS】向量,可以使用所有Tokens的输出向量做各种操作:max/mean/min Pooling等等吧。
甚至我们可以使用倒数第1/2/3/4或者把最后几层输出联合起来使用。
总之各种骚操作之后,会发现,无监督文本匹配效果依然不好。
究其原因就是👇谈到的词向量的各向异性。
我们来详细说说Bert的向量空间存在的问题。
之前的论文发现Bert的词向量存在各向异性(anisotropic),两个现象
根据词频来区分不同的单词,然后计算不同词频的单词距离原点的距离,发现词频越低,距离原点越远。
我们希望句子的embedding表达可以用来度量句子之间的相似性;但是如果单词的embedding的分布是受词频影响的,那么这种相似性是不能让人信服的。
我举个简单的例子,两句话,A和B:
不同的单词是【喜欢】和【爱】。我们假设哈,假设【喜欢】出现的频次足够的高,那么它离原点就足够的近。【爱】出现的频率足够的低,那么它离原点就足够的远。
这样的话,词频信息就误导了我最终句子向量的表达,那么embdding度量相似性就不靠谱了。
基于上面的1,论文观察到,词频高的词汇分布的密集,词频低的词汇分布的稀疏。
这一点问题很大,因为如果存在稀疏性,那么在词频低的词汇周围,就会存在很多意义不明的地方。
我们可以直观的想一下,如果分布的很稀疏,那么也就是词与词之前的空间存在大量的不确定性,这些地方是没有明确的语义信息表达的。
如果我们最终所有单词的加和正合适落在这种语义不明确的地方,那么相似性的度量准确度自然很低。
其实还有一个小点我想说一下,就是自己做实验的时候,会发现语义匹配效果不好的体现是因为consine计算出来的相似度基本都大于0.9。
文中解释了为啥效果不好,但是并没有详细说为啥相似度计算出来都很大。(或者是有提到但是我粗心错过了)
针对这一点,我想说一下我自己的感受。
我觉得这两点的结合是根本原因:高频离原点近+高频分布紧密。
怎么说呢?
这句话其实可以这么理解:高频词基本都挤在一块了。
句子大部分还是高频词占主要部分,在计算句子向量sen-emb的的时候,我们的操作是直接相加。
那么计算出来的和当然相似度就很高。
我这个解释不严谨,没啥严格证明,但是我觉得比较容易理解。
简单来说,就是Bert的向量空间存在各向异性(anisotropic):
这两个现象的存在导致Bert的语义信息不能很好的表达出来,所以做语义相似度不好。
一个解决办法,就是把Bert的向量空间转换到另一个更加合适的空间,然后再做相似性度量,这就是论文的另一部分,感兴趣的可以去看原论文吧。
为啥相似度都很大,主要是因为高频词都挤在一块了。
On the Sentence Embeddings from Pre-trained Language Models: https://arxiv.org/pdf/2011.05864.pdf,