t-SNE 演算法
1 前言
t-SNE 即 t-distributed stochastic neighbor embedding 是一種用於降維的機器學習演算法,在 2008 年由 Laurens van der Maaten 和 Geoffrey Hinton 提出。
t-SNE 是一種非線性降維演算法,主要適用於將高維資料降維到 2 維或 3 維 ,方便視覺化。但是由於以下種種原因導致它不適合於降維,僅適合視覺化:
- 資料需要降維時,特徵間常存線上性相關性,此時常使用線性降維演算法,如 PCA。而對於特徵之間存在非線性相關,我們並不會先使用非線性降維演算法降維再搭配一個線性模型,而是直接使用非線性模型;
- 一般而言,我們降維並不會把資料維度降維到2 維或者3維,降維的維度一般較大,如降到 20 維,由於 t-SNE 演算法使用自由度為 1 的 t 分佈很難做到好的效果;
- t-SNE 演算法計算複雜度很高,目標函式非凸,容易得到區域性最優解;
以下使用 t-SNE 和 PCA視覺化手寫數字的效果對比:
常見的降維演算法:
-
- 主成分分析(線性)
- t-SNE (非引數/非線性)
- 薩蒙對映(非線性)
- 等距對映(非線性)
- 區域性線性嵌入(非線性)
- 規範相關分析(非線性)
- SNE(非線性)
- 最小方差無偏估計(非線性)
- 拉普拉斯特徵圖(非線性)
2 SNE 演算法
t-SNE 演算法是從 SNE 改進而來,所以先介紹 SNE 。給定一組高維資料 $ \{x_{1}, x_{2}, \ldots, x_{n} \} , x_i=(x_{i}^{(1)}$,$x_{i}^{(2)},x_{i}^{(3)},......x_{i}^{(n)}) $,目標是將這組資料降維到 2 維,SNE 的基本思想是若兩個資料在高維空間中是相似的,那麼降維到 2 維空間時距離得很近。
2.1 高維空間
隨機鄰近嵌入(SNE) 採用首先通過將資料點之間的高維歐幾里得距離轉換為相似性的條件概率來描述兩個資料之間的相似性。
假設高維空間中的兩個點 $ x_{i}, x_{j}$ ,以點 $ x_{i}$ 為中心構建方差為 $ \sigma_{i}$ 的高斯分佈。用 $ p_{j \mid i}$ 表示 $ x_{j}$ 在 $ x_{i}$ 鄰域的概率,若 $ x_{j}$ 與 $ x_{i}$ 相距很近,那麼 $ p_{j \mid i}$ 很大;反之, $ p_{j \mid i}$ 很小。
$ p_{j \mid i}$ 定義如下:
$p_{j \mid i}=\frac{\exp \left(-\left\|x_{i}-x_{j}\right\|^{2} /\left(2 \sigma_{i}^{2}\right)\right)}{\sum_{k \neq i} \exp \left(-\left\|x_{i}-x_{k}\right\|^{2} /\left(2 \sigma_{i}^{2}\right)\right)}$
只關心不同點對之間的相似度,所以設 $p_{i \mid i}=0$ 。
2.2 低維空間
當把資料對映到低維空間後,高維資料點之間的相似性也應該在低維空間的資料點上體現出來。
假設 $ x_{i}, x_{j}$ 對映到低維空間後對應 $ y_{i}, y_{j}$,那麼 $y_{j}$ 是 $ y_{i}$ 鄰域的條件概率為 $ q_{j \mid i}$ :
$q_{j \mid i}=\frac{\exp \left(-\left\|y_{i}-y_{j}\right\|^{2}\right)}{\sum \limits _{k \neq i} \exp \left(-\left\|y_{i}-y_{k}\right\|^{2}\right)}$
低維空間中的方差直接設定為 $ \sigma_{i}=\frac{1}{\sqrt{2}} $ 。同樣 $q_{i \mid i}=0$ 。
2.3 目標函式
若 $y_{i}$ 和 $y_{j}$ 真實反映了高維資料點 $x_{i}$ 和 $x_{j}$ 之間的關係,那麼條件概率 $p_{j \mid i}$ 與 $q_{j \mid i} $ 應該完全相等。這裡只考慮了 $x_{i}$ 與 $x_{j}$ 之間的條件概率,若考慮 $x_{i}$ 與其他所有點之間的條件概率,則可構成一個條件概率分佈 $P_{i}$。 同理在低維空間存在一個條件概率分佈 $Q_{i}$ 且應該與 $P_{i}$ 對應。
衡量兩個分佈之間的相似性採用 KL 距離(Kullback-Leibler Divergence),SNE 最終目標就是對所有資料點最小化 KL 距 離,我們使用梯度下降演算法最小化如下代價函式:
$C=\sum\limits_{i} K L\left(P_{i}|| Q_{i}\right)=\sum \limits _{i} \sum \limits_{j} p_{j \mid i} \log \frac{p_{j \mid i}}{q_{j \mid i}}$
但由於 KL 距離 是一個非對稱的度量。最小化代價函式的目的是讓 $p_{j \mid i}$ 和 $q_{j \mid i}$ 的值儘可能的接近,即低維空間中點的相似性應當與高維空間中點的相似性一致。但從代價函式的形式可以看出,當 $p_{j \mid i}$ 較大,$q_{j \mid i}$ 較小時,代價較高;而 $p_{j \mid i}$ 較小,$ q_{j \mid i}$ 較大時,代價較低。即高維空間中兩個資料點距離較近時,若對映到低維空間後距離較遠,那麼將得到一個很高的懲罰,這當然沒問題。反之,高維空間中兩個資料點距離較遠時,若對映到低維空間距離較近,將得到一個很低的懲罰值,顯然應得到一個較高的懲罰。即SNE的代價函式更關注區域性結構,而忽視了全域性結構。
2.4 SNE缺點
總結一下SNE的缺點:
- 不對稱導致梯度計算複雜。由於條件概率 $p_{j \mid i}$ 不等於 $p_{i \mid j}$,$q_{j \mid i}$ 不等於 $q_{i \mid j} $,因此梯度計算中需要的計算量較大。目標函式計算梯度如下:
$\frac{\delta C}{\delta y_{i}}=2 \sum \limits _{j}\left(p_{j \mid i}-q_{j \mid i}+p_{i \mid j}-q_{i \mid j}\right)\left(y_{i}-y_{j}\right)$
- Crowing 問題。即不同類別的簇擠在一起,無法區分開來。擁擠問題與某個特定演算法無關,而是由於高維空間距離分佈和低維空間距離分佈的差異造成的。如高維度資料在降維到 10 維,可以有很好的表達,但降維到 2 維後無法得到可信對映。假設一個以資料點 $x_i$ 為中心,半徑為 $r$ 的 $m$ 維球(三維空間就是球),其體積是按 $r^m$ 增長的,假設資料點是在 $m$ 維球中均勻分佈的,我們來看看其他資料點與 $x_i$ 的距離隨維度增大而產生的變化。
從上圖可以看到,隨著維度的增大,大部分資料點都聚集在 $m$ 維球的表面附近,與點 $x_i$ 的距離分佈極不均衡。如果直接將這種距離關係保留到低維,就會出現擁擠問題。
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import norm
npoints = 1000 # 抽取1000個m維球內均勻分佈的點
plt.figure(figsize=(20, 4))
for i, m in enumerate((2, 3, 5, 8)):
# 這裡模擬m維球中的均勻分佈用到了拒絕取樣,即先生成m維立方中的均勻分佈,再剔除m維球外部的點
accepts = []
while len(accepts) < 1000:
points = np.random.rand(500, m)
accepts.extend([d for d in norm(points, axis=1) if d <= 1.0]) # 拒絕取樣
accepts = accepts[:npoints]
ax = plt.subplot(1, 4, i+1)
ax.set_xlabel('distance') # x軸表示點到圓心的距離
if i == 0:
ax.set_ylabel('count') # y軸表示點的數量
ax.hist(accepts, bins=np.linspace(0., 1., 50), color='green')
ax.set_title('m={0}'.format(str(m)), loc='left')
plt.show()
3 t-SNE
3.1 對稱 SNE
在 SNE 中,高維空間中條件概率 $p_{j \mid i}$ 不等於 $p_{i \mid j}$,低維空間中 $q_{j \mid i}$ 不等於 $q_{i \mid j} $,於是提出對稱 $\mathrm{SNE} $,採用聯合概率分佈代替原始的條件概率,使得 $p_{i j}=p_{j i}, \quad q_{i j}=q_{j i} $
優化 $p_{i \mid j }$ 和 $q_{i \mid j} $ 的 KL 散度的一種替換思路是,使用聯合概率分佈來替換條件概率分佈,即 $P$ 是高維空間裡各個點的聯合概率分佈, $Q$ 是低維空間下,目標函式為:
$C=K L(P \| Q)=\sum \limits_{i} \sum \limits _{j} p_{i, j} \log \frac{p_{i j}}{q_{i j}}$
在高維空間中定義 $p_{i j} $:
$p_{i j}=\frac{\exp \left(-\left\|x_{i}-x_{j}\right\|^{2} / 2 \sigma^{2}\right)}{\sum \limits_ {k \neq l} \exp \left(-\left\|x_{k}-x_{l}\right\|^{2} / 2 \sigma^{2}\right)}$
在低維空間中定義 $ q_{i j} $ :
$q_{i j}=\frac{\exp \left(-\left\|y_{i}-y_{j}\right\|^{2}\right)}{\sum_{k \neq l} \exp \left(-\left\|y_{k}-y_{l}\right\|^{2}\right)}$
但在高維空間中這樣定義會帶來異常值的問題。假設點 $x_{i}$ 是一個噪聲點,那麼 $\left\|x_{i}-x_{j}\right\|$ 的平方會很大,那麼對於所有的 $j$,$p_{i j}$ 的值都會很小,導致在低維對映下的 $y_{i}$ 對整個損失函式的影響很小,但對於異常值,我們需要得到一個更大的懲罰,於是對高維空間中的聯合概率修正為:
$p_{i j}=\frac{p_{i\mid j}+p_{p_{j \mid i}}}{2}$
這樣就避免了異常值的問題,此時的梯度變為:
$\frac{\delta C}{\delta y_{i}}=4 \sum_{j}\left(p_{i j}-q_{i j}\right)\left(y_{i}-y_{j}\right)$
但對稱 SNE 的效果只是略微優於 SNE 的效果。
3.2 引入 t 分佈
$t$-分佈(t-distribution)用於根據小樣本來估計呈正態分佈且方差未知的總體的均值。如果總體方差已知(例如在樣本數量足夠多時),則應該用正態分佈來估計總體均值。
$t$分佈曲線形態與 $n$(確切地說與自由度df)大小有關。與標準正態分佈曲線相比,自由度 df 越小,$t$ 分佈曲線愈平坦,曲線中間愈低,曲線雙側尾部翹得愈高;自由度 df 愈大,$t$ 分佈曲線愈接近正態分佈曲線,當自由度 $df=∞$ 時,$t$分佈曲線為標準正態分佈曲線。
假設 $X$ 服從標準正態分佈 $N (0,1)$, $Y$ 服從 $ \chi^{2}(n) $分佈, 那麼 $Z=\frac{X}{\sqrt{Y / n}} $ 的分佈稱為自由度為 $n$ 的分佈,記為 $Z \sim t(n) $ 。
分佈密度函式 $f_{Z}(x)=\frac{\operatorname{Gam}\left(\frac{n+1}{2}\right)}{\sqrt{n \pi} \operatorname{Gam}\left(\frac{n}{2}\right)}\left(1+\frac{x^{2}}{n}\right)^{-\frac{n+1}{2}} $
其中,$ \operatorname{Gam}(\mathrm{x}) $ 為伽馬函式。
對稱 SNE 在高維度下另外一種減輕”擁擠問題”的方法:在高維空間下,使用高斯分佈將距離轉換為概率分佈,在低維空間下,使用更加偏重長尾分佈的方式來將距離轉換為概率分佈。
長尾分佈
長尾(The Long Tail)這一概念是由“連線”雜誌主編克里斯·安德森(Chris Anderson)在2004年十月的“長尾” 一文中最早提出,用來描述諸如亞馬遜和Netflix之類網站的商業和經濟模式。
如圖所示,右邊藍色長長的部分便是長尾。
舉個例子:
如手機市場,可能某果和某為手機近幾年大受歡迎,銷量佔比極高,是手機市場上的主流商品,那就是左邊的紅色部分。而其他的各類手機就是上圖中的右邊藍色部分。長尾效應:
長尾效應就是藍色面積大於紅色面積,就是市場中那些小而散的個性化需求的總和也能產生極為驚人的利益。
t 分佈是一種長尾分佈,在圖左中可以看到,在沒有異常點時,t 分佈與高斯分佈的擬合結果基本一致。在圖右,出現了部分異常點,由於高斯分佈的尾部較低,對異常點比較敏感,為了照顧這些異常點,高斯分佈的擬合結果偏離了大多數樣本所在位置,方差也較大。相比之下,t 分佈的尾部較高,對異常點不敏感,保證了其魯棒性,因此其擬合結果更為合理,較好的捕獲了資料的整體特徵。
圖中有高斯分佈和 t 分佈兩條曲線,表示點之間的相似性與距離的關係,高斯分佈對應高維空間,t 分佈對應低維空間。那麼對於高維空間中相距較近的點,為了滿足 $p_{i j}=q_{i j}$, 低維空間中的距離需要稍小一點; 而對於高維空間中相距較遠的點,為了滿足 $p_{i j}=q_{i j} $, 低維空 間中的距離需要更遠。便滿足同一簇內的點(距離較近)聚合的更緊密,不同簇之間的點(距離較遠)更加疏遠。
引入 t 分佈之後,在低維空間中,用自由度為 1 的 t 分佈重新定義 :
$q_{i j}=\frac{\left(1+\left\|y_{i}-y_{j}\right\|^{2}\right)^{-1}}{\sum \limits _{k \neq l}\left(1+\left\|y_{i}-y_{j}\right\|^{2}\right)^{-1}}$
然後與原始 SNE 一樣,我們使用 K-L 散度定義目標函式進行優化,從而求解。至此,關於 t-SNE 演算法的原理部分,我們就介紹完了。
3.3 t-SNE 演算法過程
- $Data: X=x_{1}, \ldots, x_{n}$
- 計算 cost function 的引數: 困惑度 Perp
- 優化引數:設定迭代次數 $ \mathrm{T}$ , 學習速率$ \eta$ ,動量 $ \alpha(t)$
- 目標結果是低維資料表示 $ Y^{T}=y_{1}, \ldots, y_{n}$
- 開始優化
- 計算在給定 Perp下的條件概率 $ p_{j \mid i}$ (參見上面公式)
- 令 $ p_{i j}=\frac{p_{j\left|i+p_{i}\right| j}}{2 n}$
- 用 $ N\left(0,10^{-4} I\right)$ 隨機初始化 $ \mathrm{Y}$
- 迭代,從 $ \mathrm{t}=1$ 到 $ \mathrm{T}$, 做如下操作:結束
- 計算低維度下的 $ q_{i j}$ (參見上面的公式)
- 計算梯度(參見上面的公式)
- 更新 $ Y^{t}=Y^{t-1}+\eta \frac{d C}{d Y}+\alpha(t)\left(Y^{t-1}-Y^{t-2}\right)$
- 結束
- 結束
3.4 優化小技巧
- 提前壓縮 (ear1y compression) : 開始初始化的時候,各個點要離得近一點。這樣小的距離,方便各個聚類中心的移動。可以通過引入 $L2$ 正則項 (距離的平方和) 來實現。
- 提前誇大(ear1y exaggeration):在開始優化階段, $ p_{i j}$ 乘以一個大於 1 的數進行擴大, 來避免因為 $ q_{i j}$ 太小導致優化太慢的問題。比如前 50 次迭代, $ p_{i j} $ 乘以 4。
優化的過程動態圖如下:
3.5 缺點
- 主要用於視覺化,很難用於其他目的。比如測試集合降維,因為他沒有顯式的預估部分,不能在測試集合直接降維;比如降維到10維,因為 t 分佈偏重長尾,1個自由度的t分佈很難儲存好區域性特徵,可能需要設定成更高的自由度。
- t-SNE 傾向於儲存區域性特徵,對於本徵維數(intrinsic dimensionality)本身就很高的資料集,是不可能完整的對映到 2-3 維的空間
- t-SNE 沒有唯一最優解,且沒有預估部分。如果想要做預估,可以考慮降維之後,再構建一個迴歸方程之類的模型去做。但是要注意,t-SNE中距離本身是沒有意義,都是概率分佈問題。
- 訓練太慢。