作者:世界第一1945_307 | 来源:互联网 | 2023-09-07 12:33
上次文章:闫17:Tensorflow入门教程(9)zhuanlan.zhihu.com本次对应代码:https:github.comSaoYanLearningTensorfl
上次文章:
闫17:Tensorflow入门教程(9) zhuanlan.zhihu.com
本次对应代码:
https://github.com/SaoYan/LearningTensorflow/blob/master/exp08_Embedding_Visualization.py github.com
官方文档参考阅读:
https://www.tensorflow.org/versions/master/programmers_guide/embedding www.tensorflow.org
https://www.tensorflow.org/versions/r1.2/get_started/embedding_viz www.tensorflow.org
同步连载于个人公众号“SaoYan”
What is embedding
简单来说,embedding就是实体对象的数值化表示。“实体对象”可以是image、word等,“数值化表示”就是一个编码向量。例如对“颜色“这种实体对象用(R,G,B)这样一个三元素向量编码。
embedding还可以理解成将离散目标投影到连续空间中的某个点上。
数值化的embedding vector本身是没有意义的,不同vector之间的相对关系才是有实际意义的。
例如:NLP中最基本的word embedding,给每一个单词一个N维编码向量(或者说将每个word投影到N维空间中),我们期望这种编码满足这样的特性:两个向量之间的”距离“越小,代表这两个单词含义越接近。我们甚至可能期望更复杂的特性,例如能够在这个N维空间中找到一个代表”性别“的超平面,使相反性别的单词合理的分布在这个超平面两侧(比如“boy”和“girl”是关于这个超平面对称的)。
embedding的用处很多,还是用word embedding做例子,如果我们找到了一种能够具有优良性质的编码,那么这组编码就可以作为理解语言的一个重要工具。例如通过判别单词相对于“性别超平面”的位置来获取“gender bias”信息。
可以类比一下高中的立体几何:当复杂的逻辑推理简化成精炼的空间向量运算的时候,立体几何的求解问题大大简化了。数值运算对于计算机来说也是一种可操作的目标了。
如果想利用embedding,前提是这个“编码”质量本身够好,或者说足够适合我们的应用需求,例如在OpenCV的推送中我们提到过在RGB空间进行直方图反投影效果远远不如HSV空间。也就是说,同样的一组颜色,在不同的编码方式下,特性和应用场合差异很大。
围绕embedding展开的两个经典研究领域至今还在贡献着热量
(1)如何构建这样的编码?比如在NLP领域经典的word embedding问题,单单是“如何编码”这个小问题,就吸引了无数学者,其中不乏Geoffrey Hinton,Yoshua Bengio这样的学术泰斗。
(2)如何度量两个embedding vector之间的相似度?有了编码,我们需要度量两个编码之间的“距离”。我们熟悉的欧氏距离在很多情境下是完全失效的,这时候,定义一种更符合需求的“距离”就是很有必要的(度量学习)
扯了这么多之后,还想多一句嘴:深度学习只是机器学习中的一员,机器学习本身有太多内涵,主页菌本人水平有限并没有深入研究过什么,但是作为入坑之人,还是要时刻保持冷静,不要“非深度学习不用”,否则会错过很多风景哒!
How to visualize embedding?
利用Tensorboard很容易将embedding进行可视化,不过既然是可视化,最高只能“可视”三维空间,所以高维向量需要被投影到三维(或二维空间)。不过不用担心细节,Tensorboard做了足够高质量的封装。
这次的代码基于教程5,只需要增加10行左右的代码就可以将embedding可视化添加进Tensorboard中。
为了代码思路足够简单,我们不去计算任何embedding vector,而是用图片数据本身作为embedding(将图片展开成向量)。实际应用中将这部分数据替换成你自己的embedding就可以啦。
可视化embedding有两个要素:
(1)被可视化的数据本身,也就是可视化空间中的每一个数据点
(2)metadata,也就给每一个数据点赋予的“标签”。metadata需要单独存放在tsv文件中。
在正式代码开始之前,需要导入一个额外的模块:
首先是被可视化的数据本身,在这里就是MNIST的测试图像。注意embedding可视化的数据需要是tf.Variable类型。
其次是将metadata存储在单独的tsv文件中。这里我们就使用MNIST测试集的label,将他们存储在tsv中。tsv文件中每一行代表一个数据的metadata。
存储完的tsv文件是这样的:
有了数据对象和metadata之后,我们需要告诉程序这么三件事
(1)我需要构建一个embedding用来可视化
(2)embedding中的数据是什么
(3)embedding中的metadata是什么
高亮部分的三行代码就是分别做了上面说的那三件事。
将可视化对象写入Tensorboard用到了tf.summary(请回顾教程5)
我们使用了两组summary,因为在训练集和测试集上的结果要分开。在将embedding加入Tensorboard的时候我们需要告诉程序要加入到哪一个summary中去。
注意高亮部分指定了加入哪个summary。
至此,大功告成!
Enjoy!
来载入Tensorboard看效果吧
进入“PROJECTOR”这个标签
在左侧选择“test”,因为我们的embedding加入的是这个summary
这时候你看到的是这样的:
然后使用metadata给数据点标记不同的颜色。在左侧选择“color map”,也就是我们存储的metadata:
现在你看到的效果变成了这样:
在左下角有这么一个面板:
这个面板是用来选择数据降维算法的。Tensorboard提供了PCA和t-SNE两种。PCA就是我们熟悉的主成分分析,是默认选择的降维算法,上面的效果图都是PCA降维得到的。值得一提的是t-SNE,这是Hinton老爷子提出来的算法,做高维数据降维可可视化简直不要太惊艳!不过缺点是有很多需要调节的参数。
使用如下参数配置:
迭代稳定之后获得了这样的效果:
各个类别的数据点基本上各自聚拢到了一起!
注:
t-SNE是带有随机性的算法,每次运行结果可能不完全一样
关于t-SNE参数调节的一些经验性的总结请看这篇博文:
How to Use t-SNE Effectively distill.pub