BERT-Flow | 文本语义表示新SOTA

2021-01-08 10:38:35 浏览数 (1)

BERT向量大家平时肯定经常在用,但你是否掌握正确使用姿势? 来自字节跳动和CMU的 EMNLP2020工作深入分析了BERT向量,并扔给你一个SOTA模型
  • 论文:On the Sentence Embeddings from Pre-trained Language Models[1]
  • 代码:https://github.com/bohanli/BERT-flow

「Key insight:」 虽然预训练BERT已经广泛地运用到了各种下游的NLP任务上,但在文本语义相似度计算任务上,未经微调的BERT句向量的质量常常不如GloVe句向量。针对这个问题,作者首先分析了BERT句向量分布的性质,然后利用标准化流无监督地将BERT句向量的分布变换成更规整的高斯分布,实验结果表明作者提出的BERT-flow在多项任务上取得了SOTA表现。

Arxiv访问不方便的同学可以后台回复『0005』便捷获取论文喔

提醒: 微信深色模式下,有些公式会看不清,建议在正常模式下(白底)阅读本文~

Introduction

将预训练BERT迁移到文本语义相似度计算任务上大致有两种思路:

  • 「交互编码:」 这是BERT原文给出的微调方法,也就是把两个需要计算语义相似度的文本用[SEP]拼接起来,将其作为输入来微调BERT。虽然BERT的cross-attention可以让两个文本得到充分的信息交互,在一些对文本交互要求较高的任务上表现得很好(比如需要模型具备句间推理能力的AFS数据集[3])。 但在文本检索的场景下,「从文本库
mathcal{D}

中搜索和某个文本或查询的语义最相近的文本需要BERT做

|mathcal{D}|

次inference」,当文本规模

|mathcal{D}|

太大的时候(百万级以上),这样的检索方式是非常耗费时间的,因此出于对响应速度的考虑,在实际应用中,下面的向量空间模型是更合适的选择。

  • 「向量空间模型:」 利用预训练BERT生成的句向量(sentence embeddings)作为文本的整体表示,比如取[CLS]对应的hidden state或对最后一层或几层的hidden states做average pooling(后者更好),然后用句向量的cosine相似度来表示文本的语义相似度。这种方式没有利用句子对相似度标签来微调BERT,因此是无监督的,因此非常适用于大规模文本检索的应用场景,「但奇怪的是,实验表明BERT句向量的表现有时候还不如non-contextualized的GloVe句向量。」

针对上面的问题,Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (EMNLP 2019)[4]提出了基于siamese双塔结构的SBERT,SBERT利用了语料库中的语义相似度标签有监督地训练BERT生成更好的句向量,并且SBERT的训练目标和cosine相似度度量是完全契合的。「SBERT将信息交互限制在了最顶层,避免了从底层就开始交互的BERT难以接受的计算复杂度,将

|mathcal{D}|

次inference化简到了1次,同时避免了预训练BERT在缺乏下游任务监督的情况下生成的句向量的cosine相似度和真实的语义相似度差距太大的问题」。但SBERT有一个不可忽视的缺点和一个没有解答的问题:

  • 「需要监督信息:」 想要标注任意句子对的相似度的工作量是
O(n^2)

增长的,在绝大多数文本检索的现实场景下,获取大规模句子对标签的代价是很高的。「因此最理想的方法是在领域语料库上无监督训练的BERT生成的句向量可以直接用来有效地计算文本相似度」。 但上面已经提到,实验结果表明BERT句向量还不如简单得多的GloVe句向量,似乎只有像SBERT那样提供监督信息来"修正"BERT的参数,BERT才能生成可以直接用简单的cosine相似度计算语义相似度的句向量。这个看似无法解决的困境就引出了下面需要思考的问题。

  • 「为什么预训练BERT句向量的cosine相似度不能很好地近似语义相似度?:」 SBERT没有解释为什么没有经过监督式微调的BERT生成的句向量不好用,是因为BERT句向量本身没有包含足够的语义相似度信息,还是因为简单的cosine相似度无法准确刻画语义相似度?如果是后者,「有没有什么方法可以在无监督的条件下更有效地抽取出BERT句向量中隐含的语义相似度信息呢?」

上面的几点思考就是本文致力于解决的问题,作者首先分析了BERT句向量是否包含了足够的语义相似度信息,然后分析了为什么不能直接计算BERT句向量的cosine相似度来表示语义相似度,最后针对如何在无监督的条件下更有效地处理BERT句向量来计算语义相似度的问题,提出了BERT-flow模型。

BERT句向量

我们首先回答第一个问题:预训练BERT句向量是否能够包含足够的能够反映语义相似度的信息?,换一个角度来看,就是说「BERT的训练目标和文本语义相似度计算的目标是否是一致的。」

BERT预训练与语义相似性

考虑一个句子

x_{1:T}=left(x_1,ldots,x_Tright)

,语言模型将联合概率

pleft(x_{1:T}right)

按自回归的方式分解为

log pleft(x_{1: T}right)=sum_{t=1}^{T} log pleft(x_{t} mid c_{t}right)

而BERT提出的掩码语言模型将其分解为

p(bar{x} mid hat{x})=sum_{t=1}^{T} m_{t} pleft(x_{t} mid c_tright)

其中

hat{x}

表示掩码后的句子,

bar{x}

表示被掩码的单词,

c_t=hat{x}

,当

x_t

被掩码时

m_t=1

,否则

m_t=0

。这两种语言模型都可以归结为建模单词

x

和上下文

c

的条件分布:

p(x mid c)=frac{exp mathbf{h}_{c}^{top} mathbf{w}_{x}}{sum_{x^{prime}} exp mathbf{h}_{c}^{top} mathbf{w}_{x^{prime}}}

其中

mathbf{h}_c

c

通过一个复杂的深度神经网络得到的上下文表示,

mathbf{w}_x

x

的词嵌入向量。文本语义相似度计算实际上可以归结为计算上下文表示的点积

mathbf{h}_{c}^{T} mathbf{h}_{c^{prime}}

,但上面给出的建模过程并没有显式地包括

mathbf{h}_{c}^{T} mathbf{h}_{c^{prime}}

的计算,所以我们也没法推导出它的数学表达式。

我们只好回到

mathbf{h}_{c}^{top} mathbf{w}_{x}

上,Breaking the Softmax Bottleneck: A High-Rank RNN Language Model (ICLR 2018)[5]指出在训练好的语言模型中,

mathbf{h}_{c}^{top} mathbf{w}_{x}

有下面的近似关系:

begin{aligned} mathbf{h}_{c}^{top} mathbf{w}_{x} & approx log p^{*}(x mid c) lambda_{c} \ &=operatorname{PMI}(x, c) log p(x) lambda_{c} end{aligned}

其中

displaystyleoperatorname{PMI}(x, c)=log frac{p(x, c)}{p(x) p(c)}

x

c

的点式互信息,PMI是共现(Co-Occurrence)关系的一种近似度量,实际上,"语义"这个概念的数学表达对应的就是某种能够反映共现关系的统计量,因此计算词嵌入和上下文嵌入的点积是能够反映词和上下文的语义相关性的。

再进一步,我们可以猜想如果两个上下文

c

c^prime

与同一个词

w

有共现关系,那么

c

c^prime

也应该有相似的语义,具体来说,在训练语言模型时,

c

w

的共现会使得

h_c

x_w

相互靠近,对

c^prime

来说也同样如此,因此

h_c

h_{c^prime}

就会变得接近,同时由于softmax标准化的原因,

h_c

x_{w^prime}, w^primeneq w

的距离会拉大。通过这样的过程,模型可以建立上下文与上下文潜在的共现关系,这表明BERT的训练过程和语义相似度计算的目标是很接近的,训练得到的句向量应该包含了文本之间的语义相似度信息。

因此我们继续考虑下面的问题:「我们使用BERT句向量的方法是否不够有效?」

各向异性向量与语义相似性

由于我们用的相似度度量都是很简单的度量,比如cosine相似度,minkowski距离等,这些度量对语义分布的性质可能会有一定的要求,而BERT句向量的分布不一定满足这些性质,或者说「BERT句向量隐含的语义相似度信息没那么容易被抽取出来」,因此我们尝试分析一下句向量在高维空间中的分布情况。

目前已经出现了不少针对语义向量空间性质的研究,比如Representation Degeneration Problem in Training Natural Language Generation Models (ICLR 2019)[6]发现语言模型学习到的词向量分布通常是各向异性的(anisotropic),且词嵌入常呈现锥形分布,Towards Understanding Linear Word Analogies (ACL 2019)[7]在BERT和GPT2的词向量分布上也得到了同样的结论。因此作者猜想BERT句向量同样存在这样的问题,作者在上述结论的基础上,进一步发现了词向量的非均匀分布和词频的非均匀分布有关。

为了方便,我们只探讨词向量空间,因为词向量空间和句向量空间共享的是同一个高维空间,如果词向量空间有什么问题,那句向量空间也会有同样的问题。为了验证BERT词向量分布是否和词频有关,作者计算了词向量的

ell_{2}

范数和词向量间的

ell_{2}

距离,如下表所示。

我们可以发现高频词的

ell_{2}

范数更小,说明高频词离原点更近,低频词离原点较远,「这会导致即使一个高频词和一个低频词的语义是等价的,但词频的差异也会带来很大的距离偏差,从而词向量的距离就不能很好地代表语义相关性」

我们还可以发现高频词之间的

ell_{2}

距离也更小,说明高频词分布得更紧凑,低频词分布得更稀疏,而稀疏性会导致一些词向量之间的空间是"空"的,这些地方没有明显的语义对应,因为句向量是词向量的平均池化,是一种保凸性运算,然而这些没有语义定义的空间使得分布不是凸性的,所以可以认为BERT句向量空间在一定程度上是「语义不平滑的(semantically non-smoothing)」,这导致句向量相似度不一定能够准确表示句子的语义相似度。

BERT-flow

为了解决BERT句向量分布不平整的问题,作者认为可以利用标准化流(Normalizing Flows)将BERT句向量分布变换成一个光滑的,各向同性的标准高斯分布。

Motivation

标准高斯分布有一些很好的性质,首先,标准高斯分布是各向同性的(isotropy),在传统的词嵌入方法中,研究表明词向量矩阵的前面几个奇异值通常和高频词高度相关,通过将嵌入分布变换到各向同性的分布上,奇异值就可以被压缩。另外,标准高斯分布是凸的,或者说是没有"空洞",因此语义分布更为光滑。

Flow-based Generative Model

基于标准化流的生成模型定义了一个从潜在空间

mathcal{Z}

到观测空间

mathcal{U}

的可逆变换

f:mathcal{Z}tomathcal{U}

,标准化流的生成过程为

mathbf{z} sim p_{mathcal{Z}}(mathbf{z}), mathbf{u}=f_{phi}(mathbf{z})

通过变量代换定理,

x

的PDF可以表示为

p_{mathcal{U}}(mathbf{u})=p_{mathcal{Z}}left(f_{phi}^{-1}(mathbf{u})right)left|operatorname{det} frac{partial f_{phi}^{-1}(mathbf{u})}{partial mathbf{u}}right|

在BERT-flow中,

p_{mathcal{Z}}

是标准高斯分布,

mathcal{U}

是BERT句向量分布,注意flow的训练是无监督的,并且BERT的参数并不参与训练,只有标准化流的参数被优化,训练目标为最大化预先计算好的BERT句向量的似然函数:

max _{phi} quad mathbb{E}_{mathbf{u}=text { BERT(sentence) }, text { sentence } sim mathcal{D}}left(log p_{mathcal{Z}}left(f_{phi}^{-1}(mathbf{u})right) log left|operatorname{det} frac{partial f_{phi}^{-1}(mathbf{u})}{partial mathbf{u}}right| right)

其中

f_phi

是一个可逆神经网络,作者借鉴并简化了Glow模型的设计,将Glow的仿射耦合变换替换为了加性耦合变换,将

1times 1

卷积替换为了随机置换。最后我们学习到了一个双射

f_{phi}^{-1}

,它可以无损地将BERT句向量

mathbf{u}

变换为潜在的高斯表示

mathbf{z}

,语义的无损传输是由

f_phi

的可逆性保证的。

Experiments

为了验证BERT-flow的有效性,作者以SBERT的实验结果为基础,在一系列文本语义相似度计算任务上进行了模型对比和评估。

Semantic Textual Similarity

作者利用SentEval Toolkit在STS-B,SICK-R,STS tasks 2012-2016的测试集上进行模型评估。与SBERT的评估过程一致,作者首先使用句子编码器得到句向量,然后计算句向量对的cosine相似度作为语义相似度的预测值,最后计算预测相似度和人工标注相似度的Spearman秩相关系数。

Unsupervised Training

由于标准化流的训练过程是完全无监督的,所以作者在整个目标数据集上(train val test)训练了标准化流(flow(target)),为了与SBERT对比,作者也用SNLI和MNLI数据集(统称为NLI)无监督地训练标准化流(flow(NLI*)),注意在整个训练过程中预训练BERT部分的参数是不变的,实验结果如下表所示。

可以发现,在目标数据集上训练flow(BERT-flow(target))比在NLI数据集上训练flow(BERT-flow(NLI*))要好不少,除了SICK-R数据集,这是因为SICK-R数据集包含了文本蕴含和文本相关两类任务,而NLI数据集正好包含了文本蕴含任务,因此SICK-R和NLI数据集的差异可能很小,又因为NLI数据集比SICK-R大得多,所以这样的结果是可以理解的。但在实际应用场景下,在目标数据集上训练模型通常是更好的选择。

Supervised Training

当前文本语义相似度计算的SOTA基线模型依旧是SBERT,SBERT同样是在NLI数据集上以有监督的方式训练的,为了和SBERT对比,作者首先以SBERT的训练方式在相同的数据集上微调了BERT部分(BERT-NLI),然后再无监督地微调flow部分。「这实际上等价于在SBERT后面加了个flow,区别在于BERT-flow利用了目标数据集来无监督训练flow,而SBERT并没有以任何方式利用目标数据集」,所以BERT-flow好也是好得理所当然的。实验结果如下表所示,可以认为BERT-flow是一个新的SOTA模型。

Unsupervised Question-Answer Entailment

上面的文本语义相似度计算任务是回归式的,而文本语义匹配任务是二分类式的,比如判断某个答案是否能够回答某个问题。因此作者在问答蕴含(QA entailment)任务上进一步测试了BERT-flow。作者在QNLI数据集上进行实验,并计算出了不同模型在验证集上的AUC,实验结果表明flow的引入能够较大幅度地提高模型表现。

Comparison with Other Embedding Calibration Baselines

针对句向量空间分布不规整的问题,前人也提出了一些修正方法,比如对句向量做标准化(SN):

displaystylefrac{mathbf{u}-boldsymbol{mu}}{boldsymbol{sigma}}

,以及归零前

k

个奇异向量来规避各向异性的问题(NATSV)。下面的实验结果表明作者的flow是最先进的方法,虽然NATSV可以缓解各向异性的问题,但粗暴地丢弃前

k

个奇异向量会导致语义信息的部分丢失,而flow的操作是无损的。

Semantic Similarity Versus Lexical Similarity

作者进一步讨论了文本的语义相似度和词汇相似度(Lexical Similarity)的关系,作者将编辑距离(edit distance)作为文本词汇相似度的度量,然后分别计算了人类标注的语义相似度、BERT语义相似度、BERT-flow语义相似度和词汇相似度的Spearman相关系数

rho

我们可以发现真实的语义相似度和词汇相似度的相关性很弱(

rho=-24.61

),因为我们知道一个词的变动就可能使得文本的语义完全相反(比如加入一个否定词),而BERT计算的语义相似度和词汇相似度表现出了较强的相关性(

rho=-50.49

),尤其是当编辑距离小于4的时候(green)相关性非常强,这会导致BERT可能难以区分like和dislike的语义差别。而引入flow之后,可以发现上述情况有明显的改善,尤其是当编辑距离小于4的时候改善更明显,「这表明BERT-flow计算的相似度更接近于真实的语义相似度,而不是词汇相似度。」

Discussion

标准化流用于规整分布的思想挺有价值的,VAE和标准化流的结合就非常多,比如在CV里面,Variational Autoencoders with Normalizing Flow Decoders (2020)[8]就把Glow和VAE结合起来同时解决Glow难以训练和VAE生成图像偏模糊的问题。因此如何在其他模型里面有效地利用标准化流的优秀性质也是值得一灌的方向。

本文参考资料

[1]

On the Sentence Embeddings from Pre-trained Language Models: https://arxiv.org/abs/2011.05864

[2]

bohanli/BERT-flow: https://github.com/bohanli/BERT-flow

[3]

AFS数据集: https://www.aclweb.org/anthology/W16-3636.pdf

[4]

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (EMNLP 2019): https://arxiv.org/abs/1908.10084

[5]

Breaking the Softmax Bottleneck: A High-Rank RNN Language Model (ICLR 2018): https://arxiv.org/abs/1711.03953

[6]

Representation Degeneration Problem in Training Natural Language Generation Models (ICLR 2019): https://arxiv.org/abs/1907.12009

[7]

Towards Understanding Linear Word Analogies (ACL 2019): https://arxiv.org/abs/1810.04882

[8]

Variational Autoencoders with Normalizing Flow Decoders (2020): https://arxiv.org/abs/2004.05617?context=stat

0 人点赞