Supporting Clustering with Contrastive Learning笔记

在这里插入图片描述
这篇文章使用了对比学习进行了聚类,一种端到端的离线聚类模型。

主要流程

Feature model

比较主流的句向量编码器SBERT。本文主要使用两个损失函数去微调SBERT的参数。使得SBERT的生成的特征表示具有以下两个特点:

  • 簇间距离拉大(inter-cluster)
  • 簇内距离缩小(intra-cluster)

对于数据 x x x, 编码: e = Φ ( x ) e = \Phi(x) e=Φ(x)

微调完成之后,将得到的 Feature Matrix ,使用K-means进行聚类。典型的离线聚类(outline-cluster)

cluster head

聚类头主要是用这篇paper的思想。

使用 SBERT 对数据进行编码得到 Feature Matrix,然后利用K-means算法进行聚类。得到K(数据集 簇类的数量)个聚类中心。并将他们设置成簇类头的初始参数。
每个前向传播会使用特征向量 x x x 和聚类中心参数 μ \mu μ,结合t-student分布生成一个概率矩阵Q:
q i , k = ( 1 + ∣ ∣ e i − μ k ∣ ∣ 2 2 / α ) − α + 1 2 ∑ k ′ = 1 K ( 1 + ∣ ∣ e i − μ k ′ ∣ ∣ 2 2 / α ) − α + 1 2 q_{i, k} = \frac{(1+||e_i-\mu_k||_2^2 / \alpha)^{-\frac{\alpha+1}{2}}}{\sum_{k'=1}^{K} (1+||e_i-\mu_{k'}||_2^2 / \alpha)^{-\frac{\alpha+1}{2}}} qi,k=k=1K(1+∣∣eiμk22/α)2α+1(1+∣∣eiμk22/α)2α+1
其中, α \alpha α是超参数, q i , k q_{i, k} qi,k 表示数据 x i x_i xi属于 簇 k k k的概率。
然后再使用一个辅助函数,生成一个目标概率分布,这个函数的特点是将Q中每一行数值比较大的元素变得更大一点,相当于是将置信度比较高的数据着重学习一下。
辅助概率分布P:
p i , k = q j k 2 / f k ∑ k ′ q j k 2 / f k ′ p_{i, k} = \frac{q_{jk}^2/f_k}{\sum_{k'} q_{jk}^2/f_{k'}} pi,k=kqjk2/fkqjk2/fk
其中, f k = ∑ i = 1 M q i k f_k = \sum_{i=1}^{M}q_{ik} fk=i=1Mqik, M M M 是batch size 的大小。
最后使用KL散度损失函数,使Q的分布不断向P的分布靠近。

这种做法有三种好处:

  • 提高聚类的纯度
  • 注重使用置信度高的数据
  • 归一化每个之心的损失贡献,防止大簇扭曲数据的特征分布空间。(对这一点我存在质疑,当面对长尾数据集的时候,归一化每个质心的损失贡献会不会起到反作用?)

Contrastive head

这一块的工作相对来说多一点,会涉及到数据增强。
一个数据 x i x_i xi,经过两种数据增强得到 x i a , x i b x_i^{a}, x_i^b xia,xib,在经过编码得到 z i { a , b } = Φ ( x i { a , b } ) z_i^{\{a, b\}} = \Phi(x_i^{\{a, b\}}) zi{a,b}=Φ(xi{a,b})。这篇论文采用了基于上下文的文本增强方式,并和反译法和增删词法做了比较。并说明对于自己的模型,基于上下文方式的文本增强效果更好。
聚类头的就够很简单:一个三层的非线性MLP。
具体的学习方式就是对比学习的基本范式:
l ^ i a = − log ⁡ exp ⁡ ( s ( z i a , z i b ) / τ I ) ∑ j = 1 M [ exp ⁡ ( s ( z i a , z j a ) / τ I ) + exp ⁡ ( s ( z i a , z j b ) / τ I ) ] l ^ i b = − log ⁡ exp ⁡ ( s ( z i a , z i b ) / τ I ) ∑ j = 1 M [ exp ⁡ ( s ( z i b , z j a ) / τ I ) + exp ⁡ ( s ( z i b , z j b ) / τ I ] \hat{l}_i^a = -\log \frac{\exp(s(z_i^a, z_i^b)/\tau_I)}{\sum_{j=1}^{M} [\exp(s(z_i^a, z_j^a)/\tau_I) + \exp(s(z_i^a, z_j^b)/\tau_I) ]} \\ \hat{l}_i^b = -\log \frac{\exp(s(z_i^a, z_i^b)/\tau_I)}{\sum_{j=1}^{M} [\exp(s(z_i^b, z_j^a)/\tau_I) + \exp(s(z_i^b, z_j^b)/\tau_I ]} l^ia=logj=1M[exp(s(zia,zja)/τI)+exp(s(zia,zjb)/τI)]exp(s(zia,zib)/τI)l^ib=logj=1M[exp(s(zib,zja)/τI)+exp(s(zib,zjb)/τI]exp(s(zia,zib)/τI)
总的损失函数:
L i n s = 1 2 M ∑ i = 1 N ( l ^ i a + l ^ i b ) L_{ins} = \frac{1}{2M} \sum_{i=1}^{N} (\hat{l}_i^a + \hat{l}_i^b) Lins=2M1i=1N(l^ia+l^ib)
其中, τ I \tau_I τI 是温度参数, M M M 是batch size的大小, s ( ⋅ ) s(\cdot) s() 是相似性度量,具体表达为: s ( z i , z j ) = z i T z j / ∣ ∣ z i ∣ ∣ 2 ⋅ ∣ ∣ z j ∣ ∣ 2 s(z_i, z_j) = z_i^Tz_j / ||z_i||_2 \cdot ||z_j||_2 s(zi,zj)=ziTzj/∣∣zi2∣∣zj2

结果展示

在这里插入图片描述
效果显而易见。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值