【论文笔记】Unsupervised Deep Embedding for Clustering Analysis

2016 ICML DEC paper

导读:

结合VAE去做聚类的开创工作,目前引用接近800,是非常有意义的工作

虽然网上大家的讲解也基本上能够概括他的核心思想了,就是在VAE的基础上,通过辅助分布来进行一个encoding能力的学习,最后通过latent code来进行聚类。

但是对于其中的具体细节还是语焉不详,虽然这篇文章已经看了有两遍了,其他的博客也看了不少,但还是自己再梳理一些细节。

核心思路

  • 用DNN去做latent code的学习,并将低维的latent code用于聚类
  • 使用辅助聚类分布与中心,将数据点划分至聚类中

问题设置

  • Unsupervised
  • Encoding learning and clustering jointly (End to End)

1. Introduction

作者从CV中获取的灵感:学习更好的特征能够在benchmark上获得更好的结果,但需要supervised的情景。作者希望用于unsupervised的设定下

因此:

  • 定义非线性映射将数据 X X X映射至特征空间 Z Z Z并优化这个映射(笔者:就是特征的encoder)
  • 与之前直接优化数据空间或者特征空间的工作不同(笔者:就是通过supervised的形式进行优化feature表征的不同)作者使用SGD对聚类目标函数进行反向传播,从而对encoder进行优化。
  • 作者称该聚类算法为DEC

然而优化DEC是困难的,主要原因是特征学习没法用label,因此作者提出使用当前的soft cluster assignment衍生的目标分布,用于迭代优化聚类。(笔者:就是用当前的encoding结果,得出聚类结果,再通过聚类产生目标分布作为优化的目标,从而优化encoder,以优化最终的聚类结果)

2. Related Work

这部分作者介绍了distance-based clustering, spectral clustering以及他们的变体。(前5段)

优化两个分布之间的KL散度被用于可视化以及降维中,例如 T-SNE 以及 t-SNE.

从parametric t-SNE中得到灵感。并非优化KL散度以产生一个embdding满足距离在原始空间不变(笔者:这是t-SNE的assumption,高维空间的点映射到低维空间之中,其点与点之间的距离应该保持不变)作者定义了一个基于中心的概率分布(笔者:作为一个聚出来的类)并且最小化他与辅助的目标分布之间的KL散度,从而同步优化聚类赋值以及特征表示。时间复杂度仅为 O ( n k ) O(nk) O(nk) k k k为中心点的数量。

3. Deep embedded clustering

n n n { x i ∈ X } i = 1 n \{x_i\in X\}_{i=1}^n {xiX}i=1n点聚类至 k k k个中心,每一个中心用 μ j , j = 1 , . . . , k \mu_j, j=1,...,k μj,j=1,...,k来表征。不同于直接在数据空间 X X X中聚类,作者首先使用非线性映射 f θ : X → Z f_\theta : X \rightarrow Z fθ:XZ, θ \theta θ是可学习的参数, Z Z Z是latent 空间。其中 f θ f_\theta fθ就简单的使用DNN。

DEC通过在latent 空间 Z Z Z中学习聚类中心来聚类。DEC有两个阶段

  • 参数初始化
  • 参数优化(即为聚类)
    • 迭代计算辅助目标分布以及最小化KL散度

3.1 Clustering with KL divergence

给定初始化的encoder函数 f θ f_\theta fθ和初始化聚类中心点 { μ j } j = 1 k \{\mu_j\}_{j=1}^k {μj}j=1k笔者:查阅代码得知这个地方的初始化聚类中心点是通过将原始的feature,通过KMeans聚类,从而得到的聚类中心点,注意这个必须要有,不然是无法计算属于每一个类别的概率的,而且每一次重新encode之后,都会重新使用KMeans计算聚类中心点(这个很好理解)

第一步中,使用计算样例点与聚类中心的soft assignment(笔者:其实就是概率,而且上面代码中还是会normalize的(这个其实无所谓,毕竟概率就概率呗,整体属于1嘛)

第二步中,更新 f θ f_\theta fθ并且调整聚类中心(笔者:这很自然也很通顺,因为encode的feature进行了变化了,结果自然会有很大的不同。) 那如何做到更新呢?如何做到反向传播呢?自然是本文上述提到的,使用额外的一个目标分布了。

到此处终于明白聚类中心点是如何出现的了,这篇文章几乎没有什么混淆不清的地方了。

所有的实验中,均不会考虑KMeans中K的数量预计错误,都是在完美的playground情况下进行处理

感觉非常像self-supervised

3.1.1. Soft assignment

使用学生t分布作为kernel去度量聚类中心点以及样例特征点之间的距离。具体如下
q i j = ( 1 + ∥ z i − μ j ∥ 2 / α ) − α + 1 2 ∑ j ′ ( 1 + ∥ z i − μ j ′ ∥ 2 / α ) − α + 1 2 q_{i j}=\frac{\left(1+\left\|z_{i}-\mu_{j}\right\|^{2} / \alpha\right)^{-\frac{\alpha+1}{2}}}{\sum_{j^{\prime}}\left(1+\left\|z_{i}-\mu_{j^{\prime}}\right\|^{2} / \alpha\right)^{-\frac{\alpha+1}{2}}} qij=j(1+ziμj2/α)2α+1(1+ziμj2/α)2α+1
其中:

  • z i z_i zi x i x_i xi的latent code,也就是 f θ ( x i ) f_\theta(x_i) fθ(xi)
  • μ j \mu_j μj是第 j j j个聚类中心点
  • α \alpha α是自由度,为了方便,所有代码的所有实验,均设置为1(统计学中的知识)
  • 因此 q i j q_{ij} qij以为第 i i i个样本属于第 j j j个聚类中心的概率

3.1.2. KL Divergence Minimization

笔者:我们求出了概率之后,得到了DEC初步的聚类结果,那么这时候自然需要来一个标准答案来进行对比,从而优化encoder这个神经网络,但是文章是unsupervised,因此作者提出用辅助分布。

作者的模型通过匹配上述的soft assignment与目标分布来进行训练,因此使用KL散度损失来进行优化训练

笔者:KL-divergence是非常常见的用于度量两个分布之间差异的度量法则,此处不再赘述。

一个是DEC得到的 q i q_i qi,一个是辅助分布 p i p_i pi

具体公式为:
L = K L ( P ∥ Q ) = ∑ i ∑ j p i j log ⁡ p i j q i j L=\mathrm{KL}(P \| Q)=\sum_{i} \sum_{j} p_{i j} \log \frac{p_{i j}}{q_{i j}} L=KL(PQ)=ijpijlogqijpij
筛选目标分布非常关键,基本的方法就是设置为delta 分布,将每个点更加的逼近他的最近中心点,然而由于是soft assignment(保留了从其他类别中采样出的概率)因此筛选出其他softer一点的分布目标会更合理。作者希望筛选出的目标分布有如下特性

  • 1 加强预测,也就是提升聚类纯度的
  • 2 让更多的点预测的更加confident(笔者:也就是最符合的中心点,概率会更高)
  • 3 每个中心点的分布类似

基于上述三点,因此最终的目标分布为:
p i j = q i j 2 / f j ∑ j ′ q i j ′ 2 / f j ′ p_{i j}=\frac{q_{i j}^{2} / f_{j}}{\sum_{j^{\prime}} q_{i j^{\prime}}^{2} / f_{j^{\prime}}} pij=jqij2/fjqij2/fj
其中 f j = ∑ i q i j f_j=\sum_iq_{ij} fj=iqij是频率,以为所有 x i x_i xi的属于 j j j的概率之和

笔者:由于水平问题,我无法看出这个分布的合理之处,但是我们可以这样思考,什么时候可以是的 p j p_j pj q j q_j qj是完全相同的?这个答案是很容易得到的,当所有的 k k k个类别分布的点数量完全相同且概率完全为1的时候,分布是相同的。因此这可以是一个合理的目标分布。

笔者:通过样本的概率,可以很自然地求得 q i q_i qi的分布,那么辅助分布 p i p_i pi作为我们的目标分布,自然是越合理越好。这个其实不算是assumption,因为很自然的,一个类别的数据服从某一个分布,只是要确定这个筛选的辅助分布是否合理罢了。

具体的经验主义的性质可以参考第5.1节

文中的训练策略可以算作一种形式的自训练 self-training。 使用初始化的分类器以及无标签数据。作者在实验中也观测到了,DEC通过学习高概率预测来提升初始的聚类预测,从而提升低概率预测的点归类于更合理的类别中。

笔者:3.1.3. Optimization此处不讲了,将两个分布的KL误差结果进行反向传播而已。

3.2. Parameter initialization

笔者:由于初始化的encode效果不好,这样encode的结果用于聚类,然后又大幅度影响后面的效果,因此初始化DNN的参数是非常有必要的,可以在一开始就有不错的encode结果,从而保证最终的性能。

作者初始化DEC用stacked auto encoder(SAE)来进行这边DNN的初始化。主要是SAE本身就广泛的用于聚类,能够学习到将样本区分开的特征。因此作者逐层初始化并增加一些noise(通过dropout增加)。

  • 激活函数使用ReLU
  • 文中原始的模型使用两层encoder
  • Loss使用 Least-squares loss ∥ x − y ∥ 2 2 \|x-y\|_{2}^{2} xy22

笔者:此处也说了,用 Z Z Z在KMeans上进行初始中心点的获取。

总结:这篇文章细节处还是比较多的,是个非常好的文章。

你可能感兴趣的:(深度学习,神经网络,自然语言处理,聚类,机器学习,人工智能,深度学习,python)