Tensorflow入门教程(10)

上次文章:

闫17:Tensorflow入门教程(9)zhuanlan.zhihu.com《Tensorflow入门教程(10)》

本次对应代码:

https://github.com/SaoYan/LearningTensorflow/blob/master/exp08_Embedding_Visualization.pygithub.com

官方文档参考阅读:

https://www.tensorflow.org/versions/master/programmers_guide/embeddingwww.tensorflow.org
https://www.tensorflow.org/versions/r1.2/get_started/embedding_vizwww.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中。

  • overview

为了代码思路足够简单,我们不去计算任何embedding vector,而是用图片数据本身作为embedding(将图片展开成向量)。实际应用中将这部分数据替换成你自己的embedding就可以啦。

可视化embedding有两个要素:

(1)被可视化的数据本身,也就是可视化空间中的每一个数据点

(2)metadata,也就给每一个数据点赋予的“标签”。metadata需要单独存放在tsv文件中。

在正式代码开始之前,需要导入一个额外的模块:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

  • step 1:准备数据

首先是被可视化的数据本身,在这里就是MNIST的测试图像。注意embedding可视化的数据需要是tf.Variable类型

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

其次是将metadata存储在单独的tsv文件中。这里我们就使用MNIST测试集的label,将他们存储在tsv中。tsv文件中每一行代表一个数据的metadata

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

存储完的tsv文件是这样的:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

  • step 2:构造embedding

有了数据对象和metadata之后,我们需要告诉程序这么三件事

(1)我需要构建一个embedding用来可视化

(2)embedding中的数据是什么

(3)embedding中的metadata是什么

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

高亮部分的三行代码就是分别做了上面说的那三件事。

  • step 3:写入Tensorboard

将可视化对象写入Tensorboard用到了tf.summary(请回顾教程5

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

我们使用了两组summary,因为在训练集和测试集上的结果要分开。在将embedding加入Tensorboard的时候我们需要告诉程序要加入到哪一个summary中去

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

注意高亮部分指定了加入哪个summary。

至此,大功告成!

Enjoy!

来载入Tensorboard看效果吧

进入“PROJECTOR”这个标签

在左侧选择“test”,因为我们的embedding加入的是这个summary

《Tensorflow入门教程(10)》

这时候你看到的是这样的:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

然后使用metadata给数据点标记不同的颜色。在左侧选择“color map”,也就是我们存储的metadata:

《Tensorflow入门教程(10)》

现在你看到的效果变成了这样:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

在左下角有这么一个面板:

《Tensorflow入门教程(10)》

这个面板是用来选择数据降维算法的。Tensorboard提供了PCA和t-SNE两种。PCA就是我们熟悉的主成分分析,是默认选择的降维算法,上面的效果图都是PCA降维得到的。值得一提的是t-SNE,这是Hinton老爷子提出来的算法,做高维数据降维可可视化简直不要太惊艳!不过缺点是有很多需要调节的参数。

使用如下参数配置:

《Tensorflow入门教程(10)》

迭代稳定之后获得了这样的效果:

《Tensorflow入门教程(10)》
《Tensorflow入门教程(10)》

各个类别的数据点基本上各自聚拢到了一起!

注:

t-SNE是带有随机性的算法,每次运行结果可能不完全一样

关于t-SNE参数调节的一些经验性的总结请看这篇博文:

How to Use t-SNE Effectivelydistill.pub《Tensorflow入门教程(10)》

    原文作者:Seventeen
    原文地址: https://zhuanlan.zhihu.com/p/35472283
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞