大家也許已經知道,如果一個高維的資料集,有時會沒辦法找到一個好的模型來描述資料。同樣的狀況,複雜的模型有時也會因為太多參數,因此無法透過訓練過程,來得到一組比較好的參數。今天我們來仔細看看這個問題吧。
一、高維的空間中任意兩點的距離
我們先來看看一個空間中,任意兩點的距離大概是多少。首先考慮二維平面,假設我們隨機產生2個介於0到1之間的數字,第1個數字當成x座標,第2個數字當成y座標,這樣我們得到了平面上的一個隨機點。
接著,我們用同樣的方式,再產生1個隨機的點。如此一來,我們的平面上就有2個隨機的點,所以可以計算這2個點的距離。我們可以不斷隨機產生平面座標上的2個點,然後計算2個點的距離,最後將所有計算得來的距離取平均,即可獲得平面座標上隨機2點的距離。
三維空間該怎麼做呢?其實方法也類似:隨機產生3個介於0到1的數字做為空間中的一個點,接著產生第二個隨機點即可計算距離。重複執行並求的距離的平均,即可獲得空間座標上隨機2點的距離。
我們把維度從2一直增加到100,算出不同維度中隨機2個點的距離,可以得到圖一的結果。
從圖中可以發現:即使我們隨機產生的點,其座標值都限制在0到1之間,然而隨著維度增加,彼此之間的平均距離也越來越大。大家可以想像成在高維的空間裡,任意兩點的距離其實都很遠,也就是說,每一個點其實都長的不太一樣。
這樣會有什麼問題嗎?這問題可大了!我們常常建立模型來把相似的資料放在同一群,可是在高維空間裡,每個資料點都跟別人很不像,那會很難找到相似的資料並且放在同一群。
二、高維空間中單位球的體積所佔比例
我們可以再做另一項模擬。一樣從平面座標開始,我們以圓點為中心畫一個半徑為1的單位圓,接著找一個最小的方形可以把這個圓框住(其實就是邊長為2,中心點是原點的正方形)。最後計算單位圓跟方形的面積比例:
完成平面座標之後,接著我們做三維空間:以圓點為中心畫一個半徑為1的單位球,接著找一個最小的方形可以把這個圓框住,最後計算單位球跟方形的體積比例:
我們把維度從2一直增加到10,算出不同維度中,單位球跟方形的體積比例,可以得到圖二的結果。
從圖中可以發現,當維度越來越高時,單位球跟方形的體積比例趨近於0。大家可以想像在巨大的空間裡,每一個點其實都微不足道。因此,散布在高維空間裡的資料,其實每一個資料點不是那麼重要。
三、維度的詛咒帶來的災難
透過上述兩個實驗之後,我們來看看哪些時候我們會遇到維度的詛咒:
1、影像處理。一個800*600的彩色照片代表有1440000個變數。
2、訓練深度學習模型。如果神經網路有5個隱藏層、每一層有200個神經元,這樣就有2000個參數,這還不包含輸入層跟輸出層。
3、計算距離。比如說高維空間中某一點與原點的距離,或是計算在高維空間中哪一個點跟指定的點最近,可是任兩點的距離好像都一樣遠。
4、抽樣。在高維中透過抽樣一些資料點,來代表這個空間,可能需要很多很多資料點才夠。
四、解決方案之一:降維
既然高維空間這麼難處理,因此有些人就會將資料降維。線性的方法有主成分分析(Principle Component Analysis)、獨立成分分析(Independent Component Analysis)。非線性的方法有t-隨機鄰近嵌入法(t-distributed Stochastic Neighbour Embedding)、Variation Autoencoder等等。大家要依照自己的資料性質,選擇合適的方法。或是可以都試試看,再選一個比較能夠看出資料特性的方法。技術實作方式,可以參考旗標出版的「Kaggle競賽攻頂秘笈 — 揭開Grandmaster的特徵工程心法,掌握制勝的關鍵技術」以及「GAN對抗式生成網路」。
重點整理
1、可以想像高維中的2個點距離都很遙遠。
2、可以想像高維中的資料點其實都是微不足道。
3、為了解決高維空間帶來的問題,可以考慮使用降維法。
參考資料
Murphy K. P. (2012). Machine Learning: A Probabilistic Perspective. Cambridge, MA: MIT Press.
關於作者
Chia-Hao Li received the M.S. degree in computer science from Durham University, United Kingdom. He engages in computer algorithm, machine learning, and hardware/software codesign. He was former senior engineer in Mediatek, Taiwan. His currently research topic is the application of machine learning techniques for fault detection in the high-performance computing systems.