我们在进行一些nlp任务时,一般需要得到句子的vec编码,一般会试一试bert系列,但是这是有前提的,要fintune! 要fintune!
如果想直接“拿来主义”,直接加载公布的pretrain模型来获得vec编码,可能并达不到我们的预期。
这里做了两个实验
一个使用bert的实验结果,这是网上大多数的例子,可以看到“啦啦啦啦啦啦”和“天空为什么是蓝色的”相似度(余弦相似度)依然很高
一个是百度ernie的实验结果,这里极端了一点,可以看到标点和文本依然具有很高的相识度。
所以
(1)在不进行fintune情况下,计算出的相似性值没有多少参考意义,如果想把阈值卡的高点,那卡多少?这就很玄学了,但是其在一定程度上可以反映出相对相似性,就是谁比谁相似
(2)在不进行fintune情况下,上面的ernie实验结果是取的pooled output即cls位置的输出,还有一个token 的编码输出即sequence_output,然后对其做pooling得到当前句子编码也是一个办法,这个其实就是bert-as-service的默认做法(对应上图中第一个实验就是用的bert-as-service),总之两个效果都不是很理想吧,甚至不如word2vec。
所以总结一下,在用这些预训练模型的时候还是要微调,或者我们可以找到在相似公开数据集任务比如相似、问答等数据集上面微调了的,效果会预期好一点,如果有自己的数据集就更好了。