本文為史丹福大學CS231N課程的中文版內容筆記,已獲得史丹福大學課程Andrej Karpathy教授的授權翻譯與發表。大數據文摘作品,未經授權禁止轉載,轉載具體要求見文末。
機器學習培訓報名開始啦!
頂級講師課程設計
理論結合實際
更有五大福利提供
點擊文末「閱讀原文」查看詳細內容翻譯:寒小陽&龍心塵
編者按:本期文章是我們為讀者帶來斯坦福課程文章第二個系列的【斯坦福深度學習與計算機視覺課程】專題六期。文章內容為斯坦福CS231N系列,供有興趣的讀者感受、學習。
本課程的視頻翻譯也在同時進行,將在近期發布,敬請期待!
大數據文摘將陸續發布譯文和視頻,免費分享給各位讀者。
我們歡迎更多感興趣的志願者加入我們,一起交流學習。所有譯者均為志願者,如果你和我們一樣,是有能力、願分享的朋友,請加入我們。在大數據文摘後臺回復「志願者」,了解更多。
史丹福大學CS231N課程是深度學習與計算機視覺方面的經典教程,業界評價很高。之前也有國內朋友做一些零星的翻譯,為了與更多讀者分享高品質內容,大數據文摘對其進行了系統全面的翻譯,後續內容將陸續推出。
由於微信後臺的代碼編輯無法實現,我們採用了圖片插入的方式展示代碼,點擊圖片可查看更清晰的圖片。
同時,大數據文摘之前已獲得授權的斯坦福課程第一個系列史丹福大學CS224d課程【機器學習與自然語言處理】已經完成了八個課時,我們將在每個周三繼續推送後續筆記及課程視頻,敬請關注。
回復「斯坦福」下載CS231N系列相關資料
同時獲得斯坦福另一個系列課程CS224d深度學習與自然語言處理的相關資料
此外,對於有興趣進一步學習交流的讀者,我們將通過QQ群(鑑於微信人數限制問題)組織進行學習交流。
長按以下二維碼將直接跳轉至QQ加群
或者通過群號碼285273721進群
◆ ◆ ◆前言
大家都知道最開始深度學習與神經網絡,是受人腦的神經元啟發設計出來的。所以我們按照慣例也交代一下背景,從生物學的角度開始介紹,當然也是對神經網絡研究的先驅們致一下敬。
◆ ◆ ◆神經元與含義 1. 神經元激勵與連接
大家都知道,人腦的基本計算單元叫做神經元。現代生物學表明,人的神經系統中大概有860億神經元,而這數量巨大的神經元之間大約是通過個突觸連接起來的。下面有一幅示意圖,粗略地描繪了一下人體神經元與我們簡化過後的數學模型。每個神經元都從樹突接受信號,同時順著某個軸突傳遞信號。而每個神經元都有很多軸突和其他的神經元樹突連接。而我們可以看到右邊簡化的神經元計算模型中,信號也是順著軸突(比如)傳遞,然後在軸突處受到激勵(倍)然後變成。我們可以這麼理解這個模型:在信號的傳導過程中,突觸可以控制傳導到下一個神經元的信號強弱(數學模型中的權重),而這種強弱是可以學習到的。在基本生物模型中,樹突傳導信號到神經元細胞,然後這些信號被加和在一塊兒了,如果加和的結果被神經元感知超過了某種閾值,那麼神經元就被激活,同時沿著軸突向下一個神經元傳導信號。在我們簡化的數學計算模型中,我們假定有一個『激勵函數』來控制加和的結果對神經元的刺激程度,從而控制著是否激活神經元和向後傳導信號。比如說,我們在邏輯回歸中用到的sigmoid函數就是一種激勵函數,因為對於求和的結果輸入,sigmoid函數總會輸出一個0-1之間的值,我們可以認為這個值表明信號的強度、或者神經元被激活和傳導信號的概率。
下面是一個簡單的程序例子,表明前向傳播中單個神經元做的事情:
稍加解釋,每個神經元對於輸入和權重做內積,加上偏移量bias,然後通過激勵函數(比如說這裡是sigmoid函數),然後輸出結果。特別說明:實際生物體內的神經元相當複雜,比如說,神經元的種類就灰常灰常多,它們分別有不同的功能。而加和信號之後的激勵函數的非線性變換,也比數學上模擬出來的函數複雜得多。我們用數學建模的神經網絡只是一個非常簡化後的模型,有興趣的話你可以閱讀材料1或者材料2。
2. 單個神經元的分類作用以sigmoid函數作為神經元的激勵函數為例,這個大家可能稍微熟悉一點,畢竟我們邏輯回歸部分重點提到了這個非線性的函數,把輸入值壓縮成0-1之間的一個概率值。而通過這個非線性映射和設定的閾值,我們可以把空間切分開,分別對應正樣本區域和負樣本區域。而對應回現在的神經元場景,我們如果稍加擬人化,可以認為神經元具備了喜歡(概率接近1)和不喜歡(概率接近0)線性劃分的某個空間區域的能力。這也就是說,只要調整好權重,單個神經元可以對空間做線性分割。
二值Softmax分類器
對於Softmax分類器詳細的內容歡迎參見前面的博文系列,我們標記為sigmoid映射函數,則可視作二分類問題中屬於某個類的概率,當然,這樣我們也可以得到相反的那個類別的概率為。根據前面博文提到的知識,我們可以使用交叉熵損失作為這個二值線性分類器的損失函數(loss function),而最優化損失函數得到的一組參數,就能幫助我們將空間線性分割,得到二值分類器。當然,和邏輯回歸中看到的一樣,最後神經元預測的結果y值如果大於0.5,那我們會判定它屬於這個類別,反之則屬於另外一個類別。
二值SVM分類器
同樣的,我們可以設定max-margin hinge loss作為損失函數,從而將神經元訓練成一個二值支持向量機分類器。詳細的內容依舊歡迎大家查看之前的博客。
對於正則化的解釋
對於正則化的損失函數(不管是SVM還是Softmax),其實我們在神經元的生物特性上都能找到對應的解釋,我們可以將其(正則化項的作用)視作信號在神經元傳遞過程中的逐步淡化/衰減(gradual forgetting),因為正則化項的作用是在每次迭代過程中,控制住權重
的幅度,往0上靠攏。
單個神經元的作用,可視作完成一個二分類的分類器(比如Softmax或者SVM分類器)
3 .常用激勵函數
每一次輸入和權重w線性組合之後,都會通過一個激勵函數(也可以叫做非線性激勵函數),經非線性變換後輸出。實際的神經網絡中有一些可選的激勵函數,我們一一說明一下最常見的幾種:
3.1 sigmoid
3.2 Tanh
Tanh函數的圖像如上圖所示。它會將輸入值壓縮至-1到1之間,當然,它同樣也有sigmoid函數裡說到的第一個缺點,在很大或者很小的輸入值下,神經元很容易飽和。但是它緩解了第二個缺點,它的輸出是0中心化的。所以在實際應用中,tanh激勵函數還是比sigmoid要用的多一些的。
3.3 ReLU
ReLU是修正線性單元(The Rectified Linear Unit)的簡稱,近些年使用的非常多,圖像如上圖所示。它對於輸入x計算換言之,以0為分界線,左側都為0,右側是y=x這條直線。
它有它對應的優勢,也有缺點:
優點1:實驗表明,它的使用,相對於sigmoid和tanh,可以非常大程度地提升隨機梯度下降的收斂速度。不過有意思的是,很多人說,這個結果的原因是它是線性的,而不像sigmoid和tanh一樣是非線性的。具體的收斂速度結果對比如下圖,收斂速度大概能快上6倍:
優點2:相對於tanh和sigmoid激勵神經元,求梯度不要簡單太多好麼!!!畢竟,是線性的嘛。。。
缺點1:ReLU單元也有它的缺點,在訓練過程中,它其實挺脆弱的,有時候甚至會掛掉。舉個例子說吧,如果一個很大的梯度流經ReLU單元,那權重的更新結果可能是,在此之後任何的數據點都沒有辦法再激活它了。一旦這種情況發生,那本應經這個ReLU回傳的梯度,將永遠變為0。當然,這和參數設置有關係,所以我們要特別小心,再舉個實際的例子哈,如果學習速率被設的太高,結果你會發現,訓練的過程中可能有高達40%的ReLU單元都掛掉了。所以我們要小心設定初始的學習率等參數,在一定程度上控制這個問題。
3.4 Leaky ReLU
上面不是提到ReLU單元的弱點了嘛,所以孜孜不倦的ML researcher們,就嘗試修復這個問題咯,他們做了這麼一件事,在x<0的部分,leaky ReLU不再讓y的取值為0了,而是也設定為一個坡度很小(比如斜率0.01)的直線。f(x)因此是一個分段函數,x<0時,,(是一個很小的常數),x>0時,。有一些researcher們說這樣一個形式的激勵函數幫助他們取得更好的效果,不過似乎並不是每次都比ReLU有優勢。
3.5 Maxout也有一些其他的激勵函數,它們並不是對做非線性映射
4 激勵函數/神經元小總結
。一個近些年非常popular的激勵函數是Maxout(詳細內容請參見Maxout)。簡單說來,它是ReLU和Leaky ReLU的一個泛化版本。對於輸入x,Maxout神經元計算。有意思的是,如果你仔細觀察,你會發現ReLU和Leaky ReLU都是它的一個特殊形式(比如ReLU,你只需要把設置為0)。因此Maxout神經元繼承了ReLU單元的優點,同時又沒有『一不小心就掛了』的擔憂。如果要說缺點的話,你也看到了,相比之於ReLU,因為有2次線性映射運算,因此計算量也double了。以上就是我們總結的常用的神經元和激勵函數類型。順便說一句,即使從計算和訓練的角度看來是可行的,實際應用中,其實我們很少會把多種激勵函數混在一起使用。
那我們咋選用神經元/激勵函數呢?一般說來,用的最多的依舊是ReLU,但是我們確實得小心設定學習率,同時在訓練過程中,還得時不時看看神經元此時的狀態(是否還『活著』)。當然,如果你非常擔心神經元訓練過程中掛掉,你可以試試Leaky ReLU和Maxout。額,少用sigmoid老古董吧,有興趣倒是可以試試tanh,不過話說回來,通常狀況下,它的效果不如ReLU/Maxout。
◆ ◆ ◆神經網絡結構
1. 層級連接結構神經網絡的結構其實之前也提過,是一種單向的層級連接結構,每一層可能有多個神經元。再形象一點說,就是每一層的輸出將會作為下一層的輸入數據,當然,這個圖一定是沒有循環的,不然數據流就有點混亂了。一般情況下,單層內的這些神經元之間是沒有連接的。最常見的一種神經網絡結構就是全連接層級神經網絡,也就是相鄰兩層之間,每個神經元和每個神經元都是相連的,單層內的神經元之間是沒有關聯的。下面是兩個全連接層級神經網的示意圖:
命名習俗
有一點需要注意,我們再說N層神經網絡的時候,通常的習慣是不把輸入層計算在內,因此輸入層直接連接輸出層的,叫做單層神經網絡。從這個角度上說,其實我們的邏輯回歸和SVM是單層神經網絡的特例。上圖中兩個神經網絡分別是2層和3層的神經網絡。
輸出層
輸出層是神經網絡中比較特殊的一層,由於輸出的內容通常是各類別的打分/概率(在分類問題中),我們通常都不在輸出層神經元中加激勵函數。
關於神經網絡中的組件個數
通常我們在確定一個神經網絡的時候,有幾個描述神經網絡大小的參數會提及到。最常見的兩個是神經元個數,以及細化一點說,我們可以認為是參數的個數。還是拿上面的圖舉例:
給大家個具體的概念哈,現在實用的卷積神經網,大概有億級別的參數,甚至可能有10-20層(因此是深度學習嘛)。不過不用擔心這麼多參數的訓練問題,因此我們在卷積神經網裡會有一些有效的方法,來共享參數,從而減少需要訓練的量。
2.神經網絡的前向計算示例神經網絡組織成以上的結構,一個重要的原因是,每一層到下一層的計算可以很方便地表示成矩陣之間的運算,就是一直重複權重和輸入做內積後經過激勵函數變換的過程。為了形象一點說明,我們還舉上面的3層神經網絡為例,輸入是一個3*1的向量,而層和層之間的連接權重可以看做一個矩陣,比如第一個隱藏層的權重是一個[4*3]的矩陣,偏移量是[4*1]的向量,因此用python中的numpy做內積操作np.dot(W1,x)實際上就計算出輸入下一層的激勵函數之前的結果,經激勵函數作用之後的結果又作為新的輸出。用簡單的代碼表示如下:
上述代碼中,W1,W2,W3,b1,b2,b3都是待學習的神經網絡參數。注意到我們這裡所有的運算都是向量化/矩陣化之後的,x不再是一個數,而是包含訓練集中一個batch的輸入,這樣並行運算會加快計算的速度,仔細看代碼,最後一層是沒有經過激勵函數,直接輸出的。
3. 神經網絡的表達力與size一個神經網絡結構搭起來之後,它就包含了數以億計的參數和函數。我們可以把它看做對輸入的做了一個很複雜的函數映射,得到最後的結果用於完成空間的分割(分類問題中)。那我們的參數對於這個所謂的複雜映射有什麼樣的影響呢?
其實,包含一個隱藏層(2層神經網絡)的神經網絡已經具備大家期待的能力,即只要隱藏層的神經元個數足夠,我們總能用它(2層神經網絡)去逼近任何連續函數(即輸入到輸出的映射關係)。詳細的內容可以參加Approximation by Superpositions of Sigmoidal Function或者Michael Nielsen的介紹。我們之前的博文手把手入門神經網絡系列(1)_從初等數學的角度初探神經網絡也有提到。
問題是,如果單隱藏層的神經網絡已經可以近似逼近任意的連續值函數,那麼為什麼我們還要用那麼多層呢?很可惜的是,即使數學上我們可以用2層神經網近似幾乎所有函數,但在實際的工程實踐中,卻是沒啥大作用的。多隱藏層的神經網絡比單隱藏層的神經網絡工程效果好很多,即使從數學上看,表達能力應該是一致的。
不過還得說一句的是,通常情況下,我們工程中發現,3層神經網絡效果優於2層神經網絡,但是如果把層數再不斷增加(4,5,6層),對最後結果的幫助就沒有那麼大的跳變了。不過在卷積神經網上還是不一樣的,深層的網絡結構對於它的準確率有很大的幫助,直觀理解的方式是,圖像是一種深層的結構化數據,因此深層的卷積神經網絡能夠更準確地把這些層級信息表達出來。
4. 層數與參數設定的影響一個很現實的問題是,我們拿到一個實際問題的時候,怎麼知道應該如何去搭建一個網絡結構,可以最好地解決這個問題?應該搭建幾層?每一層又應該有多少個神經元?
我們直觀理解一下這個問題,當我們加大層數以及每一層的神經元個數的時候,我們的神經網絡容量變大了。更通俗一點說,神經網絡的空間表達能力變得更豐富了。放到一個具體的例子裡我們看看,假如我們現在要處理一個2分類問題,輸入是2維的,我們訓練3個不同神經元個數的單隱層神經網絡,它們的平面表達能力對比畫出來如下:
在上圖中,我們可以看出來,更多的神經元,讓神經網絡有更好的擬合複雜空間函數的能力。但是任何事物都有雙面性,擬合越來越精確帶來的另外一個問題是,太容易過擬合了!!!,如果你很任性地做一個實驗,在隱藏層中放入20個神經元,那對於上圖這個一個平面,你完全可以做到100%把兩類點分隔開,但是這樣一個分類器太努力地學習和記住我們現在圖上的這些點的分布狀況了,以至於連噪聲和離群點都被它學習下來了,這對於我們在新數據上的泛化能力,也是一個噩夢。
經我們上面的討論之後,也許你會覺得,好像對於不那麼複雜的問題,我們用更少數目的層數和神經元,會更不容易過擬合,效果好一些。但是這個想法是錯誤的!!!。永遠不要用減少層數和神經元的方法來緩解過擬合!!!這會極大影響神經網絡的表達能力!!!我們有其他的方法,比如說之前一直提到的正則化來緩解這個問題。
不要使用少層少神經元的簡單神經網絡的另外一個原因是,其實我們用梯度下降等方法,在這種簡單神經網上,更難訓練得到合適的參數結果。對,你會和我說,簡單神經網絡的損失函數有更少的局部最低點,應該更好收斂。是的,確實是的,更好收斂,但是很快收斂到的這些個局部最低點,通常都是全局很差的。相反,大的神經網絡,確實損失函數有更多的局部最低點,但是這些局部最低點,相對於上面的局部最低點,在實際中效果卻更好一些。對於非凸的函數,我們很難從數學上給出100%精準的性質證明,大家要是感興趣的話,可以參考論文The Loss Surfaces of Multilayer Networks。
如果你願意做多次實驗,會發現,訓練小的神經網絡,最後的損失函數收斂到的最小值變動非常大。這意味著,如果你運氣夠好,那你maybe能找到一組相對較為合適的參數,但大多數情況下,你得到的參數只是在一個不太好的局部最低點上的。相反,大的神經網絡,依舊不能保證收斂到最小的全局最低點,但是眾多的局部最低點,都有相差不太大的效果,這意味著你不需要藉助"運氣"也能找到一個近似較優的參數組。
最後,我們提一下正則化,我們說了要用正則化來控制過擬合問題。正則話的參數是,它的大小體現我們對參數搜索空間的限制,設置小的話,參數可變動範圍大,同時更可能過擬合,設置太大的話,對參數的抑制作用太強,以至於不太能很好地表徵類別分布了。下圖是我們在上個問題中,使用不同大小的正則化參數得到的平面分割結果。
恩,總之一句話,我們在很多實際問題中,還是得使用多層多神經元的大神經網絡,而使用正則化來減緩過擬合現象。
◆ ◆ ◆ 其他參考資料Theano的深度學習導讀
Michael Nielsen的神經網絡導論
ConvNetJS demo
參考資料與原文http://cs231n.github.io/neural-networks-1/
如需轉載,請在開篇顯著位置註明作者和出處(轉自:大數據文摘|bigdatadigest),並在文章結尾放置大數據文摘醒目二維碼。無原創標識文章請按照轉載要求編輯,可直接轉載,轉載後請將轉載連結發送給我們;有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】給我們申請白名單授權。未經許可的轉載以及改編者,我們將依法追究其法律責任。聯繫郵箱:zz@bigdatadigest.cn。
◆ ◆ ◆大數據文章斯坦福深度學習課程
大數據文摘後臺回復「志願者」,了解如何加入我們
專欄主編
項目管理
內容運營:魏子敏
統籌:汪德誠
往期精彩文章推薦,點擊圖片可閱讀
【又一重磅】再獲翻譯授權,斯坦福CS231N深度學習與計算機視
斯坦福深度學習課程第七彈:RNN,GRU與LSTM
斯坦福CS231N深度學習與計算機視覺第二彈:圖像分類與KNN