Manifold Learning
t-SNE的“N E”就是Neighbor Embedding的縮寫。現在要做的事情就是之前講過的降維,只不過是非線性的降維。
我們知道數據點可能是高維空間里的一個流形曲面,也可以說,數據點的分布其實是在一個低維的空間里面,只是被扭曲塞到了一個高維空間里。流形曲面常舉的例子是地球,地球表面是一個流形曲面,是一個二維的平面,但是被塞到了一個三維的空間里。
在流形曲面里,只有距離很近的點,歐式距離才成立,距離遠的時候歐式幾何不一定成立。也就是如上圖左邊所示,在S形的這個空間里面取某一個點(黑點3),比較黑點3和黑點1,黑點3和黑點2的距離或者是合理的,黑點3和黑點1更像。如果距離比較遠的點,要比較黑點3和黑點4,黑點3和黑點5的相似程度時,在高維空間中直接算歐式距離就不合理。如果根據歐式距離,那黑點3和黑點4更近,但實際上有可能黑點3和黑點5更近。所以流形學習要做的事情是把S形的曲面展開,把塞在高維空間里的低維空間攤平,攤平后可以在降維空間上用歐式距離計算點和點之間的距離。這對接下來要做的聚類或監督學習都是有幫助的。
LLE
類似的方法有很多,其中一個叫做Locally Linear Embedding(局部線性嵌入)。
在原來空間里點的分布如上圖左邊所示,有某個點\(x^i\),先選出\(x^i\)的鄰近點叫做\(x^j\),用\(w_{ij}\)表示\(x^i,x^j\)之間的關系。
\(w_{ij}\)是怎么找出來的?
假設每個\(x^i\)都可以由它的鄰近點做線性組合而成,那\(w_{ij}\)就是線性組合的權重。現在找一組\(w_{ij}\),讓\(x^i\)的所有鄰近點\(x^j\)的線性組合\(\large \sum\limits_j w_{ij}x^j\)和\(x^i\)越接近越好,損失函數就是summation over所有的\(x^i\),使得2-norm越小越好。
接下來就要做降維,把原來所有的\(x^i,x^j\)轉成\(z^i,z^j\) ,這里的原則是從\(x^i,x^j\)轉成\(z^i,z^j\) ,中間的\(w_{ij}\)是不變的。
所謂的“在天”就是\(x^i,x^j\),在原來的空間上面,“比翼鳥”就是\(w_{ij}\) ,“在地”就是把\(x^,x^j\)轉換到另外一個空間,就是\(z^i,z^j\),“連理枝”等於“比翼鳥”,還是\(w_{ij}\)
LLE做的的事情是這樣的。首先在原來的空間找到\(w_{ij}\)后就固定住不變,接下來給每個\(x^i,x^j\)找另一個向量,因為要做降維,那新找的向量要比原來的維度小,比如原來100維降到10維2維之類的。\(z^i,z^j\)就是另外的向量,\(z^j\)使用同樣的組合權重(\(w_{ij}\))去接近\(z^i\)。為找到\(z_i,z_j\),相當於\(w_{ij}\)已知,最小化\(\large ||z^i-\sum\limits_j w_{ij}z^j ||\),然后summation over所有的數據點\(z^i\)。
LLE沒有一個明確的函數告訴你說怎么做降維,不像我們在做auto-encoder的時候,學習一個encoder的網絡,input一個新的數據點,就可以得到降維的結果。LLE不會讓你找到一個明確的函數,告訴我們說怎么從\(x\)變到\(z\),\(z\)就是另外憑空找出來的。
如果用LLE或者其它類似的方法會有一個好處,就算不知道原來的\(x^i,x^j\) ,只知道\(w_{ij}\) ,即不知道\(x^i,x^j\)用什么向量來描述,只知道它們之間的關系,也可用LLE這種方法。
用LLE需要好好調整鄰近點的個數K,個數要合適才會有好的結果。原始論文里調了不同的K,K太小和K太大得到的結果都不太好。
為什么K太大結果不好呢?
只有在距離很近的時候,才可以近似用歐式距離計算,所以點和點之間關系,在轉換前后才可以被保持住。當K很大的時候,就會包括一些距離比較遠的點,和這些點的關系在轉換后就沒辦法保持住,有些關系太弱了。
拉普拉斯特征映射
另外一個方法是laplacian eigenmap。 之前講半監督學習的時候,講過平滑度假設。想比較點和點之間的點,只計算歐式距離是不夠的,要看它們在高維區域之間的距離,如果兩個點之間有高維的連接,那它們才是真正的接近。這件事情可以用一個圖來描述,也就是說你把你的數據點構造成一個圖,算數據點兩兩之間的相似度,如果相似度超過一個閾值,就把它們連接起來。建一個圖的方法有很多,總之就是把近的點連起來變成一個圖。
如上圖右邊所示,把點變成圖之后,考慮這個平滑距離(藍色線條),就可以用圖上點的連接來近似(紅色折線)。
之前講半監督學習的時候,我們這樣說過,如果\(x^1\)跟\(x^2\)在高維區域上面是相近的,那么它們的label \(\hat {y}^1\)和\(\hat {y}^2\)很有可能也是一樣的。雖然半監督學習的時候,我們有一項是考慮有label數據的項(\(\large \sum\limits_{x^r} C(y^r,\hat{y}^r)\))。另外一項是unlabel數據項\(\large \lambda S\),作用是考慮現在得到的label是不是平滑的,它的作用很像一個正則化項。 \(S\)為\(y^i\)跟\(y^j\)的距離乘上\(w_{i,j}\),如果兩個數據點\(x^i\)和\(x^j\)在圖上是相連的,那么\(w_{ij}\)就是它們的相似程度,如果沒有相連,\(w_{ij}=0\)。如果\(w_{ij}\)是一個很大的值,那希望\(y^i,y^j\)越接近越好,如果\(w_{ij}=0\),\(y^i,y^j\)什么值都可以。\(S\)越小越平滑,用來評估你現在得到的label有多平滑,\(S\)可以寫成\(\bf{y}\)的向量乘以\(L\)再乘以\(\bf{y}\),這個\(L\)就是圖拉普拉斯。
同樣的道理可以被用在完全非監督的問題上。
如果\(x^1\)和\(x^2\)在高維區域是相近的,那我們自然希望\(z^1\)和\(z^2\)也是相近的。
今天把\(x^1,x^2\)變成\(z^1,z^2\)后,如果\(x^i,x^j\)很像(\(w_{i,j}\) 很大),那\(z^i,z^j\)的距離就應該很近。
所以我們可以用最小化上圖的\(S\)來尋找\(z^i,z^j\)嗎?
這里面會有問題,如果只是最小化\(S\),那\(z^i,z^j\)都等於0向量不就可以了,這樣\(s\)就等於0,最小了。所以光有最小化\(S\)是不夠的。
那半監督學習為什么只要最小化\(S\)?
在半監督學習中,還有監督學習的那一項,如果把所以的\(y\)(label)都設成一樣,會導致監督學習那一項的損失會很大,我們需要平衡監督學習那一項和平滑度那一項,所以不會選擇所有的\(y\)都是一樣。
這邊少了監督學習的東西,所以可以選擇所有的\(z\)都一樣。
所以需要給\(z\)一些約束,如果降維后的\(z\)是M維的空間,那你找出來的N個點的空間維度等於M,即\(Span\{z^1,z^2,...,z^N\}=R^M\)。解這個\(z\)會發現和圖拉普拉斯\(L\)是有關系的,其實就是\(L\)的比較小的特征值對應的特征向量。所以它叫做拉普拉斯特征映射,因為找得是拉普拉斯矩陣的特征向量。
找出\(z\)后再去做k-means聚類,就是光譜聚類。
t-SNE
t-SNE是t-distributed stochastic neighbor embedding(t分布隨機鄰居嵌入)的縮寫。
前面的方法有個最大的問題是只假設相近的點要接近的,沒有假設不想近的不接近。
比如在MNIST上使用LLE,你會遇到這種情形。如上圖左下方所示,它確實會把同一個類的點都聚集在一起,但同時也把不同類的點疊在了一起,所以這些點都擠在一起,還是沒有辦法分開。
另外一個例子在COIL-20(一個圖像庫,比如一個對象小汽車做旋轉不同角度的圖)上使用LLE,如上圖右下方所示,同樣顏色代表同一個對象。你會發現它找到一些圈圈,這些圈圈代表同一個對象在旋轉后降維得到的結果。同樣的,不同的對象都擠在了一起。
t-SNE是怎么做的呢?
t-SNE也是做降維,把\(x\)降維到\(z\)。在原來\(x\)的空間上,我們會計算所有配對點\(x^i,x^j\)之間的相似度,寫成\(S(x^i,x^j)\),接下來會做一個標准化。如上圖計算\(P(x^j|x^i)\),分子的地方就是\(x^i,x^j\)之間的相似度,分母就是summation over \(x^i\)和所有其他點的相似度。
假設我們已經找到了低維度的向量\(z^i,z^j\),那也可以計算\(z^i,z^j\)的相似度,寫成\(S'(z^i,z^j)\),同樣的做一個標准化\(Q(z^i|z^j)\)。
做標准化是有必要的,因為你不知道高維空間中計算出來的距離\(S(x^i,x^j)\)和\(S'(z^i,z^j)\)的尺度是不是一樣的。標准化后就可以都變成概率,值就都介於0和1之間。
到現在我們還不知道\(z^i,z^j\)的值到底是多少,這是我們要去找的。我們希望找一組\(z^i,z^j\)讓\(P(x^j|x^i)\)的分布和\(Q(z^i|z^j)\)的分布越接近越好。我們知道KL散度可以衡量兩個分布的相似度。那么我們就要最小化(\(x^i\)對其他點的分布)與(\(z^i\)對其他點的分布)之間的KL散度。如上圖右下方所示。
這個最小化怎么做?
也是使用梯度下降,假設你知道\(S(x^i,x^j),S'(z^i,z^j)\)的式子長什么樣子,代進公式里,對\(z\)做微分就可以了。
t-SNE有個問題是會計算所有點的相似度,所以計算量會有點大。所以常做的做法會先做降維,不從原來的高維空間里做t-SNE,會先做PCA降到低維空間(比如50維),然后再用t-SNE降維到2維。
給t-SNE一個新的數據,它就沒辦法處理,只能處理訓練集\(x\),幫你找到\(z\),找完訓練集的\(z\)之后,再給它一個新的\(x\),你就要重新做一遍t-SNE,很麻煩。所以t-SNE常常用來做可視化。
t-SNE一個非常有趣的地方是,它的這個相似度的選擇非常神妙。在原來的空間上,\(x\)相似度的選擇是RDF的函數,計算\(x^i,x^j\)的歐式距離,然后取負號,再取exp。之前也有說過,在圖上計算相似度的話,用這種方法會比較好,因為它可以確保只有非常近的點才有值,exp變化很快,只要距離大,相似度就會變得很小。
在t-SNE之前有個方法叫做SNE,在新空間上也是用原空間的相似度計算方式,而t-SNE在新空間會選擇一個不一樣的相似度計算方式,在降維后計算方式是t-分布的其中一種(\(\large \frac{1}{1+||z^i-z^j||_2}\))。
為什么要使用t-分布樣子的計算方式?
一個直覺的理由如上圖,假設橫軸代表歐式距離,橙色線是\(S\)相似度(RBF函數),藍色線是\(S'\)相似度(t分布)。可以發現如果歐式距離很小,那么RBF函數和t分布值一樣時,兩個空間的歐式距離的差距就會很小,而歐式距離很大,RBF函數和t分布值一樣時的,兩個空間的歐式距離的差距就會很大。也就是說,原來高維空間里,如果距離很近,那做完轉換后還是很近,如果原來距離很遠,那轉換后會拉得很遠。
你會發現,t-SNE處理后,畫出來的圖會如上圖一樣。會把數據點聚集成一群一群的,因為原來數據點之間只要有一些差距,做完t-SNE只有,會讓這種差距更明顯。上圖是t-SNE在MNIST上的結果,但是先對像素點做了PCA,最后效果會好一點。
上圖不同顏色代表不同數字,會發現不同的數字變成一群一群的。
上圖右邊是t-SNE在COIL-20上的結果,每一個圈圈代表了同一個對象,是旋轉了一周之后的結果。你會發現有一些扭曲的圈圈,這是因為有一些東西比如杯子,轉圈圈后的圖像樣子是一樣的。