赞
踩
今天继续关注句子表示学习。之前笔者一直觉得Prompt就是概念炒作(可能我比较菜),不觉得能有啥大的发展。但是近一年来,类似的论文层出不穷,不注意都难。今天这篇论文让我对Prompt有了很大的改观。
首先,回顾句子表示学习中存在的问题:
BERT直接出来的向量存在各向异性(anisotropic)。通俗讲,就以下两个问题:
针对低频和高频分布的情况,会存在这样的问题: 假设有一对词“讨厌”、“反感”。如果在训练语料中,反复出现“讨厌”,而“反感”出现的次数极少,则会导致这两个词的向量距离很大。其实,最理想的词向量分布就是上面图b(Word2Vec)的情形,比较均匀。
针对以上的问题,有各种各样的解决方案。如:Bert-flow、Bert-whitening、SimCSE等等。今天,这篇论文PromptBERT同样也是针对句子表示学习的优化。下面看一下模型的具体结构。
首先,论文的开始也提到了词频对词向量表示学习的影响,另外也提到英文大小写、子词等也会有影响。接着,作者通过人工去除这种偏置做实验,发现效果好很多,甚至好于Bert-flow和Bert-whitening。但是,这种人工去除偏置的方法很麻烦,另外有些词出现的次数很少,但是它在某个短句中意义重大,如果直接去除,肯定不可行。基于此,作者就想到了利用Prompt,直接基于提示产生词向量。
在讲模型之前,再看一下本文对于异向性的一个认识(很有说服力)。在通用的语料中,如果随机抽若干句子,计算它们之间的平均余弦相似度,如果越接近于1,说明异向性越严重,如果接近于0,说明同向性很好。平均余弦相似度计算公式如下:
其中 s i ∈ { s 0 , s 1 , . . . , s n } s_i\in{\{s_0, s_1, ..., s_n\}} si∈{s0,s1,...,sn}, s j ∈ { s 0 , s 1 , . . . , s n } s_j\in{\{s_0, s_1, ..., s_n\}} sj∈{s0,s1,...,sn},就是句子集合中随机的两条句子。 M代表通过什么方法获取的词向量。 下面是一些模型的效果:
可以发现这些模型的异向性非常严重。
另外,论文也调研了一下词嵌入的偏置问题(词频对表示学习是否有影响?)
上表是随机抽取若干词,计算他们之间的平均个余弦相似度。可以发现roberta-base的效果比bert好些。作者在文中还可视化了各种特征(词频、大小写、子词)等对嵌入的影响,若感兴趣,可以进一步看看文中的一些描述。
在这种方法中,作者有给了两种实现方式:
其中 W v W_v Wv是embedding词向量矩阵。 v v v就是top-k中的某个token,分子相当于就是取出top-k个词的词向量进行直接对应位加和。分母的 P ( [ M A S K ] = v ∣ h [ M A S K ] ) P([MASK]=v|h_{[MASK]}) P([MASK]=v∣h[MASK])是预测出某个token的概率,相当于是将top-k个词的概率累加。最后就得到了句子的表示向量。
另外作者也做了模板搜索,实验结果如下:
不同模板之间的差距还挺大的。Prompt真是玄学呀。
是这个方法驱使我读这篇论文的。众所周知,在SimCSE中,是通过Dropout进行数据增广,得到对应的正例对。而在本文中,是通过不同的模板,得到对应的正例对([MASK]向量),然后基于这种正例进行对比学习。
损失函数如下:
分子部分是计算正例之间的cos,分母是计算当前样本与其他正负例之间的cos。我们以分子为例,cos里面有两部分,如果都不减 h ^ \hat h h^,相当于是两个正例的表示,本文指的是同一句话通过不同的两个模板得出的向量表示。之所以后面要减去 h ^ \hat h h^,是因为作者想消去模板引来的偏置。 h ^ \hat h h^就是将纯模板塞进模型,得到的向量表示。
至此论文就讲完了。如果对方法二还有疑问的话,可以参考我的一个实现: https://github.com/shawroad/Semantic-Textual-Similarity-Pytorch/tree/main/PromptBert
首先,作者给出一个没有微调的实验,即采用上述方法一得出的结果,如下所示:
可以发现,效果确实惊人。提升非常大。OptiPrompt是指用了模板搜索。
接着作者给出了微调之后的结果,也就是采用上述方法二进行对比学习的结果,如下所示:
可以发现,无监督的效果远远高于之前的方法。有监督也略高于之前的simcse。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。