損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

機器學習 深度學習 減肥 文章 雲棲社區 2017-06-09

更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud


系列文章:

一入侯門“深”似海,深度學習深幾許(深度學習入門系列之一)

人工“碳”索意猶盡,智能“硅”來未可知(深度學習入門系列之二)

神經網絡不勝語,M-P模型似可尋(深度學習入門系列之三)

“機器學習”三重門,“中庸之道”趨若人(深度學習入門系列之四)

Hello World感知機,懂你我心才安息 (深度學習入門系列之五)

PS:以上文章均可在這裡看到:https://yq.aliyun.com/articles/96427

在上一講中,我們提到,由於感知機不能解決“異或”問題,明斯基並無惡意卻把“人工智能”打入“冷宮”二十載。而解決“異或”問題的關鍵在於,是否能解決非線性可分問題。那麼,如何來解決這個問題呢?簡單來說,就是使用更加複雜的網絡,也就說利用多層前饋網絡。在本講,我們將詳細討論這個問題。

6.1 多層網絡搞定“異或”問題

現在我們都知道,深度學習是一個包括很多隱含層的複雜網絡結構。感知機之所以當年搞不定“非線性可分”問題,也是因為相比於深度學習這個“老江湖”,是因為它“too young,too simple(太年輕,太簡單)”。當時,“感知機”剛剛誕生不久,如初生之嬰兒,你也很難期望這麼一個襁褓之娃複雜起來。

如前文所述,想解決“異或”問題,就需要讓網絡複雜起來。這是因為,複雜的網絡,表徵能力就比較強[1]。按照這個思路,我們在輸入層和輸出層之間,添加一層神經元,將其稱之為隱含層(hidden layer,亦有簡稱為“隱層”)。這樣一來,隱含層和輸出層中的神經元都擁有激活函數。假設各個神經元的閾值均為0.5,權值如圖6-1所示,就實現了“異或”功能。

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

圖6-1 可解決“異或”問題的兩層感知機

下面我們來詳述這個實現流程。假設在如圖6-1-a所示的神經元(即實心圓)的激活函數,依然是階躍函數(即sgn函數),那麼它的輸出規則很非常簡單:當x>0時,f(x)輸出為1,否則輸出0。

那麼,對於x1和x2相同(即均為1)時,對於在隱含層的神經元1有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

類似地,對於在隱含層的神經元2有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

然後,對於輸出層的輸出神經元3而言,這時f1和f2是它的輸入,於是有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

也就是說,x1和x2同為1時,輸出為0。

那麼對於x1和x2不相同(比如說,x1為1時, x2為0)時,對於在隱含層的神經元1有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

類似地,對於在隱含層的神經元2有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

然後,對於輸出層的神經元3而言,f1和f2是它的輸入,於是有:

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

不失一般性,由於x1和x2的地位是可以互換的,因此從上面分析可知,如圖6-1所示的兩層感知機,就可以實現“異或”功能。在這裡,網絡中的權值和閾值是我們事先給定的,而實際上,它們是需要神經網絡自己通過反覆地“試錯”學習而來。

讓我們再簡單回顧一下神經網絡的發展歷史。1958年,弗蘭克·羅森布拉特(Frank Rosenblatt)提出“感知機”(Perceptron)的概念。

1965年,A. G.伊瓦赫年科(Alexey Grigorevich Ivakhnenko)就提出了多層人工神經網絡的設想。而這種基於多層神經網絡的機器學習模型,後來被人們稱為“深度學習”。

簡單來說,所謂深度學習,就是包括很多隱含層的神經網絡學習。這裡的“深”即意味著“層深”(’Deep’ means many hidden layers),“網絡深深深幾許”呢?至少要大於3吧,多則不限,可以成百甚至上千。

所以,你看到了吧,如果追根溯源的話,伊瓦赫年科才是“深度學習”之父[2],而不是現在的“深度學習”大牛傑弗裡•辛頓(Geoffrey Hinton),但鑑於辛頓的傑出貢獻——是他讓“深度學習”重見天日、大放異彩。因此,稱呼辛頓為深度學習教父(Godfather of deep learning),似乎也更為合適[3]。

更需要我們玩味的是,在多層神經網絡概念提出4年之後的1969年,明斯基才寫出來他的那本“毒蘋果”之作《感知機》。也就是說,多層神經網絡在提出之後,並沒有受到應有的重視。

直到1975年(此時,距離伊瓦赫年科提出多層神經網絡概念已達10年之久了),感知機的“異或難題”才被理論界徹底解決。由此,見微知著可以看到,科學技術的發展,從而都不是線性地一蹴而就,而是呈現螺旋上升的!

我們現在學習這個“異或”解決方案,可能僅需要數分鐘,但也是“書上一分鐘,書後十年功”啊!

6.2多層前饋神經網絡

更一般地,常見的多層神經網絡如圖6-2所示。在這種結構中,每一層神經元僅僅與下一層的神經元全連接。而在同一層,神經元彼此不連接,而且跨層的神經元,彼此間也不相連。這種被簡化的神經網絡結構,被稱之為“多層前饋神經網絡(multi-layer feedforward neural networks)”。

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

圖6-2 多層前饋神經網絡結構示意圖

在多層前饋神經網絡中,輸入層神經元主要用於接收外加的輸入信息,在隱含層和輸出層中,都有內置的激活函數,可對輸入信號進行加工處理,最終的結果,由輸出層“呈現”出來。

這裡需要說明的是,神經元中的激活函數,並不限於我們前面提到的階躍函數、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 核心特徵不丟失:化成灰我都認識你

前文提到,對於相對複雜的前饋神經網絡,其各個神經元之間的鏈接權值和其內部的閾值,是整個神經網絡的靈魂所在,它需要通過反覆訓練,方可得到合適的值。而訓練的抓手,就是實際輸出值和預期輸出值之間存在著“落差”(你可以稱之為“誤差”)。

下面我們就先用一個小故事,來說明如何利用“落差”來反向調節網絡參數的。

6.3現實很豐滿,理想很骨感

說到理想和現實的“落差”時,人們常用這麼一句話來表達:“理想很豐滿,現實很骨感。”

事實上,有時候,這句話反著說,也是成立的:“現實很豐滿,理想很骨感”。你可能猜到了,我說的是“減肥”這件事。

有人開玩笑說,男人有兩大煩惱:一是把別人的肚子搞大了,二是把自己的肚子搞大了。還記得六七年前我在美國讀書時,由於美帝的物質條件太好,肉食非常便宜,所以一不小心,糟了!我把自己的肚子搞大了。

等到臨近回國的前三個月,一次無意站在體重秤上,我“驚喜”地發現,我有了——體重居然飆到可怕的200磅!

這次真的把自己都嚇到了,這該如何是好?有個古詩改編的段子,很能體現我當時的“窘境”:

瘦小離家老胖回,鄉音無改肥肉堆。

兒童相見不相識,笑問胖紙你是誰?

痛定思痛,我決定減肥(說好聽點,是健身!)。

那該如何減(健)呢?其實就一個六字祕訣:“邁開腿,管住嘴!”

從那天起,我每天從住處到巴哈伊教神廟 (Baha'i House of Worship)兩個來回,大概10公里的有氧長跑,幾乎雷打不動。你看那,藍藍的天空,青青的草坪,幽靜的小路上,總會有個胖紙正在揮汗如雨,汗流浹背,用不停止的腳步,來為過去的貪吃“贖罪”。

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

圖 6-4 損失函數?減重功能!

現在回想起來,我挺佩服自己那會的毅力。三個月下來,我減下來近50磅!

在踏上返回北京航班的前一個小時,我靜靜地坐在租住屋裡,模仿那首《再別康橋》,在自己的博客上,用兩句話總結了我的美國之旅:

“輕輕的我走了,

正如我輕輕的來;

我揮一揮手,

不帶走一兩肥肉。”

或許你會疑惑,咦,我們正在學習神經網絡咧,你吹這段過往的牛逼,是準備改行給我們推銷減肥藥嗎?

哈哈,當然不是!

因為這段往事,讓我想起了今天的主題“誤差逆傳播算法”!

這又哪跟哪啊?

別急,且聽我慢慢道來。

我們知道,在機器學習中的“有監督學習”算法裡,在假設空間中,構造一個決策函數f,對於給定的輸入X,由f(X)給出相應的輸出Y,這個實際輸出值Y和原先預期值Y’可能不一致。於是,我們需要定義一個損失函數(loss function),也有人稱之為代價函數(cost function)來度量這二者之間的“落差”程度。這個損失函數通常記作L(Y,Y)= L(Y, f(X)),為了方便起見,這個函數的值為非負數。

常見的損失函數有如下3類:

(1)0-1損失函數(0-1 loss function):

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

(2)絕對損失函數(absolute loss function)

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

(3)平方損失函數(quadratic loss function)

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

損失函數值越小,說明實際輸出和預期輸出的差值就越小,也就說明我們構建的模型越好。

對於第一類損失函數,用我自身減肥的例子很容易解釋。就是減肥目標達到沒?達到了,輸出為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)!

損失函數減肥用,神經網絡調權重(深度學習入門系列之六)

圖 6-5 “人工智能”白馬王子:傑弗裡•辛頓

BP算法非常經典,在很多領域都有著經典的應用,當時它的火爆程度在絕不輸給現在的“深度學習”。但後來大家發現,實際用起來它還是有些問題。比如說,在一個層數較多網絡中,當它的殘差反向傳播到最前面的層(即輸入層),其影響已經變得非常之小,甚至出現梯度擴散(gradient-diffusion),嚴重影響訓練精度。

其實,這也是容易理解的。因為在“信息論”中有個信息逐層缺失的說法,就是說信息在逐層處理時,信息量是不斷減少的。例如,處理A信息而得到B,那麼B所帶的信息量一定是小於A的。這個說法,再往深層次的探尋,那就是信息熵的概念了。推薦讀者閱讀一部影響我世界觀的著作《熵:一種新的世界觀》[5]。

根據熱力學第二定律我們知道,能量雖然可以轉化,但是無法100%利用。在轉化過程中,必然會有一部分能量會被浪費掉。這部分無效的能量,就是“熵”。把“熵”的概念,遷移到信息理論,它就表示“無序的程度”。

按照阮一峰先生的解讀,當一種形式的"有序化(即信息)",轉化為另一種形式的"有序化",必然伴隨產生某種程度上的"無序化(即熵)"[6]。依據這個理論,當神經網絡層數較多時(比如說大於7層),BP反向傳播算法中“誤差信息”,就會慢慢“消磨殆盡”,漸漸全部變成無序的“熵”,因此就無法指導神經網絡的參數調整了。

再後來,第二類改進方法就孕育而生了。它就是當前主流的方法,也就是“深度學習”常用的“逐層初始化”(layer-wise pre-training)訓練機制[7],不同於BP的“從後至前”的訓練參數方法,“深度學習”採取的是一種從“從前至後”的逐層訓練方法。這是後話,我們回頭再表。

6.4 小結

下面我們小結一下本章的主要知識點。首先,我們講解了如何利用多層神經網絡搞定“異或”問題的方法,然後我們用“減肥”的案例,講解了多層前饋神經網絡和損失函數的概念。

經典是永恆的,永遠值得品味。在下一講中,我們將用圖文並茂的方式,詳細講解BP算法和梯度遞減的概念,特別是這個“梯度遞減”概念,它還會深深影響“深度學習”算法。請你關注。

6.5 請你思考

通過本講的學習,請你思考如下問題:

(1)著名科技哲學家詹姆斯·卡斯在其著作《有限與無限的遊戲》[8]中指出,世界上有兩種類型的“遊戲”:“有限的遊戲”和“無限的遊戲”。有限遊戲的目的在於,贏得勝利;而無限的遊戲,卻旨在讓遊戲永遠進行下去。從神經網絡發展的起起落落中,你覺得“人工智能”的發展,是有限的遊戲呢?還是無限的?為啥?

(2)傑弗裡•辛頓先後提出的BP算法和深度學習算法,它們之間除了訓練參數的方法有不同之外,還有什麼本質上的不同呢?

【參考文獻】

[1] 周志華.機器學習.清華大學出版社.2016.2

[2] 李開復;王詠剛. 人工智能. 文化發展出版社. 2017.1

[3] Anna Tremonti. CBC. Deep Learning Godfather says machines learn like toddlers.2015.5

[4] Williams D, Hinton G. Learning representations by back-propagating errors[J]. Nature, 1986, 323(6088): 533-538.

[5] [美] 傑里米·裡夫金, 特德·霍華德. 熵:一種新的世界觀. 上海譯文出版社. 1987.2

[6] 阮一峰.熵的社會學意義. 2013.4

[7] Hinton G E, Osindero S, Teh Y W. A fast learning algorithm for deep belief nets[J]. Neural computation, 2006, 18(7): 1527-1554.

[8] 詹姆斯·卡斯. 有限與無限的遊戲.電子工業出版社. 2013.10

文章作者:張玉宏,著有《品味大數據》一書。審校:我是主題曲哥哥、阿福。

(未完待續)

相關推薦

推薦中...