第三章 沒有解決方法?現在有了!
“機器學習的發展要追溯到1957年,Rosenblatt提出了感知機模型……”
華東大學的一間教室里,徐毅站在講臺上,一邊播放幻燈片,一邊對著臺下的學生講解道。
剛剛進入八月份,雖然秋季學期還未正式開學,但華東大學的小學期課程已經開始,徐毅正在給選修《機器學習》這門課程的本科生上課。
炎熱的夏風伴隨著著窗外的蟬鳴,帶進屋中昏沉的睡意,連不停嗡嗡轉動的風扇也無法吹散。
但教室里的學生幾乎全都專注地看向講臺,認真聽著徐毅的講授,展現出作為重點大學學生的優秀素質,讓已經汗流浹背的徐毅感到欣慰不已。
“……根據我們前面的講述,感知機實際上就是將我們輸入的數據作為向量,把向量中的每一個元素進行加權求和,最后將數據分類,我們可以用一張二維的圖像作為示例。”
徐毅放出下一張PPT,圖上是一個畫著x軸和y軸的平面坐標系,上面散落著許多紅色和藍色的點。
“來看這張圖,里面每一個點就代表一個數據樣本,我們用兩種顏色來表示數據的種類。”
“感知機的目的就是要找到一條直線,從而將這些點按照種類分開,就像這樣…”
隨著徐毅點擊鼠標,一條直線在圖中出現,將兩種顏色的點切到左右兩邊。
“用數學語言來描述的話,就是用直線y=wx+b來將數據樣本分類,而感知機的學習過程就是尋找這條直線的系數w和b的過程,”
徐毅又一點鼠標,坐標系上的點和直線統統消失,轉而出現了坐標在(0,0)(0,1)(1,0)(1,1)上的四個點,它們剛好構成了一個小正方形的四個頂點,右上角的頂點被標成藍色,另外三個點則是紅色。
“我們用這四個點來表示最基礎的邏輯門,藍色表示真,紅色表示假,圖中所示是一個與門,顯而易見我們可以用一條直線把真值和假值分開。”
一道將正方形右上角斜著切開的黑線隨著徐毅的話語出現,
“同樣地,對于或門和非門邏輯,我們同樣可以用一個感知機來表示,但是感知機有一個很重大的缺陷,大家覺得是什么?”
聽到徐毅的提問,下面的學生七嘴八舌地回答起來。
“多個種類混雜的情況?”
“不能用直線分離的點……”
“異或問題!”
徐毅看了一眼說出正確答案的學生,這個小胖子叫王浩中,對機器學習的相關知識了解的相當全面,在前幾節課上已經給他留下了很深刻的印象,因此他毫不意外地點點頭,補充道:
“多分類問題實際上可以轉化為多個二分類問題,因此這類問題是完全可以用感知機實現的……”
“所以正確答案就是線性不可分問題!例如這樣一些混雜在一起的點,我們就不能用直線將它們分開,這種問題的最簡單形式就是異或問題。”
屏幕上的四個點顏色再變,左下和右上的兩個點變成藍色,另兩個點變成紅色。
這時臺下一個扎著單馬尾的女生急切舉手,徐毅沖她點點頭示意可以提問。
“老師,異或不是可以用前面三種基本邏輯表示么?為什么可以學習三種基本邏輯的感知器不能表示異或?”
聽到這個問題的徐毅笑了笑,并未直接回答,反而問起其他學生,
“非常好的問題!我們都知道異或可以由兩個非門和與門再加一個或門組成,那么我們可不可以同樣用幾個感知機分別表示幾種基本邏輯,最終組成一個異或門呢?有沒有同學講一下想法……王浩中?”
看到學生紛紛陷入沉默,于是直接點名前面的小胖子。
“嗯……可能原因是由于感知機最后的非線性激活函數,從而導致多層結構的感知機無法求解?據我所知好像現在沒有類似的方法,所以這條路應該是不可行的。”
雖然徐毅提出的這個思路之前沒有想過,但憑著對機器學習的深刻理解,王浩中思索片刻后便給出了結論。
王浩中的父親是領域內的專家,在他高中時候就帶著他參與相關研究,王浩中在大二時就能以第一作者的身份發表二區論文,因此他對自己的答案有著充足的自信,挺起胸膛等著老師的回復。
“沒錯!因為在感知機中使用的激活函數是sign函數,即對于任意大于零的自變量x,我們都令函數f(x)的值為1,而對于小于等于零的x,我們令函數值為-1,這是為了模擬人的神經元工作原理……”
徐毅邊說邊在黑板上畫出了這個函數的圖像,這是被y軸分為兩段的水平線,
“可以看到,這個函數的導數在原點以外處處為零,這對于單個的感知機當然沒有問題,因為我們使用梯度下降法對w的更新方向是-yx,對b的更新方向是-y,”
徐毅在黑板上洋洋灑灑寫出一行行推導公式,繼續講道,
“但當感知機變為多層結構時,我們可以看到,由于鏈式法則,最終的損失對于前面所有輸入的梯度都為0,也就是說,當我們的感知機分類結果與實際目標產生出入時,它并不知道該往哪個方向更新自己的權重參數來減小誤差。”
“打個更直觀一點的比方,梯度下降法就是讓我們在一片空地上沿著下坡的方向走,這樣最后我們總能走到一個損失最低的點,或者至少是局部最低點,”
“但經過sign激活函數之后,我們所在的這片空地全都變成水平面了,每個方向上的梯度都是零,這就導致我們連前進的方向都確定不了,想要找到損失最低點只能每個點都走過試一下,換句話說就是遍歷整個平面,這顯然是不現實的。”
“——老師,這樣的話為什么我們不直接去掉激活函數?”
“去掉激活函數就變成用矩陣相乘表示的線性變換了,無論幾個矩陣相乘其實都可以變成兩個矩陣,這樣的多層結構和單層的表達能力完全沒有區別!”面對提問,沒等徐毅回頭,還站著的王浩中就干脆回答道。
“……沒錯,這個問題在過去的幾十年中一直未被解決,神經網絡這一構想也在提出之后很快陷入低迷,”
轉身面向講臺下,徐毅擺手示意王浩中座下,繼續播放幻燈片講道:
“當然,科學家們還是找到了其它的方法來解決這一問題,例如升維就是其中之一,”
“來看屏幕,我們可以利用核函數,把二維上的四個點放進三維空間,然后讓(0,0)(1,1)這兩個點的z坐標變成1,另外兩點坐標為0,這個時候我們就可以用感知機學習一個線性平面把它們分開。”
“這種使用核函數的感知機被稱為核感知機,由于計算的時間成本太高,核感知機在提出后很快就被淘汰,但基于這種思想進一步改良提出的SVM,也就是支持向量機,迅速發展起來并成為現在最主流的機器學習算法。”
頓了頓后,徐毅繼續說道:
“當然,這并不代表多層感知機是不可行的,根據我們之前的分析,這個結構的問題在于激活函數導致梯度無法傳播,那么我們只需要簡單地將激活函數改成這樣——”
他用粉筆在sign函數的圖像上一劃,將右側始終為1的水平線變成一道斜線,
“我們只要讓f(x)在輸入大于零時等于它本身,即導數為1,這樣梯度就可以不被截斷,”
“之前在sign函數下的一整個水平面,在新的函數下就有了不同的坡度,從而我們就可以繼續使用梯度下降的方法來尋找最低點。”
“因此我們改用這個激活函數就可以構建一個多層感知機,這樣得到的多層感知機在現在的任務上可以……”
“等等,老師!”王浩中急切地,甚至顧不上失禮地打斷道:“既然它的效果這么好,為什么我在論文里從來沒有看到過?”
“因為這是我剛剛提出來的,”
無視了臺下聞言一陣騷動的學生,徐毅反問道:
“王同學,請問你覺得我的這種方法邏輯上有什么問題么?”
王浩中不知所措地搖搖頭,徐毅老師對感知機的講解十分生動形象,深入淺出的同時又不失嚴謹,至少自己沒有聽出任何邏輯上的問題。
如果不看徐毅僅僅只有講師的職位,他甚至感覺對方在這個領域的理解都超過了自己的教授父親。
但異或問題困擾了人工智能領域這么多年,怎么可能就這么容易被面前的老師如此順理成章、輕而易舉的解決?!
一定是在別的什么地方出了問題!他正欲開口反駁,卻聽徐毅繼續道:
“實際上,多層感知機在現在的任務上可以取得媲美甚至超過SVM的效果,接下來我將展示一個簡單的多層感知機模型和相應的任務樣例,如果還有疑惑的同學也可以回去后仿照課上的講解自己進行實驗驗證……”
“雖然不知道為什么這么簡單的問題可以困擾學界幾十年,一直沒有方法解決它,”
環顧教室,徐毅平靜地說道:
“但是,現在有了。”