降維
在很多機器學習問題中,訓練集中的每條數據經常伴隨着上千、甚至上萬個特征。要處理這所有的特征的話,不僅會讓訓練非常緩慢,還會極大增加搜尋良好解決方案的困難。這個問題就是我們常說的維度災難。
不過值得慶幸的是,在實際問題中,經常可以極大地減少特征的數目,將棘手的問題轉變為容易處理的問題。例如,以MNIST圖片數據集為例:在圖片邊框附近的像素點基本都是白色,所以我們完全可以從訓練集中剔除掉這些像素點,並且不損失任何信息。並且,兩個相鄰像素點之間一般都是高度相關的:如果我們將它們合並成單個像素點(例如,取兩個像素點強度的平均值),我們也不會丟失太多信息。
需要注意的是,減少維度實際是會讓一些信息丟失(與壓縮圖片為JPEG會降低它的畫質同理)。所以即使它能加速訓練,它也可能會讓我們系統的表現稍差。同時它也會讓我們的管道稍些復雜而因此維護更難。所以如果訓練並不是特別慢,則我們應該優先嘗試使用原數據集進行訓練,而不是考慮用降維。在某些情況下,減少訓練數據的維度可能會過濾掉一些不必要的細節,並因此獲取更高的性能。但是,一般情況下並不會,它僅是加速訓練。
除了加速訓練,降維也對數據可視化非常有用。將維度的數量減少到2(或3)個,可以讓我們給高維訓練集畫出一個精簡的圖,並且一般可以提供我們一些重要的信息(例如可以直接看到一些模式,如簇)。除此之外,數據可視化也可以在與其他非數據科學家人員溝通時非常重要。
在這章我們會討論維度災難,並看一下高維空間內具體會發生些什么。接着我們會引入兩個主要的降維方法(projection與Manifold Learning),並最后介紹3個最流行的降維技術:PCA,核PCA以及LLE。
維度災難
由於我們生活在並且習慣於3維世界,所以當我們嘗試想象高維空間時,一般很難有個直觀的感受。即使是一個4D的超立方體,在我們腦海中也很難進行想象,更不用說200-維的橢球體在1000-維空間的彎曲的樣子了。下圖是0D(0維)到4D超平面的一個示例:
在高維空間中,很多事情的行為都會非常不一樣。例如,假設我們在一個單元正方形(1x1正方形)中選擇一個隨機點,則此點僅有40%的概率與邊框的距離小於0.001(也就是說,一個隨機點不太可能非常靠近某個維度)。但是在一個10000維的單元超立方體中,這個概率要高於99.999999%。大部分在高維超平面中的點都非常接近於邊界。
還有一個更麻煩的差異:假設我們在一個單元正方形中隨機選取兩個點,這兩個點的平均距離約為0.52。如果我們在一個3D立方體中隨機選擇兩個點,則平均距離大約為0.66。但是如果我們在1000000維超立方體中隨機選擇兩個點的話,它們的平均距離大約為408.25(約為1000000/6的平方根 ) 。這是一個很反直覺的現象:為什么兩個點都在同樣的單元超平面中,但是距離可以離的這么遠?當然這是由於在高維中有足夠多的空間導致了。所以這樣導致的結果就是:高維數據集中的數據點可能會非常稀疏(或離散)。大多數訓練實例可能相互之間離的都非常遠,導致預測性能相對於低維數據集來說會更不可靠,因為它們基於的是更大的外推法(extrapolations)。簡單地說,訓練集的維度越高,過擬合的風險越大。
理論上來說,一個解決維度災難的辦法是增加訓練集的大小,以達到一個足夠訓練數據條目的量。但遺憾的是,實際上所需增長的訓練數據條目量是根據維度數呈指數級別增長的。對於僅僅100個特征來說(這已經遠小於MINST問題的維度了),我們需要的訓練數據條目數都已經超過我們平常的認知數了。
降維的主要方法
在我們深入了解特定降維算法之前,我們先看一下兩個主要的降維方法:投影(projecting)與流形學習(Manifold Learning)。
Projection
在大多數是實際問題中,訓練數據並不會跨所有維度均勻分布。很多特征幾乎是不變的,而其他特征是高度相關的(例如之前提到過的MNIST)。在這些情況下,數據集中所有的訓練實例都可以放在(或者接近於)一個更低維的子空間中。舉個例子,下圖中我們可以看到一個3維數據集,在投影后可以由圓環表示:
可以注意到所有訓練實例都接近於一個平面:這個是3D空間中的一個2D子空間。如果我們將所有訓練實例垂直投影到這個子空間,則可以得到一個新的2D數據集,如下所示:
需要注意的是,坐標軸對應的是兩個新特征z1和z2(投影在這個平面上的坐標)。
不過,投影並不總是最好的降維方法。在很多情況下,子空間可能彎曲和旋轉,例如著名的瑞士卷數據集:
如果簡單的將它們投影到一個平面(例如,直接丟棄x3)則會將不同層的數據擠壓到一起,如下左圖所示。不過我們真正希望的是將這個瑞士卷展開,而獲取一個2D數據集,如右圖所示:
流形學習(Manifold Learning)
瑞士卷數據集是一個2D流形的例子。簡單地說,一個2D流形是一個2D的形狀,可以彎曲並旋轉到一個更高的空間中。更普遍地說,一個d-維的流形是一個n-維空間里的一部分(d < n),在本地類似於一個d-維的超平面。在這個瑞士卷例子中,d=2,n=3:它在本地類似一個2D平面,但是是在3維里卷成。
許多降維算法的方式是在訓練實例上做流形建模,這個稱為流形學習(Manifold Learning)。它基於的是流形假設(manifold assumption),也成為流形假說(manifold hypothesis)。它假設真實世界中大多數的高維數據集接近於一個非常低維的流形。從經驗來看,經常可以觀察到這個現象。
再看一下MNIST數據集:所有的手寫數字圖片都有一些相似的地方。它們由連接的線構成、邊框是白色、並且它們或多或少都處於中心。如果我們隨機產生一張圖片,僅僅使用它們其中的一小部分也會讓它看起來像一個手寫數字。換句話說,我們若是想要生成一張手寫圖,所需的維度遠小於原圖的維度。
流形假說經常伴隨着另一個假說:如果目標任務(例如分類或是回歸)以低維空間的流形表示的話,會使得任務更簡單。例如,在下圖第一行中,瑞士卷被分成兩個類:在3D空間中(左圖),決策邊界會有些復雜,但是在2D展開后的流形空間中(右圖),決策邊界非常簡答,就是一條直線。
不過,這種隱形假說並不總是成立的。例如在上圖的下半部分,決策邊界在x1=5。這個決策邊界在原3D空間內非常簡單(就是一個垂直平面),但是在展開后的流形中看起來更復雜一些(包含四條獨立的線段)。
簡而言之,在訓練模型之間對訓練集進行降維通常可以加速訓練,但它可能並不是一直都引入到一個更好、或更簡單的解決方案;它全部取決於數據集。
現在我們已經了解了維度災難,並且可以使用什么樣的降維算法來對抗此問題。之后我們會介紹一些最常見的算法。