淺談流形學習

原帖http://blog.pluskid.org/?p=533

總覺得即使是“淺談”兩個字,還是讓這個標題有些過大了,更何況我自己也纔剛剛接觸這麼一個領域。不過懶得想其他標題了,想起來要扯一下這個話題,也是因爲和朋友聊起我自己最近在做的方向。Manifold Learning 或者僅僅 Manifold 本身通常就聽起來頗有些深奧的感覺,不過如果並不是想要進行嚴格的理論推導的話,也可以從許多直觀的例子得到一些感性的認識,正好我也就借這個機會來簡單地談一下這個話題吧,或者說至少是我到目前爲止對這它的認識。

這兩個詞,在談 Manifold 之前,不妨先說說 Learning ,也就是 Machine Learning 。而說道 Machine Learning 而不提一下 Artificial Intelligence 的話似乎又顯得有些不厚道。人說 AI 是一門最悲劇的學科,因爲每當它的一個子領域發展得像模像樣之後,就立馬自立門戶,從此和 AI “再無瓜葛”了,而 Machine Learning 大概要算是最新的一個典型吧。這就讓人有點奇怪,比如說數學,分門別類總算是夠多了吧?可以不管怎麼分,大家兄弟姐妹也都還承認自己是叫“數學”的。那 AI 呢?我覺得這裏有很大一部分是它自身定位的問題。

反正現在我是不太清楚 AI 是做什麼的,不知道其他人到底清楚不清楚。Wikipedia 上說

Artificial intelligence (AI) is the intelligence of machines and the branch of computer science that aims to create it.

可是這相當於一個 tautology ,因爲到底什麼又是 the intelligence of machines 呢?一開始的時候,大牛們都野心勃勃,而且好像也是信心滿滿,就好像曾經廣泛認爲“牛頓定理揭示了宇宙真理,科學剩下的事情只要按照公式來做計算就可以了”一樣,大家可能覺得,不出幾十年,人類就可以不用思考,交給 AI 來做了。不過我這裏並不想再多說諸如什麼是“思考”,什麼是“智能”之類的以及隨之而來的“圖靈測試”之類的話題。我想說的是,到頭來,AI 到底是什麼,這還是一個問題,或者說,AI 在一開始定了一個過高的目標,幾十年後,發現情況並不像當年那麼樂觀,卻又有些下不了臺了。

這個時候,AI 的一些旁枝或者子領域果斷放下面子,丟掉了那個近乎玄幻的目標,逐漸發展成爲“正常”的學科,所以也就不再好稱爲 AI 了。或者說現在的 AI 有兩個意思,一個廣義的 AI ,包括了所有相關的以及派生的領域,另一個則是狹義的或者經典的 AI ,專門指那些仍然在執着地追求着真正的“智能”的部分,或者說得不好聽一點,就是剩下的部分。

Machine Learning 作爲離家出走的典型,雖然名字裏帶了 Learning 一個詞,讓人乍一看覺得和 Intelligence 相比不過是換了個說法而已,然而事實上這裏的 Learning 的意義要樸素得多。我們來看一看 Machine Learning 的典型的流程就知道了,其實有時候覺得和應用數學或者更通俗的數學建模有些類似,通常我們會有需要分析或者處理的數據,根據一些經驗和一些假設,我們可以構建一個模型,這個模型會有一些參數(即使是非參數化方法,也是可以類似地看待的),根據數據來求解模型參數的過程,就叫做 Parameter Estimation ,或者 Model Fitting ,但是搞機器學習的人,通常把它叫做 Learning (或者,換一個角度,叫 Training)——因爲根據數據歸納出一個有用的模型,這和我們人類“學習”的過程還是挺類似的吧。不過,如果拋開無聊的摳字眼遊戲的話,我們可以看到,Machine Learning 已經拋棄了“智能”的高帽子,它的目的就是要解決具體的問題——而並不關心是否是通過一種“智能”的方式類解決的。

說到這裏,其實我們構造模型就類似於寫一個類,數據就是構造函數的參數,Learning 就是構造函數運行的過程,成功構造一個對象之後,我們就完成了學習。一些 Machine Learning 的問題到這一步就結束了,另一些情況還會使用得到的模型(對象)對後來的數據進行一些處理,通常會是 Inferencing 。到這個時候,又有些像統計裏的東西了,所謂“統計推斷”嘛。其實原本統計和機器學習研究的不少問題就是交叉在一起的,不過兩派人從不同的角度來看待同樣的問題。而且,也確實有 Statistical Learning 這麼一個說法存在的,可以把他看成是 Machine Learning 的一個子領域(或者是一個分子或者甚至就是 Machine Learning 本身)。

到這裏,如果你還沒有因爲不斷地摳字眼而煩躁的話,我已經忍無可忍了。所以,我就假定你已經瞭解了什麼叫 Learning ,或者是已經噁心到懶得去了解了。於是我們轉入下一個話題:流形,也就是 Manifold 。不知道你有沒有爲我在本文開頭放上的那個地球的圖片感到困惑?這是因爲球面是一個很典型的流形的例子,而地球就是一個很典型的“球面”啦(姑且當作球面好啦)。

有時候經常會在 paper 裏看到“嵌入在高維空間中的低維流形”,不過高維的數據對於我們這些可憐的低維生物來說總是很難以想像,所以最直觀的例子通常都會是嵌入在三維空間中的二維或者一維流行。比如說一塊布,可以把它看成一個二維平面,這是一個二維的歐氏空間,現在我們(在三維)中把它扭一扭,它就變成了一個流形(當然,不扭的時候,它也是一個流形,歐氏空間是流形的一種特殊情況)。

所以,直觀上來講,一個流形好比是一個 d 維的空間,在一個 m 維的空間中 (m > d) 被扭曲之後的結果。需要注意的是,流形並不是一個“形狀”,而是一個“空間”,如果你覺得“扭曲的空間”難以想象,那麼請再回憶之前一塊布的例子。如果我沒弄錯的話,廣義相對論似乎就是把我們的時空當作一個四維流(空間三維加上時間一維)形來研究的,引力就是這個流形扭曲的結果。當然,這些都是直觀上的概念,其實流形並不需要依靠嵌入在一個“外圍空間”而存在,稍微正式一點來說,一個 d 維的流形就是一個在任意點出局部同胚於(簡單地說,就是正逆映射都是光滑的一一映射)歐氏空間 \textcal{R}^d 。實際上,正是這種局部與歐氏空間的同胚給我們帶來了很多好處,這使得我們在日常生活中許許多多的幾何問題都可以使用簡單的歐氏幾何來解決,因爲和地球的尺度比起來,我們的日常生活就算是一個很小的局部啦——我突然想起《七龍珠》裏的那個界王住的那種私人小星球,走幾步就要繞一圈的感覺,看來界王不僅要體力好(那上面重力似乎是地球的十倍),而且腦力也要好,初中學的必須是黎曼幾何了!

那麼,除了地球這種簡單的例子,實際應用中的數據,怎麼知道它是不是一個流形呢?於是不妨又迴歸直觀的感覺。再從球面說起,如果我們事先不知道球面的存在,那麼球面上的點,其實就是三維歐氏空間上的點,可以用一個三元組來表示其座標。但是和空間中的普通點不一樣的是,它們允許出現的位置受到了一定的限制,具體到球面,可以可以看一下它的參數方程:


可以看到,這些三維的座標實際上是由兩個變量 \theta 和 \varphi 生成的,也可以說成是它的自由度是二,也正好對應了它是一個二維的流形。有了這樣的感覺之後,再來看流形學習裏經常用到的人臉的例子,就很自然了。下圖是 Isomap 論文裏的一個結果:

這裏的圖片來自同一張人臉(好吧,其實是人臉模型),每張圖片是 64×64 的灰度圖,如果把位圖按照列(或行)拼起來,就可以得到一個 4096 維的向量,這樣一來,每一張圖片就可以看成是 4096 維歐氏空間中的一個點。很顯然,並不是 4096 維空間中任意一個點都可以對應於一張人臉圖片的,這就類似於球面的情形,我們可以假定所有可以是人臉的 4096 維向量實際上分佈在一個 d 維 (d < 4096) 的子空間中。而特定到 Isomap 的人臉這個例子,實際上我們知道所有的 698 張圖片是拍自同一個人臉(模型),不過是在不同的 pose 和光照下拍攝的,如果把 pose (上下和左右)當作兩個自由度,而光照當作一個自由度,那麼這些圖片實際只有三個自由度,換句話說,存在一個類似於球面一樣的參數方程(當然,解析式是沒法寫出來的),給定一組參數(也就是上下、左右的 pose 和光照這三個值),就可以生成出對應的 4096 維的座標來。換句話說,這是一個嵌入在 4096 維歐氏空間中的一個 3 維流形。

實際上,上面的那張圖就是 Isomap 將這個數據集從 4096 維映射到 3 維空間中,並顯示了其中 2 維的結果,圖中的小點就是每個人臉在這個二維空間中對應的座標位置,其中一些標紅圈的點被選出來,並在旁邊畫上了該點對應的原始圖片,可以很直觀地看出這兩個維度正好對應了 pose 的兩個自由度平滑變化的結果。

就我目前所知,把流形引入到機器學習領域來主要有兩種用途:一是將原來在歐氏空間中適用的算法加以改造,使得它工作在流形上,直接或間接地對流形的結構和性質加以利用;二是直接分析流形的結構,並試圖將其映射到一個歐氏空間中,再在得到的結果上運用以前適用於歐氏空間的算法來進行學習。

這裏 Isomap 正巧是一個非常典型的例子,因爲它實際上是通過“改造一種原本適用於歐氏空間的算法”,達到了“將流形映射到一個歐氏空間”的目的。 :)

Isomap 所改造的這個方法叫做 Multidimensional Scaling (MDS) ,MDS 是一種降維方法,它的目的就是使得降維之後的點兩兩之間的距離儘量不變(也就是和在原是空間中對應的兩個點之間的距離要差不多)。只是 MDS 是針對歐氏空間設計的,對於距離的計算也是使用歐氏距離來完成的。如果數據分佈在一個流形上的話,歐氏距離就不適用了。

讓我們再回到地球——這個在三維空間中的二維流形,假設我們要在三維空間中計算北極點和南極點的距離,這很容易,就是兩點相連的線段的長度,可是,如果要在這個流形上算距離就不能這樣子算了,我們總不能從北極打個洞鑽到南極去吧?要沿着地球表面走才行,當然,如果我隨便沿着什麼路線走一遍,然後數出總共走了多少步作爲距離,這是不成的,因爲這樣一來如果我沿着不同的路線走,豈不是會得到不同的距離值?總而言之,我們現在需要一個新的定義在地球表面(流形)上的距離度量,理論上來說,任意滿足測度的 4 個條件的函數都可以被定義爲距離,不過,爲了和歐氏空間對應起來,這裏選擇一個直線距離的推廣定義。

還記得初中學的“兩點之間,線段最短”嗎?現在,我們反過來說,把線段的概念推廣一下,變成“兩點之間最短的曲線是線段”,於是流形上的距離定義也就等同於歐氏空間了:流形上兩個點之間的距離就是連接兩個點的“線段”的長度。雖然只是置換了一個概念,但是現在兩者統一起來了,不過,在流形上的線段大概就不一定是“直”的了(於是直線也變成不一定是“直”的了),通常又稱作是“測地線”。對於球面這個簡單的流形來說,任意一條線段必定是在一個“大圓”上的,於是球面上的直線其實都是一些大圓,也造成了球面這個流形上沒有平行線等一系列尷尬的局面(任意兩條直線均相交),如果你看過一些數學科普八卦類的書,應該會回憶起不少東西啦!

回到 Isomap ,它主要做了一件事情,就是把 MDS 中原始空間中距離的計算從歐氏距離換爲了流形上的測地距離。當然,如果流形的結構事先不知道的話,這個距離是沒法算的,於是 Isomap 通過將數據點連接起來構成一個鄰接 Graph 來離散地近似原來的流形,而測地距離也相應地通過 Graph 上的最短路徑來近似了。如下圖所示:

這個東西叫做 Swiss Roll ,姑且把它看作一塊捲起來的布好了。圖中兩個標黑圈的點,如果通過外圍歐氏空間中的歐氏距離來計算的話,會是捱得很近的點,可是在流形上它們實際上是距離很遠的點:紅色的線是 Isomap 求出來的流形上的距離。可以想像,如果是原始的 MDS 的話,降維之後肯定會是很暴力地直接把它投影到二維空間中,完全無視流形結構,而 Isomap 則可以成功地將流形“展開”之後再做投影。

除了 Isomap 之外,Manifold Embedding 的算法還有很多很多,包括 Locally Linear Embedding 、Laplacian Eigenmaps 、Hessian Eigenmaps 、Local Tangent Space Alignment、Semidefinite Embedding (Maximum Variance Unfolding) 等等等等。哪個好哪個壞也不好說,它們都各有特點,而且也各自有不少變種。網上有一個 Matlab 的 demo ,給出了幾種流行的 manifold embedding 算法在一些 synthetic manifold 上的結果和對比,可以有一個直觀的認識。

另一方面是改造現有算法使其適合流形結構甚至專門針對流形的特點來設計新的算法,比較典型的是 graph regularized semi-supervised learning 。簡單地說,在 supervised learning 中,我們只能利用有 label 的數據,而(通常都會有很多的)沒有 label 的數據則白白浪費掉。在流形假設下,雖然這些數據沒有 label ,但是仍然是可以有助於 Learn 出流形的結構的,而學出了流形結構之後實際上我們就是對原來的問題又多了一些認識,於是理所當然地期望能得到更好的結果嘍。

當然,所有的這些都是基於同一個假設,那就是數據是分佈在一個流形上的(部分算法可能會有稍微寬鬆一些的假設),然而 real world 的數據,究竟哪些是分別在流形上的呢?這個卻是很難說。不過,除了典型的 face 和 hand written digit 之外,大家也有把基於流形的算法直接用在諸如 text 看起來好像也流形沒有什麼關係的數據上,效果似乎也還不錯。

說回來,雖然和實際應用結合起來是非常重要的一個問題,但是也並不是決定性的,特別是對於搞理論方面的人來說。我想,對於他們來說,其實也像是在做應用啦,不過是把數學裏的東西應用到機器學習所研究的問題裏來,而且其中關係錯綜複雜,圖論、代數、拓撲、幾何……彷彿是十八路諸侯齊聚一堂,所以讓我總覺得要再花 500 年來惡補數學才行呀!

不過我表示可以理解其中存在的潛在的 happy 之處,就好比你玩遊戲,先玩了《天地劫:神魔至尊傳》,然後再玩《天地劫序章:幽城幻劍錄》的時候,會發現裏面的人物、劇情逐漸地聯繫起來,也許甚至只是在一個地方出現過的一個完全不起眼的配角,當你再在另一地方突然看到他是,一系列的線索瞬間被聯繫起來,全局的畫面漸漸浮現,那種 happy 的感覺,大概就是所謂的“撥雲見日”了吧! :D

所以呀,這些東西其實都是差不多的,有時候想想那些泰斗站在頂峯上“一覽衆山小”的感覺,那種“融會貫通”的感覺,真是讓人各種羨慕呀!無奈就只好去爬爬老和山北高峯來體驗體驗了。 :p

最後是總結:所謂 Machine Learning 裏的 Learning ,就是在建立一個模型之後,通過給定數據來求解模型參數。而 Manifold Learning 就是在模型裏包含了對數據的流形假設。

發佈了11 篇原創文章 · 獲贊 4 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章