卷友们好,我是rumor。
可能是因为对比学习,今年以来文本表示方向突然就卷起来了,SOTA刷的嗖嗖的,我还停留在 我们ConSERT 的阶段,结果别人不精调就已经超了。昨天实习同学发了我几篇Open Review上ACL的投稿,其中一篇效果最好的模型, 在摘要中写道 :
「 Even a non fine-tuned method can outperform the fine-tuned methods like unsupervised ConSERT on STS tasks 」
好,你厉害,我读还不行吗。
这篇文章名叫PromptBERT,无监督直接在SimCSE的基础上提了2个多点:
PromptBERT: Improving BERT Sentence Embeddings with Prompts https://openreview.net/forum?id=7I3KTEhKaAK
方法的核心思路也比较简单,分为两步 :
- 用Prompt的方式生成句子表示,比如
[X] means [MASK]
- ,
[X]
- 是输入句子,
[MASK]
- 是输出的表示,用这个当句子表示
- 用不同的Prompt模版来生成对比学习的view,继续采用自监督的方式训练
上面两步带来的提升也是相辅相成的,首先加了Prompt之后生成的表示本身就比BERT-flow、BERT-whitening、ConSERT要好:
注:OptiPrompt是参数化的prompt,但作者在最终实验用的还是手工prompt
加上对比学习的无监督训练后,效果又又又提升了一些(开头的图),不过从训练目标的消融实验可以猜想,主要提升还是在prompt产生句子表示的方式,而用不同template来对比学习的提升其实有限(第一行SimCSE设置 vs 第二行):
为什幺Prompt可以work
上面嗖嗖列了一堆实验结果,其实这篇文章的核心思想就是用Prompt来产生句子表示,那为什幺这样产出的表示效果会好呢?
作者认为,原生BERT表现不好主要是因为词语频率、大小写、subword等token导致的bias,而BERT本身各层Transformer都没有纠正这个问题。通过利用prompt,可以更有效地使用BERT各层中的知识,并且用[MASK]来表示embedding的话,可以避免像以前一样做各种token的平均,从而避免了token引入的偏差 。
为了证明上述猜想,PromptBERT在开头做了不少分析:
- 通过实验,显示embedding层甚至比最后一层的表现要好,证明BERT各层对于文本表示任务效率较低
- 之前其他工作认为,原生BERT表现差主要是因为表示空间的anisotropy(呈锥形),而anisotropy是由词频这样的偏差引起。但作者通过一些实验,认为anisotropy和bias不是相关的,所以bias的问题仍有待解决
总结
总的来说,Prompt+对比学习的结合方式还是很巧妙的,我之前还想怎幺用prompt做表示来着,没想到这样就work了。另外作者关于anisotropy和bias的实验也比较有启发性,同时在附录里作者通过实验显示,如果不对embedding层和softMax层进行weight tying的话,会很大程度上减少偏差。
不过并没有直接的实验可以表示PromptBERT减少了偏差,另外作者对prompt前期的探索虽然很到位(尝试T5生成的模版、参数化模版),但不知道为啥最后还是选择了人工模版。还有个疑惑是PromptBERT只在base模型上做了实验,而我们都知道prompt是模型越大越好的,一般我看到的prompt论文都是large模型起步,base就取得了这幺好的效果还是蛮让人惊讶。
Be First to Comment