知行编程网知行编程网  2022-02-13 14:00 知行编程网 隐藏边栏 |   抢沙发  51 
文章评分 0 次,平均分 0.0
成本砍砍砍!不用数据也能用 BERT 做对比学习?

大家好,我是小昌,今天和大家聊一聊如何从 BERT 中获取好的句子表征。

大家都知道,BERT 的设计初衷是为了获得更好的单词表征。但是,利用 BERT 来表征句子的需求无论在学术界还是工业界都是非常紧迫的。因此,当下有许多方法被研究者们提出来去利用 BERT 来获取更好的句子表征。最直接的,就是对句子中的每一个单词的表征相加求均值。

而今天带来的这篇文章则是利用了对比学习,使得只使用 BERT 中的标识来表征输入的整个句子也能有很好的效果。与普通对比学习需要大量的额外数据作为训练目标的前提不同,该篇文章将对比学习的目标转换成了一种无监督的模式。因此,这种方法便不再需要额外的数据,确实又省力,效果又好!这篇文章就是《 Self-Guided Contrastive Learning for BERT Sentence Representations

论文题目:
Self-Guided Contrastive Learning for BERT Sentence Representations

论文链接:
https://arxiv.org/pdf/2106.07345.pdf

Arxiv访问慢的小伙伴也可以在 【夕小瑶的卖萌屋】订阅号后台回复关键词 【0720】 下载论文PDF~

成本砍砍砍!不用数据也能用 BERT 做对比学习?1. 问题定义和设计思路成本砍砍砍!不用数据也能用 BERT 做对比学习?

从 BERT 中获取句子表征的方法有很多种,但是都不够完美。在有监督任务中,BERT 最后一层预定义的表征便可以被用来作为整个句子的表征。原因在于表征常被用作下游任务的输入,在充分训练后能够更好地捕捉整句的信息

而在无监督任务中,通过来表征句子的能力仿佛失效了[1],取而代之的做法便是将句子输入 BERT,并对每个单词最后一层的表征进行均值池化操作。然而,这样的方法经过作者的验证是非常不稳定的。

因此,作者尝试利用对比学习的方式提出一种自引导机制,来解决无监督任务中BERT的句子表征问题。其核心在于将 BERT 的中间隐层用好,使得中间隐层的表征应该和最终句子的表征比较相似(BERT 的中间隐层应为句子表征的正例),因此这也能够摆脱对比学习对于额外数据的需求。此外,作者也重新调整了 NT-Xent 损失(一种在计算机视觉运用广泛的,属于对比学习任务的损失),使得最后的效果进一步提高。除了作者通过实验证明,他们的算法效果较优外,作者也表明其算法在不同领域任务中的表现也都更鲁棒。

成本砍砍砍!不用数据也能用 BERT 做对比学习?2. 具体方法成本砍砍砍!不用数据也能用 BERT 做对比学习?

为了获得高质量的向量来表征输入的句子,作者提出了一种自引导的对比学习方法,即利用 BERT 中间层的表征来作为对比学习的正例对象。这是因为 BERT 的中间层理论上也应该能够用来表征对应的句子,那么中间层的表征和的表征的相似度应该很高。下面用图来进一步具体化说明作者如何设计该算法的。

成本砍砍砍!不用数据也能用 BERT 做对比学习?

首先,作者对 BERT 进行复制得到 BERTF(参数固定)和 BERTT(参数可微调)。BERTF 在训练过程中是参数固定的,并起到提供指导训练的作用,而 BERTT 则是在训练过程中需要被微调来生成句子表征的。作者之所以在这里区分二者是希望在训练过程中,训练信号 BERTF 的效果能够始终保持。否则,特别是当 BERTFBERTT 在参数相同的时候,BERTF 的指导效果便会失效。此外,这里也体现了作者希望通过充分利用 BERT 本身不同层的知识来生成句子表征的思想。

随后,当给定一个包含 条句子的训练数据 时, 作者把句子 送入到 BERTF 中,便能得到 中每一个token在BERT中每一层的表征:

 

 

此处 是 BERT 的层数。其中的每一个 , 是整个句子中包含的 token 数,而 则是 BERT 的隐层表征的维度。

在获得了输入句子在 BERT 中每一层的表征后,作者使用了一个池化方法 ,对句子中每一层的表征 映射到 (从矩阵变为向量),来生成一个句子在 BERT 不同层中的表征。随后,作者再使用了一个采样方法 从句子的 层表征中,采样出一个最终的向量表征 。在此,作者只是使用了一个最大化池化和均匀采样,并表明,在此选择均匀采样是认为每一层的表征其实都有其重要性,因为 BERT 不同的层捕获了句子不同的语言学特征。

2.1 模型损失设计

之后,作者从 BERTT 获得了句子 的表征,并认为表征是 的正样本。将和 放入到一个集合中,便可得到 。而对于所有的 ,作者则使用 NT-Xent 损失来训练句子的表征。NT-Xent 损失来自于 SIMCLR[2]并被广泛地应用在计算机视觉任务中,其本身是希望选定的样本表征和为该样本增强的正例之间的表征能够更加接近,而选定的样本表征和负例的表征之间距离越远

在本论文中,作者则选用作为从中间层得到的句子表征的正例,而一批中的其他句子的表征以及其他句子从中间层获得的句子表征都为负例。具体的公式如下:

 

 

 

 

在此是一个温度超变量, 在此是一个由多层感知机构成的映射参数,是余弦相似度函数,而其中重要的匹配函数 是用来选取正例的方式,如下图所示

 

 

简单分析一下,如果希望该损失降低,那么 的部分就要变大。其中 与 的相似度越高,那么分子也就越大;  或者 与其它句子的表征 , 之间的差距越大,分母也就越小,那么它们的比值也就越大

此外,作者也添加了一个正则化项 来保证 BERTF(参数固定的)和 BERTT(参数可微调的)之间没有太大的差距。因此便组成了最终的损失函数

 

 

2.2 模型损失优化

总结一下,在上述方法中,每个句子会得到和中间隐层表征这两种表征,彼此之间的损失计算可以如下图所示。

成本砍砍砍!不用数据也能用 BERT 做对比学习?

在关系(1)中,反应的是作者的核心设定,即一个句子从 BERT 中得到的表征(),应该和中间层构成的表征 越接近越好。而其它的关系,包括(2),(3)(图中的黄色对角线)以及(4)之间应该是距离越大越好。

但是,作者发现,这其中的损失并不是都同等重要。因为作者的目标是提升 的表征,因此其选择放弃关系(4)。此外,作者也发现关系(2)对提升表现也没有作用,因而也一并放弃。因此,只考虑选定句子两个表征 和 之间的相似度,以及选定的句子的 表征和别的句子的 表征之间的差异度,便可得到如下图所示的损失

 

 

为了多样化关系(1),(3)带来的损失,作者允许句子的中间层的每一层表征 也能被加入到损失中去提供句子多维度的表征,即用 来替换上式的 ,即获得损失 ,如下图所示,

 

 

并且在该损失后加上正则化,就是最终的损失了。

 

 

成本砍砍砍!不用数据也能用 BERT 做对比学习?3. 实验结果和敏感度分析成本砍砍砍!不用数据也能用 BERT 做对比学习?

针对 BERT 模型的选择,作者在英文数据集上使用了 BERT,对于多语言的数据集则使用了 MBERT(multilingual-BERT)。此外,也尝试了 RoBERTaSBERT 来评估方法的泛化能力。为了避免随机性,作者对需要训练的实验,都是进行 8 次的独立实验求均值来减小误差,而模型的超参数择是使用 BERT-baseSTS-B 的验证集上优化得到。

3.1 语义相似度任务

在该任务上,作者选用 STS(Semantic Textual Similarity) 任务来评估提出的算法。作者通过衡量句子对表征之间的相似度来衡量模型的优劣。在此选用的数据集包括 STS-B,SICK-R 等等,这些数据集包含成对的句子,句子之间的相似度从 0 到 5 分进行打分。作者利用皮尔森系数来衡量真实的标签和表征相似度之间的关联性,来评判模型的效果。而对比的基准任务,非 BERT 类的包括 Glove,USE 等等。而 BERT 类的则只考虑在无监督下就能得到句子表征的模型,包括 BERT 的表征,均值池化,WK 池化,Flow,Constrastive(BT)等,而作者提出的方法则为 Constrastive(SG)Constrastive(SG-OPT),分别是使用了 和 损失,实验结果如下图所示。

成本砍砍砍!不用数据也能用 BERT 做对比学习?

从图中可以发现,作者提出的方法在大多数情况下都能够取得更好的效果。而使用优化后的损失函数取得的效果比采用未优化的损失要更好。在这当中,反常的是 WK 池化的方法居然在大多数情况下效果比均值池化的效果更差。

3.2 多语言相似度任务

除上述英文数据的实验外,作者也将 STS 任务扩充到多语言的 STS 任务。作者通过使用 MBERT(Multilingual BERT) 作为编码器,在 STS-B 的英语数据上训练后,在 SemEval-2014 任务(西班牙语)以及 SemEval-2017 任务1(阿拉伯语,西班牙语和英语)上做测试,也都取得了较好的结果,证明了作者提出的设计让模型有很好的泛化能力,在此不赘述。

3.3 SentEval 和有监督微调下的表现

除上述无监督的学习外,作者也使用了 SentEval toolkit 来衡量表征的能力。SentEval toolkit 将句子的表征作为输入,利用线性分类器去做下游任务,通过下游任务中分类器的表现来评估输入句子的表征质量。并得到下图所示的实验结果,

成本砍砍砍!不用数据也能用 BERT 做对比学习?

通过实验发现,基于作者提出的自引导对比学习方法对于 BERT 的微调带来的提升大于对 SBERT 调整带来的优化。而作者也尝试用它们的算法设计去微调有监督学习下的 BERT,发现并没有影响 BERT 有监督微调的效果。个人猜测,作者可能是希望说明其所提出的方法对于表征的改进和有监督学习下对表征的改进是互相独立的,以后既使用有监督又加上这无监督的额外训练,可能有更鲁棒的效果。

成本砍砍砍!不用数据也能用 BERT 做对比学习?4. 算法分析成本砍砍砍!不用数据也能用 BERT 做对比学习?

从下图消融实验中可以发现,对于 NT-Xent 损失的所有更改都会带来表现上的提升。同时,作者表明对于超参数和映射函数的选择对模型最终的效果也非常重要

成本砍砍砍!不用数据也能用 BERT 做对比学习?

为了探究算法对来自不同领域输入数据的鲁棒性,作者将 NLI 数据集进行混合后来观察模型的效果,最后得到的结果是,相比于通过 FLOW 得到的表征,通过 SG-OPT 得到的表征始终要好更多,在此也不在赘述。但是,作者也坦言 NLI 数据集和 STS 任务中存在着一些相似性,后续仍然需要在更多的情况下去验证

而对于计算效率来说,SG-OPT 的训练时间为 7.5 分钟,慢于 FLOW 方法的 2.6 分钟,但是在推理上只需要使用10.51秒,快于其它方法。这是因为 SG-OPT 方法一旦训练完成后就能被使用,而不像别的池化方法还需要额外的操作。

成本砍砍砍!不用数据也能用 BERT 做对比学习?

最后,作者也对表征进行了可视化操作。首先,从 STS-B 数据集中采样出 20 个正样例对(相似度打分为 5 的数据对,为红色)以及 20 个负样例对(相似度打分为 0),并用 t-SNE 方法,将向量降维到二维空间中。从图中可见,作者提出的 SG-OPT 使得语义相似的句子的表征更加接近,而原生的 BERT 的表征便不能很好地捕捉到句子之间的相似度

成本砍砍砍!不用数据也能用 BERT 做对比学习?

除了对实验的正面分析,作者也坦言自己的方法存在一些不足。例如,并没有考虑到算法可以做的更简单,例如只使用 BERT 的部分中间层,而不是像现在这样使用所有的中间层,以及一些额外的对比学习技巧来提升 BERT 的效果

成本砍砍砍!不用数据也能用 BERT 做对比学习?5. 小结成本砍砍砍!不用数据也能用 BERT 做对比学习?

  1. 作者提出了一种在无监督场景下,利用 BERT 中间层的信息,结合对比学习的方法,使得 BERT 自带的表征能够更好地捕捉输入句子的算法
  2. 作者在无监督、有监督的场景下验证了其算法的有效性,并通过消融实验说明损失设计的作用,最后通过向量可视化直观地展示了算法的效果
  3. 最后,个人感觉这篇论文的实用性是很强的,不需要额外的数据就能用 BERT 做对比学习,省去了获取增强数据的成本。此外,这种强调利用 BERT 本身中间层的思想,可能在别的任务上也能起到一定的作用,给人带来了一些启发! 

成本砍砍砍!不用数据也能用 BERT 做对比学习?

[1].Nils Reimers and Iryna Gurevych. 2019. Sentence- BERT: Sentence embeddings using Siamese BERT- networks.[C]. In EMNLP-IJCNLP.

[2].Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]. In ICML. PMLR, 2020: 1597-1607.

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享