首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tensorflow-10

What is embedding

参考阅读:

https://www.tensorflow.org/versions/master/programmers_guide/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做了足够高质量的封装。

这次的代码基于Tensorflow--5,只需要增加10行左右的代码就可以将embedding可视化添加进Tensorboard中。

00

overview

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

可视化embedding有两个要素:

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

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

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

01

step 1:准备数据

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

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

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

02

step 2:构造embedding

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

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

(2)embedding中的数据是什么

(3)embedding中的metadata是什么

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

03

step 3:写入Tensorboard

将可视化对象写入Tensorboard用到了tf.summary(请回顾Tensorflow--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参数调节的一些经验性的总结请看这篇博文:

https://distill.pub/2016/misread-tsne/

/END

到此为止,主页菌想分享的Tensorflow相关内容就全部结束啦~~希望能在各位成为TFBoys的路上帮到一点忙~~

Tensorflow推送虽然告一段落,但是后面还是可以继续分享一些TF撸出来的小项目的~~读者们如果有什么好玩的代码,欢迎来交流

下面主页菌打算开启PyTorch的推送啦!作为可能是唯一一个有希望和Tensorflow正面杠的框架,PyTorch也早已经圈了一大波粉。而且,多掌握几个框架,实际中就能更灵活的各取所需啦~

准备和PyTorch说“你好”吧!

https://saoyan.github.io/

We can do all things!

Simon Fraser University

Burnaby, Metro Vancouver

BC, Canada

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180408G0V28400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券