结合VAE去做聚类的开创工作,目前引用接近800,是非常有意义的工作
虽然网上大家的讲解也基本上能够概括他的核心思想了,就是在VAE的基础上,通过辅助分布来进行一个encoding能力的学习,最后通过latent code来进行聚类。
但是对于其中的具体细节还是语焉不详,虽然这篇文章已经看了有两遍了,其他的博客也看了不少,但还是自己再梳理一些细节。
作者从CV中获取的灵感:学习更好的特征能够在benchmark上获得更好的结果,但需要supervised的情景。作者希望用于unsupervised的设定下
因此:
然而优化DEC是困难的,主要原因是特征学习没法用label,因此作者提出使用当前的soft cluster assignment衍生的目标分布,用于迭代优化聚类。(笔者:就是用当前的encoding结果,得出聚类结果,再通过聚类产生目标分布作为优化的目标,从而优化encoder,以优化最终的聚类结果)
这部分作者介绍了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为中心点的数量。
将 n n n个 { x i ∈ X } i = 1 n \{x_i\in X\}_{i=1}^n {xi∈X}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θ:X→Z, θ \theta θ是可学习的参数, Z Z Z是latent 空间。其中 f θ f_\theta fθ就简单的使用DNN。
DEC通过在latent 空间 Z Z Z中学习聚类中心来聚类。DEC有两个阶段
给定初始化的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
使用学生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−μj′∥2/α)−2α+1(1+∥zi−μj∥2/α)−2α+1
其中:
笔者:我们求出了概率之后,得到了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(P∥Q)=i∑j∑pijlogqijpij
筛选目标分布非常关键,基本的方法就是设置为delta 分布,将每个点更加的逼近他的最近中心点,然而由于是soft assignment(保留了从其他类别中采样出的概率)因此筛选出其他softer一点的分布目标会更合理。作者希望筛选出的目标分布有如下特性
基于上述三点,因此最终的目标分布为:
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=∑j′qij′2/fj′qij2/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误差结果进行反向传播而已。
笔者:由于初始化的encode效果不好,这样encode的结果用于聚类,然后又大幅度影响后面的效果,因此初始化DNN的参数是非常有必要的,可以在一开始就有不错的encode结果,从而保证最终的性能。
作者初始化DEC用stacked auto encoder(SAE)来进行这边DNN的初始化。主要是SAE本身就广泛的用于聚类,能够学习到将样本区分开的特征。因此作者逐层初始化并增加一些noise(通过dropout增加)。
笔者:此处也说了,用 Z Z Z在KMeans上进行初始中心点的获取。
总结:这篇文章细节处还是比较多的,是个非常好的文章。