论文地址: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
ei∈RH:
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
Ii∈Rk:
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}
W1∈RH×H且
W
2
∈
R
H
×
k
W_2\in\mathbb{R}^{H\times k}
W2∈RH×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=∥Ii∥∥Ij∥IiIjT
其中,
∥
⋅
∥
\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)−(1−Rij)log(1−Sij)
这里将标注数据作为先验,并使用它指导聚类过程。
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)−(1−R^ij)log(1−Sij)
随着阈值的改变,模型会从学习简单分类句子到学习难分类句子对,迭代地获取有益于聚类的表示。当
u
(
λ
)
≤
l
(
λ
)
u(\lambda)\leq l(\lambda)
u(λ)≤l(λ)时,停止迭代并移动到细化阶段。
四、簇细化
这部分的逻辑与模型DEC完全相同。
通过期望最大化方法迭代的细化簇分配,鼓励模型来学习高置信度的分配。首先,给定初始化的簇中心
U
∈
R
k
×
k
U\in\mathbb{R}^{k\times k}
U∈Rk×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+∥Ii−Uj∥2)−1(1+∥Ii−Uj∥2)−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=∑j′Qij′2/fj′Qij2/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(P∥Q)=i∑j∑PijlogQijPij
然后,重复上面的两个步骤直至在两次连续迭代中,簇分配的改变小于
δ
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的簇分配。