如何无监督地获得一个句子的向量表示?
本文第一部分会介绍基于词袋模型的一系列句向量表示方法,第二部分主要讲述基于预训练词向量的 Power Mean Embedding 表示方法,第三部分将通过 4 篇论文串讲的方式,从 0 到 1 地介绍对比学习(Contrastive Learning)在无监督句向量中的应用,最后在文末整理了一些值得思考与讨论的点,希望能为大家的工作带来一些微小的启发。
Real-unsupervised methods
顾名思义,这一类方法完全不需要额外的训练或预训练,它们大部分由 Bag-of-Words 的思想衍生而来,通过(1)从句子中提取表达能力相对较强的词汇,并(2)采用某种编码规则将其转换为数字形式,最终获得句子的向量。
值得注意的是,这类依赖于词表的(包括下面的 Word2Vec 等——但经过了预训练的 Word2Vec 模型不在此范围内,因为它已经给定了词表)方法会受到上游的一些诸如 tokenization、lemmatization 与 stemming 在内的数据预处理结果的影响。所以想要更好的使用这类方法,需要注意数据预处理的方式。
1.1 Bag-of-Words思想
与 TF-IDF 不同,Simhash 走了另一条解决问题的道路——有损信息压缩——来节省耗费的资源。Simhash 是一种局部敏感的 hash 算法,最初被 Google 用于亿万级别的网页去重。所谓局部敏感,也就是当句子做出一些细微的改变的时候,基于 Simhash 获得的句子向量也只会产生微小的变化,而非像传统 hash 那样整个签名完全发生改变。
SAUCE [2] 是今年的 CIKM 中一篇比较有趣的工作,同时也使用了 BoW 的思想来提取文本表示向量。SAUCE 的立意其实与 Simhash 更为相似一些,即为了快速检索相似的文本 —— 再具体一点讲,SAUCE 提出的大背景是:我们已经具有了相当丰富的预训练模型,而我们往往希望将这些模型应用到我们 domain-specific 的任务中。
与这个目的相悖的是,BERT 等预训练模型为了具有更加 general 的文本表示能力,都是在 Wiki 等通用语料上进行预训练的。因此产生了一个新的需求:我们希望能够给定一些领域相关的语料作为种子(corpus seed),来对大规模网页文本进行检索,获得大量相似的领域内文本,从而对通用的预训练模型进行进一步的训练(post-pretrain),提升它们在具体领域内的表示能力。
用于筛除出现频次过低的单词,即简单粗暴地删除所有出现频次不到 的单词。删除后的维度被快速缩减到: 用于控制保留的数量,即在经过 筛选后,接下来只保留剩余单词中 最小的 个。这个控制方式更加粗暴,强行把向量维度控制到:
然后呢?然后没有了。因为精美的食材,往往只需要简单的烹饪。
由于 BoW 类方法的特性,上文中所提到的一些方法其实并不囿于句向量的计算 —— 或者说提出的初衷主要是用于对段落、文本的表示,这是因为较长的文本信息中更容易提取出有效的单词或词组。正因此,TF-IDF、Simhash 与 SAUCE 等方法都或多或少地强调了方法应用于大规模快速检索的能力。而接下来的篇幅中,我们将真正回到主题,开始叙述词向量的学习与表示。让我们从一个奇妙的方法:power mean pooling [3](下称 PMP)开始说起。
之所以说 PMP 奇妙,是因为它一定程度上实现了调参侠们的心愿:网格搜索找参数?逐步回归选特征?我全都要!
文章最开始提到,由于预训练语料、任务的选择不同,市面上提供的预训练的特征丰富多样。而关于这些特征的选择,不同的人具有不同的偏好:李某喜欢 GloVe 的任务中精巧设计的共现逻辑,王某认为简单好用的 Word2Vec 是不朽的经典,而张某是预训练模型的忠实拥趸,为大力出奇迹的 BERT 词向量所倾倒,当然,想必也有同学尝试过将这些预训练向量拼起来。PMP 就向大家展示了:直接把现有的预训练特征及其组合拼起来,也会在下游任务上有很好的效果。
(GV) GloVe embedding: trained on Common Crawl
(GN) Word2Vec: trained on GoogleNews
(AR) Attract-Repel (MS) MorphSpecialized
说到这,不知道有没有小伙伴比较好奇:如果使用 BERT+LR 的形式去做这些任务,效果会不会更好?因为 BERT 只用了 768 维度的词向量,资源占用是比 1,200 维度低不少的。而如果是的话,是不是说明相较于拼接不同的词向量,选择一个表达能力更强、嵌入语义更丰富的词向量,对于下游任务会有更明显的帮助呢?
在 SBERT 的实验结果中,第一行对标了 PMP 结果第一行的 GloVe,两者的结果几乎是一致的,说明实验结果确实横向可比,而我们略过表中所展示的 SBERT 实验结果(对不起作者,把你当工具人了),直接看文中第四行所展示的使用 BERT CLS 向量作为句向量 时的评测结果。
在内存等资源限制的情况下,对于有限的词向量维度,选择泛化能力更强的词向量更佳;
在词向量表示能力相近的情况下,对于有限的词向量维度,优先使用已有词向量拼接取平均(),效果会优于使用不同的 值得到的同一词向量的扩展结果; 在资源允许的情况下,在以上条件里再加上 PMP,进一步扩展词向量维度,能进一步提升最后生成的句向量的表示能力。 此外,作者还专门提到:在 PMP 基础上加上 z-norm,能进一步提升 PMP 的应用效果。
The road to constrastive learning
接下来是笔者觉得当前非常有意思的一个方向:对比学习(contrastive learning)在无监督句向量生成中的使用。在本节中,你会看到众多才华横溢的研究者们是如何从词向量学习扩展到句向量学习、如何从单一的学习目标扩展到对比学习的目标、如何从传统 hard label 的分类任务到 contrastive label 的对比学习任务,以及探索如何更好的选择对比学习的正负例。
3.1 Skip-Tought Vectors
还记得 Word2Vec 里学习词向量的经典方法:skip-gram 吗?它的学习目标是:给定一个单词,判别式地预测它前后出现过的单词。这个学习目标本质上是希望(1)学到该单词的上下文信息,并且(2)使得拥有相似上下文的单词拥有相似的表示。从这一点来看,skip-gram 和 GloVe 通过共现矩阵(co-ocurrence matrix)进行学习,从而让共现情况相似的单词具有相似的表示有异曲同工的设计。
当然,正如 skip-gram 隐式要求句子内单词是有序的一样,skip-tought 要求输入的句子间是具有上下关系的,这一点或许会在应用 skip-tought 时成为制约。特别地,作者的实验中要求输入的语料需要是连贯的 三元组。
在实现的时候,还有一个直接的问题:句子的多样性比单词要大得多,训练词向量的时候有词表,但训练句向量不能用句表,否则 embedding table 可能大到整个恒河都装不了。作者使用了当时炽手可热的 Encoder-Decoder 结构来解决这个问题:使用 GRU 单元的 RNN 来作为 encoder,来获取当前句子的表示向量,再使用 decoder 来产生该句子的上下文。
在文中,上下文特指上句与下句(好比 skip-gram 只预测当前单词的上下各一个单词)。特别地,因为句子的嵌入信息会比单一的单词要更多,所以作者使用了两个 decoder 来分别生成当前句子的上句与下句。下图是输入语料的示意图:
在效果评估阶段,作者在 sematic relatedness(SICK), paraphrase detection(MS Paraphrase Corpous), image-sentence ranking(COCO)三个任务上验证了 skip-tought vector 的有效性,其中也尝试了不同类型的 encoder(unidirectional/bidirectional)。
和 skip-tought 使用 Encoder-Decoder 解决问题的思路不太一样的是,SDAE [6](顾名思义)选择了用 DAE 来无监督地获取句子的向量。上文中提到,skip-tought 有一个比较明显的缺点是:输入的语料必须是连贯的三元组,而 DAE(denoising auto-encoder)的特点是可以对加入噪声前后的句子本身进行学习,从而避免同时输入句子的上下句信息。
对于句子 中的每个单词 ,以 的概率对它进行删除; 对于句子 中的连续两个单词 ,以 的概率对它们进行交换。
skip-tought 与 SDAE 都使用了 encoder-decoder 结构,但采用了两种截然不同的思路:前者使用了两个 decoder 分别预测当前句子的上下句,因此需要输入连贯的句子;后者采取 DAE 的思路,输入加入噪声后的句子,让 decoder 尝试复原出原始的句子。这两个方法虽然看起来有些差别,但有一个特性是相似的:decoder 学习过程中的学习目标都是 hard label。
什么是 hard label 呢?有对模型蒸馏或者噪声学习等方向有所了解的同学可能知道,hard label 就是把模型要预测的目标设置成 1,即我们明确认为这个学习目标是绝对正确的:在对模型进行蒸馏时,我们一般认为 gold label 中会带有少量噪声(或者没有噪声,但某些样本的 pattern 很难学习,从而对模型收敛有所影响),所以除了给定的 gold 标签以外,我们同时要学习大模型预测的分布,一般是 softmax 前面层的输出结果,被称为 soft label。带噪学习中,由于更加笃定标签是具有噪声的,所以更加倾向于部分使用 hard label 而非全部采纳,如 co-teaching 等方法使用了不同模型间的相互学习。
回到正题,那么现在的问题是:我在 encoder-decoder 结构中,将上下句或是当前句设为学习目标,真的是正确的吗?
这个问题谁也无法回答,但我们从最简单的逻辑关系角度至少可以确定:以上两种方法肯定不可能全是对的,因为他们的学习目标本身就是不一样的。亦或是,他们可能是“对”的,但从 NLU 整体的发展方向上来说,不会都是“合适”的。
有趣的是,作者还在文中专门提到:在实验过程中也尝试过类似负采样的方式,通过二元分类器来学习 hard label,但效果并不如上面的学习目标那么好,并给出了与上文类似的解释:
We found object (2) work better, presumably due to the related constraint it imposes. Instead of requiring context windows to be classified as positive/negative, it only requires groud truth contexts to be more plausible than contrastive contexts.
换言之就是,我们不需要模型具有两两判断是否是 NSP 的能力,我们只需要模型能从一系列候选句中挑出最相似的那个就好了。
在实验阶段,作者比较了 SDAE、skip-tought 等传统方法,可以发现:
使用 BookCorpus 语料从头训练时,QuickToughts 能在相当一部分任务中和现有方法可比,部分任务上能够超过现有的方法; 使用 BookCorpus+ 预训练词向量初始化后,QuickToughts 方法在所有任务上都能超过现有方法。 PMP 看到这里可能还是会忍不住怨念一下:诸君这样始终用不同维度的词向量进行相互比较真的大丈夫?
3.5 SimCSE
如 QuickToughts 可以理解为把 skip-tought 带入了对比学习领域一样,我们可以这样描述:SimCSE [8] 把 SDAE 带入了对比学习领域。
SimCSE 在 STS 的所有任务中都大幅领先于之前的基线方法,部分的提升幅度甚至超过了 10%。在有监督模型的比较中,SimCSE 仍能保持相当大的领先,可以说把 SoTA 向上提了一大步。如此细微的改动能带来如此大幅度的提升,这个结果是十分惊艳的。
全文行文过程中其实会时不时地提出一些小问题(大部分都带有答案),在这里,笔者主要是想提出一些值得思考的点,它们可能目前尚没有明确的答案,又或者每个人都有自己的想法——兴许思考这些问题,能给你带来一些特别的 insights 呢?
奥卡姆剃刀:尽管篇幅所限,笔者只提到了两篇对比学习的文章,但仍有相当一部分使用对比学习做无监督句向量学习的工作(比如作为 SimCSE 效果背景板之一的 IS-BERT,使用了全局与局部词向量作为对比的目标),但 SimCSE 用了最简单的方式实现了最出众的效果。有时往往会发现,一些越简单的思路,或许反而会取得越好的效果,如 SimCSE 之于 SDAE(dropout is all you need),MLM 之于 EDA(mask is all you need),如 PMP 之于双塔(concatenation is all you need)。兴许在做研究的时候,不要过分注重于模型的转型升级,而是从其它角度试着简化问题,会带来更加有价值的结果。 Prompt-based Contrastive Learning:或许在很远的未来,我们能获得一个一统天下的模型,它能够胜任所有的 NLP 任务,但至少从目前来看,我们离这一天还有很长的路要走,在当前,我们想要做一个特定领域的特定任务的时候,还是需要针对性地去设计训练目标。在为人所广泛研究的 Language Model(LM)领域,已经有了 Prompt-base LM [9] 这个思路,即针对下游想要优化的任务,来针对性地设计预训练目标,定点强化预训练模型在特定领域内的效果。在对比学习中,是否也可以借鉴这个思路(我们可以发现,从 SDAE 到 IS-BERT 到 SimCSE,就是一个寻找更好的自监督目标的过程),根据下游的任务,来设计一个更好的对比目标呢? 顺序的重要性:你是否发现,句向量的获取方法间有一个鲜明的区别:是否用到了上下文。例如:skip-tought 要求输入的句子有序,而 SDAE 不用;QuickTought 要求输入句子间的先验关系,而 SimCSE 不用。更加广泛的,BoW 类型的句向量获取方法甚至不要求输入句子里的词汇具有先后顺序。直觉上来说,人类在理解自然语言时,对于词序与句序是有相当强的依赖的,但在 NLP 里,似乎不用这些顺序信息就能得到很好的效果。是因为 NLP 的发展不能完全参考人类对于自然语言的理解方式,还是说我们仍未很好地发掘出这些顺序信息所蕴含的潜能呢?
参考文献
[1] Jawahar G, Sagot B, Seddah D. What does BERT learn about the structure of language?[C]//ACL 2019-57th Annual Meeting of the Association for Computational Linguistics. 2019.
[2] Wahed M, Gruhl D, Alba A, et al. SAUCE: Truncated Sparse Document Signature Bit-Vectors for Fast Web-Scale Corpus Expansion[J]. arXiv preprint arXiv:2108.11948, 2021. (Accepted to CIKM 2021)
[3] Rücklé A, Eger S, Peyrard M, et al. Concatenated power mean word embeddings as universal cross-lingual sentence representations[J]. arXiv preprint arXiv:1803.01400, 2018.
[4] Reimers N, Gurevych I. Sentence-bert: Sentence embeddings using siamese bert-networks[J]. arXiv preprint arXiv:1908.10084, 2019. (Accepted to IJCAI 2019)
[5] Kiros R, Zhu Y, Salakhutdinov R R, et al. Skip-thought vectors[C]//Advances in neural information processing systems. 2015: 3294-3302. [^6]: Hill F, Cho K, Korhonen A. Learning distributed representations of sentences from unlabelled data[J]. arXiv preprint arXiv:1602.03483, 2016. (Accepted NAACL 2016)
[7] Logeswaran L, Lee H. An efficient framework for learning sentence representations[J]. arXiv preprint arXiv:1803.02893, 2018. (Accepted to ICLR 2018)
[8] Gao T, Yao X, Chen D. SimCSE: Simple Contrastive Learning of Sentence Embeddings[J]. arXiv preprint arXiv:2104.08821, 2021.
[9] 苏剑林. (Apr. 03, 2021). 《P-tuning:自动构建模版,释放语言模型潜能 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/8295
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧