【自然语言处理】【聚类】DCSC:利用基于对比学习的半监督聚类算法进行意图挖掘

利用基于对比学习的半监督聚类算法进行意图挖掘
《Semi-Supervised Clustering with Contrastive Learning for Discovering New Intents》

论文地址:https://arxiv.org/pdf/2201.07604.pdf

相关博客:
【自然语言处理】【聚类】基于神经网络的聚类算法DEC
【自然语言处理】【聚类】基于对比学习的聚类算法SCCL
【自然语言处理】【聚类】DCSC:利用基于对比学习的半监督聚类算法进行意图挖掘
【自然语言处理】【聚类】DeepAligned:使用深度对齐聚类发现新意图
【自然语言处理】【聚类】CDAC+:通过深度自适应聚类发现新意图
【计算机视觉】【聚类】DeepCluster:用于视觉特征无监督学习的深度聚类算法
【计算机视觉】【聚类】SwAV:基于对比簇分配的无监督视觉特征学习
【计算机视觉】【聚类】CC:对比聚类
【计算机视觉】【聚类】SeLa:同时进行聚类和表示学习的自标注算法
【自然语言处理】【聚类】ECIC:通过迭代分类增强短文本聚类
【自然语言处理】【聚类】TELL:可解释神经聚类

一、简介

1. 意图挖掘

​ 任务导向的对话系统依赖于自然语言理解( NLU \text{NLU} NLU),用于将对话分类到一个已知的意图,并利用预先准备好的答案进行回复。如果能够尽可能的发现新意图,那么聊天机器人就能够回答更多种类的问,从而改善用户体验。通常会使用聚类算法将意图相同的样本聚在同一个簇中,每个簇可以看作是一个意图。此外,聚类的准确率对于意图识别模型也很重要,因为聚类后的样本会被用于训练分类模型。因此,一个好的聊天机器人不仅依赖 NLU \text{NLU} NLU能力,还依赖聚类这种前期准备的工作。

2. 聚类

​ 意图挖掘这个领域有很多的工作被提出。早期主要是聚焦在无监督聚类算法,基础的方法是合并一个编码器模型和聚类模型。一般来说,特征抽取编码器使用 BERT \text{BERT} BERT SBERT \text{SBERT} SBERT这样的语言模型,聚类模型则使用 K-Mean++ \text{K-Mean++} K-Mean++ HDBSCAN \text{HDBSCAN} HDBSCAN等机器学习方法。但是,这种分离编码步骤和聚类步骤的方法,并不能通过聚类损失函数来优化编码器的向量表示。为了解决这个问题,早期的一些工作使用基于深度学习的距离方法,例如 DEC \text{DEC} DEC DCN \text{DCN} DCN。这些方法将向量表示和无监督聚类合并至同一优化过程,并改善了最终的效果。近期,一些研究尝试引入对比学习损失函数来进一步改善效果。模型 DeepCluster \text{DeepCluster} DeepCluster SwAV \text{SwAV} SwAV通过使用对比学习和基于深度学习的聚类极大的改善了下游任务的图像表示。模型 SCCL \text{SCCL} SCCL则使用对比学习改善 DEC \text{DEC} DEC,在无监督文本聚类任务上取得了相当好的效果。

  • 半监督聚类

    一般来说,在真实场景中存在着少量已知意图的样本可以使用,但是还存在着大量的无标注语料等待着被分类到已知或者未知的意图。无监督聚类方法无法从这些标注数据中获益从而指定聚类过程,因此近期的研究尝试使用半监督模型来利用这些有限的监督信息。模型 CDAC+ \text{CDAC+} CDAC+使用成对相似标注样本来指定聚类过程; DeepAligned \text{DeepAligned} DeepAligned则通过标注样本先训练一个效果更好的编码器,然后使用 K-Mean \text{K-Mean} K-Mean产生的伪标签来迭代训练这个编码器。

3. 模型 DCSC \text{DCSC} DCSC

​ 总体来说,存在两个途径来改善聚类。

  • 利用标注好的意图样本来更好的初始化文本向量表示;
  • 构建一个联合优化向量表示和聚类的模型;

​ 论文提出了基于深度对比的半监督聚类算法 DCSC \text{DCSC} DCSC,该算法使用 BERT \text{BERT} BERT作为主干网络,并通过两阶段任务来训练。第一阶段, DCSC \text{DCSC} DCSC使用交叉熵和监督对比学习来利用标注样本,并利用无监督对比损失来利用未标注样本。第二阶段,我们通过分类器构建伪标签,然后使用交叉熵和监督对比损失函数来在真实标签和伪标签上进行训练。

​ 此外,论文在公开数据集 Clinc \text{Clinc} Clinc Banking \text{Banking} Banking上进行了实验,且实验设置与 DeepAligned \text{DeepAligned} DeepAligned保持一致。此外,论文使用 Accuarcy(ACC) \text{Accuarcy(ACC)} Accuarcy(ACC) Adjusted Rand Index(ARI) \text{Adjusted Rand Index(ARI)} Adjusted Rand Index(ARI) Normalized Mutual Infomation(NMI) \text{Normalized Mutual Infomation(NMI)} Normalized Mutual Infomation(NMI)作为评估指标。

二、相关工作

1. 对比学习

​ 对比学习从不同的视角对样本进行增强,然后令模型区分相同样本的不同视角下的增强。例如 SimCLR \text{SimCLR} SimCLR通过对比学习在下游任务中实现了很好的效果。 SimCSE \text{SimCSE} SimCSE则使用简单有效的方法实现了 NLP \text{NLP} NLP任务的数据增强,并在语义相似度任务上实现了非常好的效果。此外,对比学习被扩展至监督任务上,在嵌入空间中将相同类别的样本拉近,将不同类别的样本拉远。

2. 深度聚类

​ 使用深度网络联合优化向量表格和聚类,可以使向量表示更加适合聚类空间。 DEC \text{DEC} DEC这样的早期工具,使用神经网络替换 K-Means \text{K-Means} K-Means,然后迭代优化神经网络。但是,这种方法可能会导致平凡解,即大多数的实例可能被分配至同一个簇。 SwAV \text{SwAV} SwAV则将聚类问题转换为运输问题,然后使用 Sinkhorn-Knopp \text{Sinkhorn-Knopp} Sinkhorn-Knopp算法来产生软、伪分配。

3. 半监督聚类

​ 一些研究尝试利用半监督聚类算法进行意图发现。 DeepAligned \text{DeepAligned} DeepAligned提出了两阶段训练策略,骨干网络使用分类标签获取更好的向量表示,然后通过 K-Mean \text{K-Mean} K-Mean产生的伪标签训练分类模型。

三、方法

DCSC \text{DCSC} DCSC的目标是从原始语料中发现新意图,主要包括两个阶段:warm up阶段和聚类阶段。

1. Warm Up阶段

DCSC \text{DCSC} DCSC的主干网络是语言模型,其使用语言模型的隐藏层输出,然后使用mean pooling聚合出维度为 D D D的文本向量表示,并使用全连接层获取最终的向量表示。在数据增强阶段,使用 SimCSE \text{SimCSE} SimCSE相同的策略,也就是使样本输入具有dropout骨干网络来获得2个不同视角的样本。给定一个batch的样本 X = { x 1 , x 2 , … , x N } X=\{x_1,x_2,\dots,x_N\} X={x1,x2,,xN},然后通过骨干网络得到的两个不同视角的输出为 Z = { z 1 , z 2 , … , z N } Z=\{z_1,z_2,\dots,z_N\} Z={z1,z2,,zN} Z ′ = { z N + 1 , z N + 2 , … , z 2 N } Z'=\{z_{N+1},z_{N+2},\dots,z_{2N}\} Z={zN+1,zN+2,,z2N},其中索引 I = { 1 , 2 , … , 2 N } I=\{1,2,\dots,2N\} I={1,2,,2N}

​ 对于那些有标注样本,其具有标注 Y = { y 1 , y 2 , … , y N } Y=\{y_1,y_2,\dots,y_N\} Y={y1,y2,,yN} DCSC \text{DCSC} DCSC会计算交叉熵损失函数 L c e w a r m u p \mathcal{L}_{ce}^{warmup} Lcewarmup
L c e w a r m u p = − 1 N ∑ i = 1 N l o g    exp ( w y i ⋅ z i ) ∑ j = 1 K exp ( w j ⋅ z i ) \mathcal{L}_{ce}^{warmup}=-\frac{1}{N}\sum_{i=1}^Nlog\;\frac{\text{exp}(w_{y_i}\cdot z_i)}{\sum_{j=1}^K\text{exp}(w_j\cdot z_i)} Lcewarmup=N1i=1Nlogj=1Kexp(wjzi)exp(wyizi)
其中, K K K是已知意图的数量, W = { w 1 , w 2 , … , w n } W=\{w_1,w_2,\dots,w_n\} W={w1,w2,,wn}形状为 ( K , D ) (K,D) (K,D)的分类器权重。这个warm up 步骤类似于 DeepAligned \text{DeepAligned} DeepAligned,但是作者认为这种分类任务并不能为聚类产生理想的向量表示。为此,本文添加了另一个监督对比学习损失函数,用于调整同一类别和不同类别样本间的距离。监督对比损失函数为
L s c w a r m u p = ∑ i = 1 2 N − 1 ∣ P ( i ) ∣ ∑ p ∈ P ( i ) log    exp ( z i ⋅ z p / τ ) ∑ j ∈ A ( i ) exp ( z i ⋅ z j / τ ) \mathcal{L}_{sc}^{warmup}=\sum_{i=1}^{2N}\frac{-1}{|P(i)|}\sum_{p\in P(i)}\text{log}\;\frac{\text{exp}(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}\text{exp}(z_i\cdot z_j/\tau)} Lscwarmup=i=12NP(i)1pP(i)logjA(i)exp(zizj/τ)exp(zizp/τ)
其中, A ( i ) ≡ I ∖ { i } , P ( i ) ≡ { p ∈ A ( i ) : y ~ p = y ~ i } A(i)\equiv I\setminus \{i\},P(i)\equiv\{p\in A(i):\tilde{y}_p=\tilde{y}_i\} A(i)I{i},P(i){pA(i):y~p=y~i},且 τ ∈ R + \tau\in\mathcal{R}^+ τR+。因此,最终的有监督损失函数 L s u p w a r m u p \mathcal{L}_{sup}^{warmup} Lsupwarmup
L s u p w a r m u p = L c e w a r m u p + L s c w a r m u p \mathcal{L}_{sup}^{warmup}=\mathcal{L}_{ce}^{warmup}+\mathcal{L}_{sc}^{warmup} Lsupwarmup=Lcewarmup+Lscwarmup
此外, DCSC \text{DCSC} DCSC会在所有的样本上应用传统的对比损失函数,从而进一步改进骨干网络的初始化表示。无监督对比损失函数 L u n s u p w a r m u p \mathcal{L}_{unsup}^{warmup} Lunsupwarmup
L u n s u p w a r m u p = − ∑ i = 1 2 N log    e x p ( z i ⋅ z m ( i ) / τ ) ∑ j ∈ A ( i ) e x p ( z i ⋅ z j ) / τ \mathcal{L}_{unsup}^{warmup}=-\sum_{i=1}^{2N}\text{log}\;\frac{exp(z_i\cdot z_{m(i)}/\tau)}{\sum_{j\in A(i)}exp(z_i\cdot z_j)/\tau} Lunsupwarmup=i=12NlogjA(i)exp(zizj)/τexp(zizm(i)/τ)
其中, z m ( i ) z_{m(i)} zm(i)是实体 z i z_i zi另一个视角的增强样本。在warm up阶段,交替进行有监督和无监督训练。

2. 聚类Stage

​ warm up阶段后,使用训练好的骨干网络为所有实例抽取向量表示,并在向量表示上应用 K-Mean++ \text{K-Mean++} K-Mean++来获取簇中心 C ′ C' C,其中 C ′ C' C的形状为 ( G , D ) (G,D) (G,D) G G G是真实意图的数量。然后,使用 Hungarian \text{Hungarian} Hungarian算法来完成 W W W C ′ C' C进行对齐, W W W包含了已知意图的向量表示( K < G K<G K<G), C ′ C' C是所有的真实意图向量表示。经过对齐后得到 C = { c 1 , c 2 , … , c K } C=\{c_1,c_2,\dots,c_K\} C={c1,c2,,cK},其索引顺序同 W W W。简单起见,对 C ′ C' C进行重新排序 C ′ = { c 1 , c 2 , … , c K , c K + 1 , … , C G } C'=\{c_1,c_2,\dots,c_K,c_{K+1},\dots,C_G\} C={c1,c2,,cK,cK+1,,CG}

​ 同warm up阶段一样,聚类阶段也会输出一个batch的数据来获取成对输入 Z = { z 1 , z 2 , … , z N } Z=\{z_1,z_2,\dots,z_N\} Z={z1,z2,,zN} Z ′ = { z N + 1 , z N + 2 , … , z 2 N } Z'=\{z_{N+1},z_{N+2},\dots,z_{2N}\} Z={zN+1,zN+2,,z2N}

​ 论文参考 SwAV \text{SwAV} SwAV的自监督聚类算法。具体来说,使用聚类头对 Z Z Z Z ′ Z' Z进行预测并得到 logit \text{logit} logit,即 Q = { q 1 , q 2 , … , q N } Q=\{q_1,q_2,\dots,q_N\} Q={q1,q2,,qN} Q ′ = { q N + 1 , q N + 2 , … , q 2 N } Q'=\{q_{N+1},q_{N+2},\dots,q_{2N}\} Q={qN+1,qN+2,,q2N}
q i j = c j ⋅ z i , ∀ i ∈ { 1 , … , 2 N } , j ∈ { 1 , … , G } q_{ij}=c_j\cdot z_i,\forall i\in\{1,\dots,2N\},j\in\{1,\dots,G\} qij=cjzi,i{1,,2N},j{1,,G}
q i j q_{ij} qij表示样本 z i z_i zi与簇中心 c j c_j cj的相似度。

​ 然后使用 Sinkhorn-Knopp \text{Sinkhorn-Knopp} Sinkhorn-Knopp Q Q Q Q ′ Q' Q生成软伪簇分配,称为 A = { a 1 , a 2 , … , a N } A=\{a_1,a_2,\dots,a_N\} A={a1,a2,,aN} A ′ = a N + 1 , a N + 2 , … , a 2 N A'={a_{N+1},a_{N+2},\dots,a_{2N}} A=aN+1,aN+2,,a2N,形状为 ( N , G ) (N,G) (N,G)。此外,还会使用 argmax \text{argmax} argmax获取硬分配 B = { b 1 , b 2 , … , b N } B=\{b_1,b_2,\dots,b_N\} B={b1,b2,,bN} B ′ = { b N + 1 , b N + 2 , … , b 2 N } B'=\{b_{N+1},b_{N+2},\dots,b_{2N}\} B={bN+1,bN+2,,b2N},形状为 N N N Sinkhorn-Knopp \text{Sinkhorn-Knopp} Sinkhorn-Knopp会为每个实体设置一个软分配的分数,其分配是不仅考虑本身的 logit \text{logit} logit,也会考虑同一batch中其他的 logit \text{logit} logit,从而计算出所有意图的最优分布并避免平凡解。基于软伪分配,计算交叉熵损失函数 L s i n k h o r n c l u s t e r \mathcal{L}_{sinkhorn}^{cluster} Lsinkhorncluster
L l e f t c l u s t e r = − 1 N ∑ i = 1 N ∑ j = 1 G ( a ( i + N ) j ⋅ l o g    e x p ( q i j ) ∑ r = 1 G e x p ( q i r ) ) L r i g h t c l u s t e r = − 1 N ∑ i = N + 1 2 N ∑ j = 1 G ( a ( i − N ) j ⋅ l o g    e x p ( q i j ) ∑ r = 1 G e x p ( q i r ) ) L s i n k h o r n c l u s t e r = ( L l e f t c l u s t e r + L r i g h t c l u s t e r ) / 2 \mathcal{L}_{left}^{cluster}=-\frac{1}{N}\sum_{i=1}^N\sum_{j=1}^G\Big(a_{(i+N)j}\cdot log\;\frac{exp(q_{ij})}{\sum_{r=1}^G exp(q_{ir})}\Big) \\ \mathcal{L}_{right}^{cluster}=-\frac{1}{N}\sum_{i=N+1}^{2N}\sum_{j=1}^G\Big(a_{(i-N)j}\cdot log\;\frac{exp(q_{ij})}{\sum_{r=1}^G exp(q_{ir})}\Big) \\ \mathcal{L}_{sinkhorn}^{cluster}=(\mathcal{L}_{left}^{cluster}+\mathcal{L}_{right}^{cluster})/2 Lleftcluster=N1i=1Nj=1G(a(i+N)jlogr=1Gexp(qir)exp(qij))Lrightcluster=N1i=N+12Nj=1G(a(iN)jlogr=1Gexp(qir)exp(qij))Lsinkhorncluster=(Lleftcluster+Lrightcluster)/2
其中, c ∈ C ′ c\in C' cC

​ 此外,为了使向量表示空间中相同簇样本更加接近,从而获得更好的聚类表现。论文也根据产生的伪标签 B B B B ′ B' B,添加了监督对比损失函数 L p s e u d o c l u s t e r \mathcal{L}_{pseudo}^{cluster} Lpseudocluster
L p s e u d o c l u s t e r = ∑ i = 1 2 N − 1 ∣ H ( i ) ∣ ∑ h ∈ H ( i ) log ⁡    e x p ( z i ⋅ z p / τ ) ∑ j ∈ A ( i ) e x p ( z i ⋅ z j / τ ) \mathcal{L}_{pseudo}^{cluster}=\sum_{i=1}^{2N}\frac{-1}{|H(i)|}\sum_{h\in H(i)}\log\;\frac{exp(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}exp(z_i\cdot z_j/\tau)} Lpseudocluster=i=12NH(i)1hH(i)logjA(i)exp(zizj/τ)exp(zizp/τ)
其中, H ( i ) ≡ { h ∈ A ( i ) : b ~ p = b ~ i } H(i)\equiv \Big\{h\in A(i):\tilde{b}_p=\tilde{b}_i\Big\} H(i){hA(i):b~p=b~i}。这样,深度聚类的最终损失函数为
L m a i n c l u s t e r = L s i n k h o r n c l u s t e r + L p s e u d o c l u s t e r \mathcal{L}_{main}^{cluster}=\mathcal{L}_{sinkhorn}^{cluster}+\mathcal{L}_{pseudo}^{cluster} Lmaincluster=Lsinkhorncluster+Lpseudocluster

  • 知识遗忘

    在上面的聚类阶段,在几个epoch后已知意图分类的准确率会下降,似乎是模型遗忘了warm up阶段学习到的信息,这可能导致聚类效果变差。为了保持在已知意图上的分类准确率,我们让模型继续在标注样本上进行训练。此外,为了让标注样本更好的指导聚类过程,令分类层和聚类层共享相同的参数 C C C。监督损失函数为
    L c e c l u s t e r = − 1 N ∑ i = 1 N l o g    e x p ( c y i ⋅ z i ) ∑ j = 1 K e x p ( c j ⋅ z i ) , ∀ c ∈ C L s c c l u s t e r = ∑ i = 1 2 N − 1 ∣ P ( i ) ∣ ∑ p ∈ P ( i ) log    exp ( z i ⋅ z p / τ ) ∑ j ∈ A ( i ) exp ( z i ⋅ z j / τ ) L s u p c l u s t e r = L c e c l u s t e r + L s c c l u s t e r \mathcal{L}_{ce}^{cluster}=-\frac{1}{N}\sum_{i=1}^Nlog\;\frac{exp(c_{y_i}\cdot z_i)}{\sum_{j=1}^K exp(c_j\cdot z_i)},\forall c\in C \\ \mathcal{L}_{sc}^{cluster}=\sum_{i=1}^{2N}\frac{-1}{|P(i)|}\sum_{p\in P(i)}\text{log}\;\frac{\text{exp}(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}\text{exp}(z_i\cdot z_j/\tau)} \\ \mathcal{L}_{sup}^{cluster}=\mathcal{L}_{ce}^{cluster}+\mathcal{L}_{sc}^{cluster} Lcecluster=N1i=1Nlogj=1Kexp(cjzi)exp(cyizi),cCLsccluster=i=12NP(i)1pP(i)logjA(i)exp(zizj/τ)exp(zizp/τ)Lsupcluster=Lcecluster+Lsccluster

聚类阶段也采用监督学习和聚类学习交替的方式。