Machine Learning ——降维方法:t-SNE

本篇博客是本人初学t-SNE算法的总结,可能有些理解不够完善,希望不足之处大家可以指正。

参考文献:

Geoffrey Hinton P K. Visualizing Data using t-SNE Laurens van der Maaten MICC-IKAT[J]. 2014.

一、介绍

    t-SNE算法是学习机器学习比较好入门的一种算法,t-SNE是一种降维算法,降维在机器学习中是比较常见的问题,降维就是将高维空间的数据在低维空间进行展示,我们在实验中通常使用的数据都是高维数据,例如,与乳腺癌相关的细胞核由大约30个变量描述,而用于表示图像的像素强度向量或用于表示文档的字数向量通常有数千个维度,我们在处理这些数据时就需要用到降维技术。降维的目的是在低维图中尽可能保留高维数据的重要结构。降维分为线性降维和非线性降维两个部分,线性降维的代表方法有PCA和MDS等,线性降维主要关注低维空间中的点的不相似性,使低维空间中的不相似的点之间的距离较大;t-SNE是一种非线性的降维方法,非线性降维算法通常更重视保持相似性,使低维空间中的相似的点之间的距离较小。

二、SNE(Stochastic Neighbor Embedding)

    SNE也是一种降维的算法,t-SNE就是对SNE算法的一种改进,我们在这里先对SNE算法进行介绍。SNE是通过构建一个高维对象之间的概率分布Pi|j,使得相似的对象有更高的概率被选择,而不相似的对象有较低的概率被选择;在低维空间里再构造这些点的概率分布Qi|j,使得Pi|j与Qi|j分布之间尽可能相似。SNE是先将欧几里得距离转换为条件概率来表达点与点之间的相似度SNE中我们不论是低维空间还是高维空间,我们计算的相似度均为概率相似(我们将高维空间中的点记为X={x1,x2,...,xi,xj,...,xn},低维空间中的点记为Y={y1,y2,...,yi,yj,...,yn})

    在高维空间中,点xi与xj的相似度记为Pi|j ,对于相近的点Pij的值相对会大一些,Pij遵循高斯分布,通过数学公式进行展示为:

              

    σi 是以Xi为中心分布的高斯标准差,它的取值我们稍后再讨论。我们将Pi|i设置为0,因为我们只关注不同点之间的相似性。

    在低维空间中,点yi与yj的相似度记为Qi|j,为了方便计算,我们在低维空间将σi 设置为1/√2(将σ设置成不同的值,只是对最后的图的重新的调节),所以在低维空间中的点的相似度的数学表达式是:

                      

    同样,我们也将Qi|i设置为0。

    如果低维图中的点yi和yj可以正确的对高维空间中的点xi与xj进行建模,那么Pi|j与Qi|j应该是相等的。SNE主要的目的就是最小化Pi|j与Qi|j之间的误差。我们使用KL散度(Kullback-Leibler divergences)来表示一个点的Pi|j与Qi|j之间的误差,SNE通过梯度下降方式最小化所有点的KL散度的和。Cost函数定义如下:

                

    因为KL散度是非对称的,所以对于在低维空间的点的距离的错误会有不同的惩罚权重。例如在低维空间中,用距离较近的点去代表高维空间中距离较远的两个点,正确的情况是我们会得到一个很大的权重然后进行提督迭代,但是实际上我们会得到一个很小的权重,这是有问题的。所以我们可以说,SNE比较关注数据的局部结构。

    上面是对于SNE算法整体流程的介绍,下面来推导一下SNE算法的实现过程。

    SNE中对于不同的点xi有不同的σi,不存在一个最优化的σi适用于数据集中的所有的点。SNE使用困惑度(Perplexity)通过二分搜索法查找合适的σi,困惑度的定义为:

                                                    

    其中H(Pi)是Pi的香农熵,定义为:

                                                    

    困惑度可以解释成一个点附近的近邻点的个数,通常是在程序中手动给定的一个值,通常设置在5-50之间,困惑度设置完成后,就可以通过二分查找法对σ进行查找。

    我们前面提到过,SNE使用梯度下降的方式最小化Cost函数,梯度公式如下:

                    

    这个梯度公式,可以用分子间的作用力进行解释,(yi-yj)可以解释称作用力的方向,(pj|i - qj|i + pi|j - qi|j)可以解释成作用力的大小。

    在初始化中,可以用较小的σ下的高斯分布来进行初始化。为了加速优化过程和避免陷入局部最优解,梯度中需要使用一个相对较大的动量(momentum)。即参数更新中除了当前的梯度,还要引入之前的梯度累加的指数衰减项,如下:

            

    这里的Y(t)表示迭代t次的解,η表示学习速率,α(t)表示迭代t次的动量。

    此外,在初始优化的阶段,每次迭代中可以引入一些高斯噪声,之后像模拟退火一样逐渐减小该噪声,可以用来避免陷入局部最优解。因此,SNE在选择高斯噪声,以及学习速率,什么时候开始衰减,动量选择等等超参数上,需要跑多次优化才可以。

三、t-SNE(t-Distributed Stochastic Neighbor Embedding)

    SNE虽然提供了很好的可视化算法,但是很难优化并且会遇到拥挤问题。所以提出t-SNE算法,t-SNE算法在SNE算法上改进了两个问题:(1)使用联合概率代替条件概率进行计算 , (2)在低维空间使用t分布算法

3.1 Symmetric SNE

    优化KL散度的一种替换思路是,使用联合概率代替条件概率,即P、Q分别代表的是联合概率,而不再是条件概率。

                            

    同样,我们设置pii = 0 和 qii = 0,我们将这种SNE叫做对称SNE,因为这样的SNE中对于任意的i和j,pij = pji,qij = qji。在对称SNE中低维空间的联合概率表示为:

                    

    在高维空间中表示为:

                   

    这种表达方式会引入异常值问题,比如xi是异常值,那么xixj2会很大,对应的所有的j, pij都会很小(之前是仅在xi下很小),导致低维映射下的yi对cost影响很小。为了解决这个问题,我们将联合概率分布定义修正为: pij=pij+pji2, 这保证了jpij>12n, 使得每个点对于cost都会有一定的贡献。对称SNE的最大优点是梯度计算变得简单了,如下:
yi

                    

3.2 t-SNE

    t-SNE算法是在高维空间使用高斯分布,在低维空间使用t分布。t分布满足我们对t-SNE的要求,即在同一簇内点之间的距离相近,在不同簇内点之间的距离远。在高维空间t-SNE计算联合概率的公式和对称SNE的公式是相同的,在低维空间使用t分布计算概率的公式为:

                            

    t分布实际是多个高斯分布的叠加,所以计算上不再是指数,公式可以简化为:

 

    t-SNE算法的整体流程如下:


四、实验结果

4.1 MINIST数据集


4.2 COIL-20数据集


五、个人总结

    t-SNE算法我是通过python实现的,我使用多个数据集进行实验,发现t-SNE算法在对于图像数据的分类处理上较好,但是在文本的处理上并没有很好的效果。Multiple Map t-SNE是针对  t-SNE 在文本处理上的问题进行改进的算法,我会在之后进行更新MMt-SNE的内容。 







猜你喜欢

转载自blog.csdn.net/zzzzhy/article/details/80772833