多年以後,面對這篇文章Lemma 16的證明一臉懵逼的時候,我將會想起Alexander Coward教我saddle point的那個遙遠的下午。
和大部分人一樣,我在微積分課里接觸到「鞍點」這個概念的時候,並不知道關於它人們還有那麼多沒有搞懂的地方。鞍點在多變數微積分里是一個很簡單的概念。我們都知道對於一個可微分的函數,其導數為0的地方叫做critical point。對於convex/concave的函數來說,critical point要麼是最小值要麼是最大值,然而對於一個普通的函數來說,導數等於0還有可能意味著第三種情況,那就是鞍點。最直觀的講解這三種情況的方法當然是看圖。我的三維畫圖能力一直都是渣渣,連個立方體都畫不好,不過好在這樣的圖片到處都是,所以請看下圖,從左到右分別是局部最小值,局部最大值和鞍點。
當然這是兩個變數的函數的情況,再往上就沒法畫出來只能自行腦補了。從圖裡也能看出來,簡單來說,局部最小值就是說在這個地方,你沿著每一個方向移動一點都會使得函數的值變大,而在鞍點處,沿著某些方向走能使函數值上升,另外一些方向則能使函數值下降(或不變)。然後大家肯定也學過如何判定一個critical point是屬於哪種情況的辦法,概括起來就是看Hessian矩陣的eigenvalue:如果所有的eigenvalue都是正的,那就是局部最小值;所有的eigenvalue都是負的,那就是局部最大值;eigenvalue有正有負(或者有0),那就是鞍點。看到這裡你應該能領悟到,對於一個普通函數來說,鞍點遠遠比想像中的要多,因為比如有一個100個變數的函數,假設他Hessian的每一個eigenvalue分別有50%的概率是正或者負(當然這個假設並不是很合理),那麼是不是意味著一個critical point極大概率是一個鞍點,而不是優化問題里我們想要的最大或最小值?那假如一個函數的眾多critical points中,絕大部分都是鞍點,那麼這有可能會給優化帶來很大的問題。
首先我們要明白為什麼我們需要研究如何逃離鞍點。在現實中,非凸優化的目標是收斂到一個局部最小值。之所以不追求全局最小值,一方面是因為找全局最小值顯然是一個NP-Hard問題,另一方面是因為很多研究表明,對於一些常見的問題,比如矩陣補全,張量分解,甚至最受關注的神經網路,找到一個局部最小值和找到一個全局最小值的效果是差不多的。可以理解為在每一個局部最小值處,函數的值都差不多(對於有些問題甚至可以證明每一個局部最小值都是全局最小值)。然而鞍點就完全不是這麼回事了。簡單的一維例子,y=x^3這個函數,x=0是一個critical point,然而你從0處往左走,這個函數就趨向於負無窮。所以一個演算法如果收斂於鞍點,那是絕對不可以接受的。[1]這篇文章就指出了鞍點可能是訓練神經網路的一個主要障礙。
TAG:人工智慧演算法 | 人工智慧 | 科技 |