【转载】 t-SNE使用过程中的一些坑
原文地址:
https://bindog.github.io/blog/2018/07/31/t-sne-tips/
=============================================
0x00 背景
几年前,我写过一个关于t-SNE原理的介绍博客,在日常的工作中,涉及到数据可视化的时候一般都会想到去使用这个工具。但是使用归使用,大部分人却很少去思考为什么要用t-SNE,怎样“正确”的使用t-SNE。有的同学可能会觉得奇怪,就一个可视化分析的方法而已,怎么还涉及到了用法的“正确”与“错误”了呢?事实上,正是因为很多人对t-SNE的细节不甚了解,将其他传统的可视化方法的认知套用在了t-SNE上,犯了错误还浑然不知,进而得出了一些看似正确合理的结论。
在刚刚结束的CVPR 2018上,t-SNE的原作者Laurens亲自出来做了一个tutorial,标题是Do's and Don'ts of using t-SNE to Understand Vision Models,里面列举了很多错误的使用t-SNE的范例,这里作一个简短的笔记分享,重温一下这个经典的方法,同时也加深对一些细节问题的理解。
0x01 基本原理
t-SNE本质上是基于流行学习(manifold learning)的降维算法,不同于传统的PCA和MMD等方法,t-SNE在高维用normalized Gaussian kernel对数据点对进行相似性建模。相应的,在低维用t分布对数据点对进行相似性(直观上的距离)建模,然后用KL距离来拉近高维和低维空间中的距离分布。这一块就不具体展开了,想深入了解的话,请回顾之前的文章从SNE到t-SNE再到LargeVis
如果想对t-SNE的算法原理有更深入的认识,还是建议大家认真阅读一版t-SNE的实现的代码,很多模糊不清的地方看了代码之后自然就很明了,我推荐这个Javascript版本的代码,逻辑结构非常清晰,我这里也列出一个算法流程图,辅助理解。
0x02 错误案例
下面我们就具体了解下t-SNE使用时有哪些坑,以及如何去避免犯这些错误。
可以用t-SNE来提出假设 不要用t-SNE得出结论
讲到这块的时候,Laurens说他参加顶会的时候喜欢四处逛逛,看到很多学术海报上数据可视化的部分用的正是t-SNE,虽然这个意味着又多了一个引用(偷笑),但是很遗憾,有些论文的用法是错误的,是他所不希望看到的。

比如他举了这样的一个例子,应该是NLP相关的论文,里面用t-SNE可视化了一些embedding出来,可以看到有一定类似语义迁移的规律,因此证明自己的方法是work的。但是很遗憾,这样做是错误的,因为如果把所有embedding同时乘以一个很大的数值,然后再用t-SNE做可视化,可以得到一个非常类似图。

Laurens强调,可以通过t-SNE的可视化图提出一些假设,但是不要用t-SNE来得出一些结论,想要验证你的想法,最好用一些其他的办法。
t-SNE中集群之间的距离并不表示相似度
这一块可以通过那个经典的MNIST可视化出来的效果图进行说明,如果所示:
图(已丢失)

图中0和1的集群距离比较近,而0和7的集群距离较远,这说明0和1的相似度要更高吗?显然不是,事实上如果你在同一个数据上运行t-SNE算法多次,很有可能得到多个不同“形态”的集群,可能有的时候0和1集群比较近,可能0和8集群比较近。因此,考虑t-SNE可视化结果中不同集群之间的距离是没有意义的,因为对t分布来说,超出一定距离范围以后,其相似度都是很小的。也就是说,只要不在一个集群范围内,其相似度都是一个很小的值,我们所看到的集群之间的呈现出来的距离并不能说明什么,这是由t-SNE的内在所决定的。
t-SNE不能用于寻找离群点outlier
这一点同样要回到原来的论文中去,t-SNE是在SNE的基础上改进而来的,其中一个改进就是把SNE改成了对称的形式,如下所示:

原来的条件概率建模和KL距离都是非对称的,而在t-SNE中加了一个对称项,相当于在某种程度上把outlier拉进了某个集群。为什么呢?我们考虑一个离群点和一个集群的情况,只要perplexity设置的合理,那么在选择近邻时,集群内的点显然不会选择离群点作为自己的邻居,这在非对称的条件下是没什么问题的。而在对称的条件下,我们还要额外考虑离群点选择近邻的情况,由于它自身是离群点,那么它只能选择离它最近的集群中的点作为近邻。加入了这一项之后,我们相当于无形之中拉近了集群和离群点之间的距离,所得到的结果是有偏差的。所以t-SNE不能用来寻找离群点。
别忘了scale(perplexity)的作用
大部分人在使用t-SNE时,一般都直接使用默认参数图个方便(一般perplexity的默认值是30),如果忽视了perplexity带来的影响,有的时候遇到t-SNE可视化效果不好时,根本就不知道哪里出了问题,优化起来也就无从下手了。
那么perplexity到底是啥呢?我们可以回顾t-SNE的数学表达式,主要是和sigma这一项相关
perplexity表示了近邻的数量,例如设perplexity为2,那么就很有可能得到很多两个一对的小集群。
t-SNE是在优化一个non-convex目标函数,只是局部最小
有的时候会出现同一集群被分为两半的情况,如下图所示
图(已丢失)

正如刚才所说的,t-SNE更关心的是学习维持局部结构,群间的距离并不能说明什么,而且每次跑t-SNE的结果并不完全一致。所以解决这个问题,我们只需要跑多次找出效果最好的就可以了。引起这个问题的本质原因是,t-SNE是在优化一个非凸的目标函数,我们每次得到的只不过是一个局部最小。
低维度量空间不能capture非度量的相似性,有些高维结构(距离 相似性)特征在低维是无法反映出来的
这部分Laurens列举了一个他经常用的例子,也就是下图中的几个雕塑:
图(已丢失)

最左侧的是一个半人半马形态的雕塑,背上骑着一个小孩,我们可以说它和右侧上方的骑兵雕塑相似(都是马上骑着一个人),也可以说它和右下方的人雕塑相似(可能是人马的上半身和右下方的比较像),但是我们不能说右上和右下的雕塑相似。
这个想要表达的意思是,t-SNE终究只是一个把高维空间数据映射到低维的可视化工具,它不能表征那些非metric的相似性。有些仅在高维空间中存在的相似性,在低维空间是没有办法表达出来的。
t-SNE is a valuable tool in generating hypotheses and understanding, but does not produce conclusive evidence
0x03 其他资源
这个网站不仅做了t-SNE可视化的例子,还有CNN可解释性的例子,可视化效果做的非常棒,强烈建议大家去尝试一下
================================
【转载】 t-SNE使用过程中的一些坑的更多相关文章
- 爬取CVPR 2018过程中遇到的坑
爬取 CVPR 2018 过程中遇到的坑 使用语言及模块 语言: Python 3.6.6 模块: re requests lxml bs4 过程 一开始都挺顺利的,先获取到所有文章的链接再逐个爬取获 ...
- VS2017 + EF + MySQL 我使用过程中遇到的坑
原文:VS2017 + EF + MySQL 我使用过程中遇到的坑 写在前面: 第一次使用MySQL连接VS的时候本着最新版的应该就是最好的,在MySQL官网下载了最新版的MySQL没有并且安装完成之 ...
- MySql数据库GROUP BY使用过程中的那些坑
MySql数据库GROUP BY使用过程中的那些坑 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 特别注意: group by 有一个原则,就是 select 后面的所有 ...
- [转载] linux 程序运行过程中替换文件
今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp te ...
- [.NET跨平台]Jeuxs独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...
- [.NET跨平台]Jexus独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...
- HUE安装过程中的一些坑
1. gcc: error: krb5-config:: No such file or directory 执行安装krb5-devel yum provides krb5-config 得到提示: ...
- 学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑
<Node.js开发指南>项目地址https://github.com/BYVoid/microblog好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express ...
- 全屏使用swiper.js过程中遇到的坑
概述 swiper.js确实是一个很好用的插件,下面记录下我在全屏使用过程中遇到的一些坑和解决办法,供以后开发时参考,相信对其他人也有用. 通用方案 一般来说,swiper需要放在body的下一层,虽 ...
- 【Angular JS】网站使用社会化评论插件,以及过程中碰到的坑
目前正在开发自己的网站,技术上使用Angular JS + Express JS + Mongo DB.由于网站会有文章发布,因此需要有评论功能.评论功能也可以自己开发,但由于现在社会化评论插件很多, ...
随机推荐
- OpenTelemetry 实践指南:历史、架构与基本概念
背景 之前陆续写过一些和 OpenTelemetry 相关的文章: 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry 实战:如何编写一个 OpenTelemetry Ext ...
- 短链服务接口慢优化 redis应用
短链服务接口慢优化 redis应用 短链接服务:1.长链接 查询 短链接(长链接如果存在,直接返回短链接,如果长链接不存在,则需要生成短链接),比如:在获取短信之前,或者管理后台编辑短信内容之前,需要 ...
- 记录vue和js操作——尽管很快实现了功能,可总感觉到不爽
需求产生的原因是:后端有一些数据是从旧平台直接迁移过来的,新平台需要根据迁移过来的数据,自动生产新的数据格式. 操作符有如下几种,分项.支路和数字配合操作符可以自定义组合,例如 [0000000000 ...
- openEuler 20.04 TLS3 上的 Python3.11.9 源码一键构建安装
#! /bin/bash # filename: python-instaler.sh SOURCE_PATH=/usr/local/source # 下载源码包 mkdir -p $SOURCE_P ...
- 浮点数格式:FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别
浮点数格式 (参考1,参考2) 浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位).exponent(指数位)和fraction(小数位).不同的浮点数格式有不同的位数分配给这三个部 ...
- post基础错误注入
Burpsuite抓取HTTP请求 Burpsuite是一款Web安全测试的利器,集成了几乎Web安全测试中所有需要用到的功能. 运行前提: 需要安装Java https://www.java.com ...
- MyBatis插件:通用mapper(tk.mapper)
简单认识通用mapper 了解mapper 作用:就是为了帮助我们自动的生成sql语句 通用mapper是MyBatis的一个插件,是pageHelper的同一个作者进行开发的 作者gitee地址:h ...
- LVGL一键打包图片工具,全部图片打包成一个bin文件,支持nor flash XIP模式下直接访问数据显示
最近做工程项目,需要用到LVGL,但是搜了很长时间没有看到合适的图片打包工具,大多都是生成数组或者单个的bin文件,这样烧录到nor flash很麻烦 后来看到一篇博客,博主的想法与我类似,不过他后面 ...
- Spring的全局(统一)异常处理
异常处理的三种方式 使用 @ExceptionHandler 注解 实现 HandlerExceptionResolver 接口(SpringMVC) 使用 @RestControllerAdvice ...
- Solo 开发者周刊 (第4期):什么样的新科技,能提高生活效率?
这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 AI生 ...