关注公众号【算法码上来】,每日算法干货马上就来!
论文地址:What you can cram into a single $&!#* vector: Probing sentence embeddings for linguistic properties
介绍
本文主要探究了不同encoder在不同任务上训练得到的句子向量表示,是否蕴含了各种语言性质。
本文主要有三个贡献点:
- 分析了三种类型的encoder,并在7个任务上预训练句向量。
- 提出了10种探测任务。
- 每个探测任务探究一种语言性质。
探测任务
为了探测这些性质,作者提出了10种探测任务,并分成了三个类别,分别用来探测句子的表面信息、句法信息和语义信息。
这10种探测任务有一些共同点:
- 数据集都是作者手工设计的,用来做分类任务。
- 数据集基于Toronto Book Corpus,句子长度只挑选了5到28的。
- 训练集大小100k,验证集和测试集都是10k。
- 数据集里的偏差都被人工去除了(例如对某个类别预测影响很大的单词)。
探测任务全部采用MLP进行分类。
表面信息
第1个任务是预测句子长度(SentLen)。
这个任务将句子长度划分成了6个区间,预测长度落在哪个区间里,所以最后是一个6分类任务。
这个任务用来探索句向量能否保留句子长度的信息。
第2个任务是预测一个句子里含有哪个关键词(WC)。
这个任务挑选出了1000个频率比较高的单词,预测一个句子中含有哪个单词。
数据保证一个句子中不会同时出现两个关键词。
这个任务用来探索句向量能否保留单词的信息。
句法信息
第3个任务是预测句子对应句法树第二层的label(TopConst)。
这个任务将句法树第二层(也就是根节点S的子结点)所有label拼接成一个label(比如ADVP_NP_VP),
然后挑选出频率最高的19种label,其他的都归为第20个label。
这个任务用来探索句向量能否抽取出句子的句法结构信息。
第4个任务是预测句子词序是否正确(BShift)。
这个任务随机调换句子中任意两个相邻单词,然后做2分类,预测是否调换过顺序。
这个任务用来探索句向量对词序是否敏感。
第5个任务是预测句子对应句法树的深度(TreeDepth)。
在实际数据集中,句法树深度都在5到12之间,所以这是一个8分类任务。
语义信息
第6个任务是预测句子的时态(Tense)。
第7个任务是预测句子主语单复数(SubjNum)。
第8个任务是预测句子宾语单复数(ObjNum)。
第9个任务是预测句子中名词或动词是否被替换过(SOMO)。
这个任务随机将句子中名词或者动词替换为其他名词或动词,然后2分类预测是否做过替换。
替换保证换过之后单词前后的bigram出现频次还是相似的。
第10个任务是预测一个带有从句的句子前后关系是否正确(CoordInv)。
比如“今天下雨了,因为我没出门。”这句话前后转折关系就反过来了。
实验
10种探测任务上的表现如下:
vote结果是随机的。
然后是人类分析结果,句法和语义信息也不能保证是100%正确。
Length是只用长度作为输入,可以看出只有SentLen预测正确了,其他都等于随机猜。
朴素贝叶斯方法对词信息比较敏感,WC任务效果很好。
BoV方法因为不包含词序信息,所以BShift任务很差,等于随机猜。
再看几种不同的编码器。
首先是用LSTM最后一个时刻隐层输出作为句向量。然后是每个维度用不同时刻的最大值作为句向量。最后是门卷积网络编码器。
采用的预训练任务有随机初始化,自编码器,机器翻译(三种语言),Seq2Tree,SkipThought(预测下一个句子)和NLI。
可以看出Seq2Tree训练出来的句向量在对句法敏感的几种性质上都取得了最好的结果。
比较两个LSTM编码器,可以发现采用max的向量表示效果更好。
上面这个图显示了不同的下游任务和10种语言性质之间的相关度,蓝色表示相关度高,红色表示低。
可以发现几乎所有的任务对于句子长度信息都不是很敏感,或者句子长度并不能有效地提升任务的性能。
再如SST2任务,情感分类任务的话对于单复数和句法结构信息可能也不是很敏感。
结论
这篇论文主要就是提出了10种探测任务,用来探索模型的10种性质。
但是这篇论文里的方法其实还是有点问题的,就如上一篇control task所讲的那样,probe task的准确率并不一定能反应语言性质学习的好坏。
但是无妨,这些探测任务还是可以用在我们编码器或者预训练语言模型的分析中的。