簡單易懂的講解深度學習(入門系列之陸)
「損失函數減肥用,神經網路調權重」
在上一講中,由於感知機不能解決「異或」問題,明斯基並無惡意卻把AI冷藏了二十載。但是解決「異或」問題,其實就是能否解決非線性可分問題。如何來解決這個問題呢???
簡單總結,其就是用更加複雜網路(利用多層前饋網路——經典的全連接前饋神經網路與BP)。接下來,我們將詳細討論該問題。
6.1 複雜網路解決「異或」問題
我們知道了深度學習是一個包括很多隱含層的複雜網路。感知機之所以當初無法解決「非線性可分」問題,是因為相比於深度學習這個複雜網路,感知機太過於簡單」。
如上所講,想解決「異或」問題,就需要使用多層網路。這是因為,多層網路可以學習更高層語義的特徵,其特徵表達能力更強。因此,我們在輸入層和輸出層之間,添加一層神經元,將其稱之為隱含層(「隱層」)。於是隱層和輸出層中的神經元都有激活函數。
假設各個神經元的閾值均為0.5,權值如圖6-1所示,就可實現「異或」功能。
圖6-1 多層網路的「異或」功能
接下來詳述整個實現過程。假設激活函數為階躍函數(sgn函數),則:當x>0時,f(x)輸出為1,反之輸出0。對於x1和x2均為1時(x1和x2相同),則隱層的神經元1為:
同理,隱層的神經元2為:
接下來,對於輸出神經元3,f1和f2則是其輸入,則有:
等同於x1和x2同為1時,輸出為0。
如果x1和x2不相同時,隱層的神經元1為:
同理得知隱層的神經元2為:
然後,對於神經元3,f1和f2是其輸入,則為:
在圖6-1中,多層網路中的權值和閾值是事先給定的,但實際中它們是需要網路通過反覆地迭代學習得到。
接下來簡單回顧下深度學習的發展史!
1958年Frank Rosenblatt提出感知機的概念。1965年Alexey Grigorevich Ivakhnenko提出了多層人工神經網路的設想。而這種基於多層神經網路的機器學習模型,後來被人們稱為「深度學習」。
如何給非專業人士講解什麼是深度學習?
6.2 多層前饋神經網路
更一般地,常見的多層神經網路如圖6-2所示。在這種結構中,每一層神經元僅僅與下一層的神經元全連接。而在同一層,神經元彼此不連接,而且跨層的神經元,彼此間也不相連。這種被簡化的神經網路結構,被稱之為「多層前饋神經網路(multi-layer feedforward neural networks)」。
在多層前饋神經網路中,輸入層神經元主要用於接收外加的輸入信息,在隱含層和輸出層中,都有內置的激活函數,可對輸入信號進行加工處理,最終的結果,由輸出層「呈現」出來。
這裡需要說明的是,神經元中的激活函數,並不限於我們前面提到的階躍函數、Sigmod函數,還可以是現在深度學習常用的ReLU(Rectified Linear Unit)和sofmax等。
簡單來說,神經網路的學習過程,就是通過根據訓練數據,來調整神經元之間的連接權值(connection weight)以及每個功能神經元的輸出閾值。換言之,神經網路需要學習的東西,就蘊含在連接權值和閾值之中。
擬人化來說,對於識別某個對象來說,神經網路中的連接權值和閾值,就是它關於這個對象的「記憶(memory)」啊!
我們知道,大腦對於事物和概念的記憶,不是存儲在某個單一的地點,而是像分散式地存在於一個巨大的神經元網路之中。
矽谷投資人王川先生認為,分散式表徵(Distributed Representation),是人工神經網路研究的一個核心思想。那什麼是分散式表徵呢?簡單來說,就是當我們表達一個概念時,神經元和概念之間不是一對一對應映射(map)存儲的,它們之間的關係是多對多。具體而言,就是一個概念可以用多個神經元共同定義表達,同時一個神經元也可以參與多個不同概念的表達,只不過所佔的權重不同罷了。
舉例來說,對於「小紅汽車」這個概念,如果用分散式特徵地表達,那麼就可能是一個神經元代表大小(形狀:小),一個神經元代表顏色(顏色:紅),還有一個神經元代表車的類別(類別:汽車)。只有當這三個神經元同時被激活時,就可以比較準確地描述我們要表達的物體。
分散式表徵表示有很多優點。其中最重要的一點,莫過於當部分神經元發生故障時,信息的表達不會出現覆滅性的破壞。比如,我們常在影視作品中看到這樣的場景,仇人相見分外眼紅,一人(A)發狠地說,「你化成灰,我都認識你(B)!」這裡並不是說B真的「化成灰」了,而是說,雖然時過境遷,物是人非,當事人B外表也變了很多(對於識別人A來說,B在其大腦中的信息存儲是殘缺的),但沒有關係,只要B的部分核心特徵還在,那A還是能夠把B認得清清楚楚、真真切切!人類的大腦還是真的厲害啊!(現在這句話,也被好端端地被玩壞了,見圖6-3)
前文提到,對於相對複雜的前饋神經網路,其各個神經元之間的鏈接權值和其內部的閾值,是整個神經網路的靈魂所在,它需要通過反覆訓練,方可得到合適的值。而訓練的抓手,就是實際輸出值和預期輸出值之間存在著「落差」(你可以稱之為「誤差」)。
下面我們就先用一個小故事,來說明如何利用「落差」來反向調節網路參數的。
6.3現實很豐滿,理想很骨感
說到理想和現實的「落差」時,人們常用這麼一句話來表達:「理想很豐滿,現實很骨感。」
事實上,有時候,這句話反著說,也是成立的:「現實很豐滿,理想很骨感」。你可能猜到了,我說的是「減肥」這件事。
有人開玩笑說,男人有兩大煩惱:一是把別人的肚子搞大了,二是把自己的肚子搞大了。還記得六七年前我在美國讀書時,由於美帝的物質條件太好,肉食非常便宜,所以一不小心,糟了!我把自己的肚子搞大了。
等到臨近回國的前三個月,一次無意站在體重秤上,我「驚喜」地發現,我有了——體重居然飆到可怕的200磅!
這次真的把自己都嚇到了,這該如何是好?有個古詩改編的段子,很能體現我當時的「窘境」:
瘦小離家老胖回,鄉音無改肥肉堆。
兒童相見不相識,笑問胖紙你是誰?
痛定思痛,我決定減肥(說好聽點,是健身!)。
那該如何減(健)呢?其實就一個六字秘訣:「邁開腿,管住嘴!」
從那天起,我每天從住處到巴哈伊教神廟 (Bahai House of Worship)兩個來回,大概10公里的有氧長跑,幾乎雷打不動。你看那,藍藍的天空,青青的草坪,幽靜的小路上,總會有個胖紙正在揮汗如雨,汗流浹背,用不停止的腳步,來為過去的貪吃「贖罪」。
現在回想起來,我挺佩服自己那會的毅力。三個月下來,我減下來近50磅!
在踏上返回北京航班的前一個小時,我靜靜地坐在租住屋裡,模仿那首《再別康橋》,在自己的博客上,用兩句話總結了我的美國之旅:
「輕輕的我走了,
正如我輕輕的來;
我揮一揮手,
不帶走一兩肥肉。」
或許你會疑惑,咦,我們正在學習神經網路咧,你吹這段過往的牛逼,是準備改行給我們推銷減肥藥嗎?
哈哈,當然不是!
因為這段往事,讓我想起了今天的主題「誤差逆傳播演算法」!
這又哪跟哪啊?
別急,且聽我慢慢道來。
我們知道,在機器學習中的「有監督學習」演算法里,在假設空間中,構造一個決策函數f,對於給定的輸入X,由f(X)給出相應的輸出Y,這個實際輸出值Y和原先預期值Y』可能不一致。於是,我們需要定義一個損失函數(loss function),也有人稱之為代價函數(cost function)來度量這二者之間的「落差」程度。這個損失函數通常記作L(Y,Y)= L(Y, f(X)),為了方便起見,這個函數的值為非負數。
常見的損失函數有:常見的損失函數。
損失函數值越小,說明實際輸出和預期輸出的差值就越小,也就說明我們構建的模型越好。
對於第一類損失函數(0-1損失),用我自身減肥的例子很容易解釋。就是減肥目標達到沒?達到了,輸出為0(沒有落差嘛),沒有達到輸出1(減肥尚未成功,胖紙還需努力!)
對於第二類損失函數(絕對損失)就更具體了。當前體重秤上讀數和減肥目標的差值,這個差值有可能為正,但還有可能為負值,比如說,減肥目標為150磅,但一不小心減肥過猛,減到140磅,這是值就是「-10」磅,為了避免這樣的正負值干擾,乾脆就取一個絕對值好了。
對於第三類損失函數(平方損失),類似於第二類。同樣達到了避免正負值干擾,但是為了計算方便(主要是為了求導),通常還會在前面加一個「1/2」,這樣一求導,指數上的「2」和「1/2」就可以相乘為「1」了:
當然,為了計算方面,還可以用對數損失函數(logarithmic loss function)。這樣做的目的,主要是便於使用最大似然估計的方法來求極值。一句話,咋樣方便咋樣來!
或許你會問,有了這些損失函數?有啥子用呢?當然有用了!因為可以用它反向配置網路中的權值(weight),讓損失(loss)最小啊。
我們都知道,神經網路學習的本質,其實就是利用「損失函數(loss function)」,來調節網路中的權重(weight)。而「減肥」的英文是「weight loss」,所以你看,我用自身減肥的案例來講這個「損失函數」,是不是很應景啊?
或許你又會說,就算應景,那神經網路的權值,到底該咋個調法咧?
總體來講,有兩大類方法比較好使。第一種方法就是「誤差反向傳播(Error Back propagation,簡稱BP)」。簡單說來,就是首先隨機設定初值,然後計算當前網路的輸出,然後根據網路輸出與預期輸出之間的差值,採用迭代的演算法,反方向地去改變前面各層的參數,直至網路收斂穩定。
這個例子說起來很抽象,我們還是用減肥的例子感性認識一下。比如說,影響減肥的兩個主要因素是「運動」和「飲食」,但它們在減肥歷程中的權值,並不瞭然。然後,如果我減肥目標是150磅,而體重秤上給出實際值是180磅,這個30磅的落差,反過來調整我「運動」和「飲食」在減肥過程中的權值(是多運動呢,還是多吃點低卡食物呢?)。
這個BP演算法,的確大名鼎鼎。它最早是由Geoffrey Hinton 和 David Rumelhart等人1986年在《Nature》(自然)雜誌上發表的論文:「Learning Representations by Back-propagating errors」中提出來的。該論文首次系統而簡潔地闡述了反向傳播演算法在神經網路模型上的應用。
BP反向傳播演算法非常好使,它直接把糾錯的運算量,降低到只和神經元數目本身成正比的程度。現在,我們可以回答上一講中提出的問答了,是哪位「王子」把人工智慧這位「白雪公主」吻醒的了。是的,沒錯,就是當前的這位「深度學習」教父傑弗里?辛頓(Geoffrey Hinton)!
BP演算法非常經典,在很多領域都有著經典的應用,當時它的火爆程度在絕不輸給現在的「深度學習」。但後來大家發現,實際用起來它還是有些問題。比如說,在一個層數較多網路中,當它的殘差反向傳播到最前面的層(即輸入層),其影響已經變得非常之小,甚至出現梯度擴散(gradient-diffusion),嚴重影響訓練精度。
卷積神經網路的反向傳播
深度學習---反向傳播的具體案例
6.4 小結
下面我們小結一下本章的主要知識點。首先,我們講解了如何利用多層神經網路搞定「異或」問題的方法,然後我們用「減肥」的案例,講解了多層前饋神經網路和損失函數的概念。
經典是永恆的,永遠值得品味。在下一講中,我們將用圖文並茂的方式,詳細講解BP演算法和梯度遞減的概念,特別是這個「梯度遞減」概念,它還會深深影響「深度學習」演算法。請你關注。
在此非常感謝張玉宏老師,他的文章得到了很多朋友的認可,希望我們支持張老師的工作,關注他,向張老師學習。他著有《品味大數據》一書。
推薦閱讀:
※人臉識別中的活體檢測
※VOT2017結果分析及CFWCR經驗分享
※OpenPose 是如何通過 500 個攝像頭跟蹤身體、讀懂人類情緒的
※【博客存檔】TensorFlow之深入理解AlexNet
TAG:深度学习DeepLearning | 计算机视觉 |