昨天说到sentence embedding,今天就补了一篇BERT里面[CLS]的论文。BERT 以及ALBERT(A Lite BERT)类的预训练模型可以通过[CLS]来生成句向量,但是其效果真的好吗?
这篇笔记首发于:https://zhuanlan.zhihu.com/p/477863892
Title: Evaluation of BERT and ALBERT Sentence Embedding Performance on Downstream NLP Tasks
From: ICPR 2020
Link: https://arxiv.org/abs/2101.10642
背景
BERT 模型在训练时候,引入了一个额外的任务 next sentence prediction(NSP),所以除了token的embeddings,还可以获得句子的embedding,用[CLS]来表示。除了用这个表示,如果想获得句向量,一种可替代的方式是对句子中所有token的embedding取平均值。但这两种方式效果都不是很好。这篇论文里,作者提出两种模式,基于BERT的Sentence-BERT(SBERT)以及基于ALBERT的Sentence-ALBERT (SALBERT)。
Baseline模型 以及 Proposed model
-
[CLS] embedding
[CLS] 作为句向量的输出是最直接的方式。而且,[CLS]在微调阶段也可以继续被优化。
-
池化所有 token的embeddings
对句子中的token进行平均或者最大池化,将token嵌入转化为固定长度的句子向量。(这篇论文用的是平均池化,但我觉得加一个max pooling好像比单纯的average pooling有用)
-
SBERT/SALBERT
用孪生神经网络来对BERT输出的embedding进行池化,然后对生成两个句向量计算余弦相似度。
-
CNN-SBERT / CNN-SALBERT
在这个方法中,用CNN替换了上面的average pooling。除了最后一层,前面的每层pooling都是max pooling.
实验
在语义文本相似度 (STS) 和自然语言推理 (NLI) 两个任务上做的,来评估上述句子嵌入模型的性能。
-
Task and Dataset
(1) Semantic Textual Similarity benchmark(STSb):给一对句子根据语意相似度进行评分,0-5分。
(2) Multi-genre Natural Language Inference(MultiNLI):MultiNLI语料是做蕴含分类,判断两个句子的关系是矛盾的、蕴涵的还是中性的。
(3) Stanford Natural Language Inference (SNLI):和上一个一样,也是做蕴含、矛盾和中性三种。
BERT和ALBERT也在上述三个数据集上进行了微调。
-
评测指标
Pearson and Spearman’s rank coefficients(皮尔逊和斯皮尔曼相关系数)
-
Results
结果如下表所示,可以看到,CLS的效果非常差,微调之后稍稍还好一些。但仍然是所有里面最差的,简单的平均池化都要比它高出20-40个点。
总结
- 微调是有效的
- CLS做句向量的效果挺差的,还不如所有token的平均池化
- 模型效果比较:CNN-BERT > SBERT > Avg pooling > CLS
- CNN 对 ALBERT 的改进要远大于对 BERT 的改善提高。ALBERT 由于内部参数共享,可能存在不稳定性,CNN 网络结构或许可以减缓这种不稳定性。
参考