【自然语言处理】【聚类】CDAC+:通过深度自适应聚类发现新意图

CDAC+:通过深度自适应聚类发现新意图
《Discovering New Intents via Constrained Deep Adaptive Clustering with Cluster Refinement》

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

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

一、简介

  • 意图发现

    ​ 发现用户未被满足的新意图是对话系统中的重要任务。通过将相似语料聚类成相同的簇,可以识别出新的商业机会,并决定系统未来的发展方向。由于许多对话数据是未标注的,一个好的聚类算法能够帮助自动发现合理的分类,识别潜在的用户需求。

    ​ 但是,实现这样的聚类算法面临两个挑战。

    • 精准估计新意图的数量十分困难;
    • 聚类的结果很难符合人的期望。例如,假设需要根据用户遇到的技术问题来划分数据,最终可能会按问题的类型进行聚类;
  • 现有方法

    • Hakkani-Tur \text{Hakkani-Tur} Hakkani-Tur等人使用语义解决将用户的语料分解成图,然后基于频率和熵进行剪枝;
    • Padmasundari \text{Padmasundari} Padmasundari通过集成方法来合并不同聚类算法和表示方法的结果;
    • AutoDial \text{AutoDial} AutoDial抽取所有类型的特征(例如 POS \text{POS} POS标记和关键词),然后使用层次聚类来聚合句子;
    • Haponchyk \text{Haponchyk} Haponchyk使用预定义的结构化输出来指导聚类过程;

    但是,这些方法都需要密集的特征工程。此外,这些方法以pipeline的方式执行表示学习和簇分配,可能导致较差的效果。

  • 解决方案

    ​ 实际场景中,存在着有限的标注数据和大量的无标注数据,且预先不知道所有的意图类别。此外,训练数据存在噪音,即无标注数据中既有已知意图,也有未知意图。关键是如何利用标注数据来有效地改进聚类效果。

    ​ 为了解决这些问题,本文提出了一种端到端的聚类方法 CDAC+ \text{CDAC+} CDAC+,在聚类的过程中优化意图的向量表示。此外,还利用预训练语言模型 BERT \text{BERT} BERT和标注数据来帮助聚类过程。具体来说,整个方法划分为三个步骤。

    • 首先,从 BERT \text{BERT} BERT获取意图的向量表示;(意图表示)
    • 其次,构造成对分类任务来作为聚类的替代。使用意图表示来计算句子对的相似矩阵,然后使用相似与否的标签来训练网络;(成对分类)
    • 最后,使用辅助 t t t分布和 KL \text{KL} KL散度来鼓励模型从高置信度分配中学习;(簇细化)

二、意图表示

​ 使用预训练语言模型 BERT \text{BERT} BERT来获取意图向量表示。给定语料库中的第 i i i个句子 x i x_i xi,从 BERT \text{BERT} BERT的最后隐藏层获取所有token的嵌入向量 [ C , T 1 , … , T N ] ∈ R ( N + 1 ) × H [C,T_1,\dots,T_N]\in\mathbb{R}^{(N+1)\times H} [C,T1,,TN]R(N+1)×H。利用 mean-pooling \text{mean-pooling} mean-pooling来获得平均表示 e i ∈ R H e_i\in\mathbb{R}^H eiRH
e i = mean-pooling ( [ C , T 1 , … , T N ] ) e_i=\text{mean-pooling}([C,T_1,\dots,T_N]) ei=mean-pooling([C,T1,,TN])
其中, N N N是序列长度, H H H是隐藏层大小。然后,将 e i e_i ei送入聚类层 g g g,并获得意图的向量表示 I i ∈ R k I_i\in\mathbb{R}^k IiRk
g ( e i ) = I i = W 2 ( Dropout ( tanh ( W 1 e i ) ) ) g(e_i)=I_i=W_2(\text{Dropout}(\text{tanh}(W_1 e_i))) g(ei)=Ii=W2(Dropout(tanh(W1ei)))
其中, W 1 ∈ R H × H W_1\in\mathbb{R}^{H\times H} W1RH×H W 2 ∈ R H × k W_2\in\mathbb{R}^{H\times k} W2RH×k是可学习参数, k k k是簇数量。

三、成对分类

​ 聚类的本质是衡量样本间的相似度。受模型 DAC \text{DAC} DAC的启发,本文将聚类问题重新为成对分类问题。通过学习句子是否相似,模型能够学习到有益于聚类的意图表示。使用意图向量表示 I I I来计算相似矩阵 S S S
S i j = I i I j T ∥ I i ∥ ∥ I j ∥ S_{ij}=\frac{I_i I_j^T}{\parallel I_i \parallel\parallel I_j \parallel} Sij=IiIjIiIjT
其中, ∥ ⋅ ∥ \parallel \cdot \parallel L2 \text{L2} L2范数,并且 i , j ∈ { 1 , … , n } i,j\in\{1,\dots,n\} i,j{1,,n};batch size为n; S i j S_{ij} Sij表示句子 x i x_i xi x j x_j xj的相似度。然后,迭代地使用监督和自监督步骤来优化模型。

1. 监督步骤

​ 给定少量的标注数据,构造标签矩阵 R \text{R} R
R i j : = { 1 ,    if y i = y j 0 ,    if y i ≠ y j , R_{ij}:= \begin{cases} 1,\;\text{if}\quad y_i=y_j \\ 0,\;\text{if}\quad y_i\neq y_j, \end{cases} Rij:={1,ifyi=yj0,ifyi=yj,
其中, i , j ∈ { 1 , … , n } i,j\in\{1,\dots,n\} i,j{1,,n}。使用相似矩阵 S S S和标签矩阵 R R R来计算损失函数 L s i m \mathcal{L}_{sim} Lsim
L s i m ( R i j , S i j ) = − R i j log ( S i j ) − ( 1 − R i j ) log ( 1 − S i j ) \mathcal{L}_{sim}(R_{ij},S_{ij})=-R_{ij}\text{log}(S_{ij})-(1-R_{ij})\text{log}(1-S_{ij}) Lsim(Rij,Sij)=Rijlog(Sij)(1Rij)log(1Sij)
这里将标注数据作为先验,并使用它指导聚类过程。

2. 自监督步骤

​ 通过相似矩阵 S S S上应用动态阈值,获取自标注矩阵 R ^ \hat{R} R^
R ^ i j : = { 1 , if S i j > u ( λ )    or    y i = y j 0 , if S i j < l ( λ )    or    y i ≠ y j Not selected, otherwise \hat{R}_{ij}:= \begin{cases} 1,\text{if}\quad S_{ij}>u(\lambda)\;\text{or}\;y_i=y_j \\ 0,\text{if}\quad S_{ij}<l(\lambda)\;\text{or}\;y_i\neq y_j \\ \text{Not selected, otherwise} \end{cases} R^ij:=1,ifSij>u(λ)oryi=yj0,ifSij<l(λ)oryi=yjNot selected, otherwise
其中, i , j ∈ { 1 , … , n } i,j\in\{1,\dots,n\} i,j{1,,n} u ( λ ) u(\lambda) u(λ)是动态阈值上限, l ( λ ) l(\lambda) l(λ)是动态阈值下限,共同用来决定句子对是否相似。那些介于 u ( λ ) u(\lambda) u(λ) l ( λ ) l(\lambda) l(λ)的句子对不参与训练过程。在本步骤中,混合了标注和未标注数据来训练模型。

​ 此外,添加 u ( λ ) − l ( λ ) u(\lambda)-l(\lambda) u(λ)l(λ)作为样本数量的惩罚项
min λ    E ( λ ) = u ( λ ) − l ( λ ) \mathop{\text{min}}_{\lambda}\;\textbf{E}(\lambda)=u(\lambda)-l(\lambda) minλE(λ)=u(λ)l(λ)
其中, λ \lambda λ是一个控制样本选择的自适应参数,并且迭代更新 λ \lambda λ的值
λ : = λ − η ⋅ ∂ E ( λ ) ∂ λ \lambda:=\lambda-\eta\cdot\frac{\partial\textbf{E}(\lambda)}{\partial\lambda} λ:=ληλE(λ)
其中, η \eta η λ \lambda λ的学习率。由于 u ( λ ) ∝ − λ u(\lambda)\propto -\lambda u(λ)λ l ( λ ) ∝ λ l(\lambda)\propto\lambda l(λ)λ,可以在训练过程中增加 λ \lambda λ来降低 u ( λ ) u(\lambda) u(λ)和提高 l ( λ ) l(\lambda) l(λ)。这方便逐步地选择更多句子来参加训练过程。这当然也可能在 R ^ \hat{R} R^中引入更多的噪音。

​ 最后,使用相似度矩阵 S S S和自标注矩阵 R ^ \hat{R} R^来计算损失函数 L ^ s i m \hat{\mathcal{L}}_{sim} L^sim
L ^ s i m ( R ^ i j , S i j ) = − R ^ i j log ( S i j ) − ( 1 − R ^ i j ) log ( 1 − S i j ) \hat{\mathcal{L}}_{sim}(\hat{R}_{ij},S_{ij})=-\hat{R}_{ij}\text{log}(S_{ij})-(1-\hat{R}_{ij})\text{log}(1-S_{ij}) L^sim(R^ij,Sij)=R^ijlog(Sij)(1R^ij)log(1Sij)
随着阈值的改变,模型会从学习简单分类句子到学习难分类句子对,迭代地获取有益于聚类的表示。当 u ( λ ) ≤ l ( λ ) u(\lambda)\leq l(\lambda) u(λ)l(λ)时,停止迭代并移动到细化阶段。

四、簇细化

这部分的逻辑与模型DEC完全相同。

​ 通过期望最大化方法迭代的细化簇分配,鼓励模型来学习高置信度的分配。首先,给定初始化的簇中心 U ∈ R k × k U\in\mathbb{R}^{k\times k} URk×k,计算意图向量表示和簇中心的软分配。具体来说,使用学生 t t t分布作为评估意图向量表示 I i I_i Ii和簇中心 U j U_j Uj的相似度
Q i j = ( 1 + ∥ I i − U j ∥ 2 ) − 1 ∑ j ′ ( 1 + ∥ I i − U j ∥ 2 ) − 1 Q_{ij}=\frac{(1+\parallel I_i-U_j \parallel^2)^{-1}}{\sum_{j'}(1+\parallel I_i-U_j \parallel^2)^{-1}} Qij=j(1+IiUj2)1(1+IiUj2)1
其中, Q i j Q_{ij} Qij表示样本 i i i属于簇 j j j的概率。

​ 其次,使用辅助目标分布 P P P来强迫模型来学习高置信度分配,从而细化了模型参数和簇中心。定义目标分布 P P P如下:
P i j = Q i j 2 / f i ∑ j ′ Q i j ′ 2 / f j ′ P_{ij}=\frac{Q_{ij}^2/f_i}{\sum_{j'}Q_{ij'}^2/f_{j'}} Pij=jQij2/fjQij2/fi
其中 f i = ∑ i Q i j f_i=\sum_{i}Q_{ij} fi=iQij表示软簇频率。

​ 最后,最小化 P P P Q Q Q KLD \text{KLD} KLD损失函数
L KLD = K L ( P ∥ Q ) = ∑ i ∑ j P i j log P i j Q i j \mathcal{L}_{\text{KLD}}=KL(P\parallel Q)=\sum_i\sum_j P_{ij}\text{log}\frac{P_{ij}}{Q_{ij}} LKLD=KL(PQ)=ijPijlogQijPij
然后,重复上面的两个步骤直至在两次连续迭代中,簇分配的改变小于 δ l a b l e % \delta_{lable}\% δlable%

​ 推断簇中心 c i c_i ci如下:
c i = argmax k    Q i k c_i=\mathop{\text{argmax}}_k\;Q_{ik} ci=argmaxkQik
其中, c i c_i ci是句子 x i x_i xi的簇分配。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BQW_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值