Tensorflow入門教程(10)

上次文章:

閆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中。

  • overview

為了代碼思路足夠簡單,我們不去計算任何embedding vector,而是用圖片數據本身作為embedding(將圖片展開成向量)。實際應用中將這部分數據替換成你自己的embedding就可以啦。

可視化embedding有兩個要素:

(1)被可視化的數據本身,也就是可視化空間中的每一個數據點

(2)metadata,也就給每一個數據點賦予的「標籤」。metadata需要單獨存放在tsv文件中。

在正式代碼開始之前,需要導入一個額外的模塊:

  • step 1:準備數據

首先是被可視化的數據本身,在這裡就是MNIST的測試圖像。注意embedding可視化的數據需要是tf.Variable類型

其次是將metadata存儲在單獨的tsv文件中。這裡我們就使用MNIST測試集的label,將他們存儲在tsv中。tsv文件中每一行代表一個數據的metadata

存儲完的tsv文件是這樣的:

  • step 2:構造embedding

有了數據對象和metadata之後,我們需要告訴程序這麼三件事

(1)我需要構建一個embedding用來可視化

(2)embedding中的數據是什麼

(3)embedding中的metadata是什麼

高亮部分的三行代碼就是分別做了上面說的那三件事。

  • step 3:寫入Tensorboard

將可視化對象寫入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圖標
推薦閱讀:

TensorFlow初步(5)
Install TensorFlow with Anaconda
學習筆記TF041:分散式並行
Kubeflow 安利:在 Kubernetes 上進行機器學習
如何評價陳天奇的模塊化深度學習系統NNVM?

TAG:TensorFlow | 深度學習DeepLearning | 機器學習 |