深度学习笔记第一门课第四周:深层神经网络
本文是吳恩達(dá)老師的深度學(xué)習(xí)課程[1]筆記部分。
作者:黃海廣[2]
主要編寫人員:黃海廣、林興木(第四所有底稿,第五課第一二周,第三周前三節(jié))、祝彥森:(第三課所有底稿)、賀志堯(第五課第三周底稿)、王翔、胡瀚文、 余笑、 鄭浩、李懷松、 朱越鵬、陳偉賀、 曹越、 路皓翔、邱牧宸、 唐天澤、 張浩、 陳志豪、 游忍、 澤霖、沈偉臣、 賈紅順、 時(shí)超、 陳哲、趙一帆、 胡瀟楊、段希、于沖、張鑫倩
參與編輯人員:黃海廣、陳康凱、石晴路、鐘博彥、向偉、嚴(yán)鳳龍、劉成 、賀志堯、段希、陳瑤、林家泳、王翔、 謝士晨、蔣鵬
備注:筆記和作業(yè)(含數(shù)據(jù)、原始作業(yè)文件)、視頻都在?github[3]中下載。
我將陸續(xù)將課程筆記發(fā)布在公眾號“機(jī)器學(xué)習(xí)初學(xué)者”,敬請關(guān)注。
第四周:深層神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks)
4.1 深層神經(jīng)網(wǎng)絡(luò)(Deep L-layer neural network)
目前為止我們學(xué)習(xí)了只有一個單獨(dú)隱藏層的神經(jīng)網(wǎng)絡(luò)的正向傳播和反向傳播,還有邏輯回歸,并且你還學(xué)到了向量化,這在隨機(jī)初始化權(quán)重時(shí)是很重要。
本周所要做的是把這些理念集合起來,就可以執(zhí)行你自己的深度神經(jīng)網(wǎng)絡(luò)。
復(fù)習(xí)下前三周的課的內(nèi)容:
邏輯回歸,結(jié)構(gòu)如下圖左邊。一個隱藏層的神經(jīng)網(wǎng)絡(luò),結(jié)構(gòu)下圖右邊:
注意,神經(jīng)網(wǎng)絡(luò)的層數(shù)是這么定義的:從左到右,由 0 開始定義,比如上邊右圖,、、,這層是第 0 層,這層左邊的隱藏層是第 1 層,由此類推。如下圖左邊是兩個隱藏層的神經(jīng)網(wǎng)絡(luò),右邊是 5 個隱藏層的神經(jīng)網(wǎng)絡(luò)。
嚴(yán)格上來說邏輯回歸也是一個一層的神經(jīng)網(wǎng)絡(luò),而上邊右圖一個深得多的模型,淺與深僅僅是指一種程度。記住以下要點(diǎn):
有一個隱藏層的神經(jīng)網(wǎng)絡(luò),就是一個兩層神經(jīng)網(wǎng)絡(luò)。記住當(dāng)我們算神經(jīng)網(wǎng)絡(luò)的層數(shù)時(shí),我們不算輸入層,我們只算隱藏層和輸出層。
但是在過去的幾年中,DLI(深度學(xué)習(xí)學(xué)院 deep learning institute)已經(jīng)意識到有一些函數(shù),只有非常深的神經(jīng)網(wǎng)絡(luò)能學(xué)會,而更淺的模型則辦不到。盡管對于任何給定的問題很難去提前預(yù)測到底需要多深的神經(jīng)網(wǎng)絡(luò),所以先去嘗試邏輯回歸,嘗試一層然后兩層隱含層,然后把隱含層的數(shù)量看做是另一個可以自由選擇大小的超參數(shù),然后再保留交叉驗(yàn)證數(shù)據(jù)上評估,或者用你的開發(fā)集來評估。
我們再看下深度學(xué)習(xí)的符號定義:
上圖是一個四層的神經(jīng)網(wǎng)絡(luò),有三個隱藏層。我們可以看到,第一層(即左邊數(shù)過去第二層,因?yàn)檩斎雽邮堑?0 層)有 5 個神經(jīng)元數(shù)目,第二層 5 個,第三層 3 個。
我們用 L 表示層數(shù),上圖:,輸入層的索引為“0”,第一個隱藏層,表示有 5 個隱藏神經(jīng)元,同理,,=(輸出單元為 1)。而輸入層,。
在不同層所擁有的神經(jīng)元的數(shù)目,對于每層l都用來記作l層激活后結(jié)果,我們會在后面看到在正向傳播時(shí),最終能你會計(jì)算出。
通過用激活函數(shù)??計(jì)算,激活函數(shù)也被索引為層數(shù),然后我們用來記作在l層計(jì)算值的權(quán)重。類似的,里的方程也一樣。
最后總結(jié)下符號約定:
輸入的特征記作,但是同樣也是 0 層的激活函數(shù),所以。
最后一層的激活函數(shù),所以是等于這個神經(jīng)網(wǎng)絡(luò)所預(yù)測的輸出結(jié)果。
4.2 前向傳播和反向傳播(Forward and backward propagation)
之前我們學(xué)習(xí)了構(gòu)成深度神經(jīng)網(wǎng)絡(luò)的基本模塊,比如每一層都有前向傳播步驟以及一個相反的反向傳播步驟,這次視頻我們講講如何實(shí)現(xiàn)這些步驟。
先講前向傳播,輸入,輸出是,緩存為;從實(shí)現(xiàn)的角度來說我們可以緩存下和,這樣更容易在不同的環(huán)節(jié)中調(diào)用函數(shù)。
所以前向傳播的步驟可以寫成:?
?
向量化實(shí)現(xiàn)過程可以寫成:?
?
前向傳播需要喂入也就是,來初始化;初始化的是第一層的輸入值。對應(yīng)于一個訓(xùn)練樣本的輸入特征,而對應(yīng)于一整個訓(xùn)練樣本的輸入特征,所以這就是這條鏈的第一個前向函數(shù)的輸入,重復(fù)這個步驟就可以從左到右計(jì)算前向傳播。
下面講反向傳播的步驟:
輸入為,輸出為,,?
所以反向傳播的步驟可以寫成:
(1)
(2)
(3)
(4)
(5)
式子(5)由式子(4)帶入式子(1)得到,前四個式子就可實(shí)現(xiàn)反向函數(shù)。
向量化實(shí)現(xiàn)過程可以寫成:
(6)
(7)
(8)
(9)
總結(jié)一下:
第一層你可能有一個ReLU激活函數(shù),第二層為另一個ReLU激活函數(shù),第三層可能是sigmoid函數(shù)(如果你做二分類的話),輸出值為,用來計(jì)算損失;這樣你就可以向后迭代進(jìn)行反向傳播求導(dǎo)來求,?,?,?,?,。在計(jì)算的時(shí)候,緩存會把?傳遞過來,然后回傳,?,可以用來計(jì)算,但我們不會使用它,這里講述了一個三層網(wǎng)絡(luò)的前向和反向傳播,還有一個細(xì)節(jié)沒講就是前向遞歸——用輸入數(shù)據(jù)來初始化,那么反向遞歸(使用Logistic回歸做二分類)——對?求導(dǎo)。
忠告:補(bǔ)補(bǔ)微積分和線性代數(shù),多推導(dǎo),多實(shí)踐。
4.3 深層網(wǎng)絡(luò)中的前向傳播(Forward propagation in a Deep Network)
跟往常一樣,我們先來看對其中一個訓(xùn)練樣本如何應(yīng)用前向傳播,之后討論向量化的版本。
第一層需要計(jì)算,(可以看做)
第二層需要計(jì)算,
以此類推,
第四層為,
前向傳播可以歸納為多次迭代,。
向量化實(shí)現(xiàn)過程可以寫成:
,?(
這里只能用一個顯式for循環(huán),從 1 到,然后一層接著一層去計(jì)算。下一節(jié)講的是避免代碼產(chǎn)生 BUG,我所做的其中一件非常重要的工作。
4.4 核對矩陣的維數(shù)(Getting your matrix dimensions right)
當(dāng)實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的時(shí)候,其中一個我常用的檢查代碼是否有錯的方法就是拿出一張紙過一遍算法中矩陣的維數(shù)。
的維度是(下一層的維數(shù),前一層的維數(shù)),即: (,);
的維度是(下一層的維數(shù),1),即:
?: (;
,:?;
和維度相同,和維度相同,且和向量化維度不變,但,以及的維度會向量化后發(fā)生變化。
向量化后:
可以看成由每一個單獨(dú)的疊加而得到,,
為訓(xùn)練集大小,所以的維度不再是,而是。
:,
在你做深度神經(jīng)網(wǎng)絡(luò)的反向傳播時(shí),一定要確認(rèn)所有的矩陣維數(shù)是前后一致的,可以大大提高代碼通過率。下一節(jié)我們講為什么深層的網(wǎng)絡(luò)在很多問題上比淺層的好。
4.5 為什么使用深層表示?(Why deep representations?)
我們都知道深度神經(jīng)網(wǎng)絡(luò)能解決好多問題,其實(shí)并不需要很大的神經(jīng)網(wǎng)絡(luò),但是得有深度,得有比較多的隱藏層,這是為什么呢?我們一起來看幾個例子來幫助理解,為什么深度神經(jīng)網(wǎng)絡(luò)會很好用。
首先,深度網(wǎng)絡(luò)在計(jì)算什么?
首先,深度網(wǎng)絡(luò)究竟在計(jì)算什么?如果你在建一個人臉識別或是人臉檢測系統(tǒng),深度神經(jīng)網(wǎng)絡(luò)所做的事就是,當(dāng)你輸入一張臉部的照片,然后你可以把深度神經(jīng)網(wǎng)絡(luò)的第一層,當(dāng)成一個特征探測器或者邊緣探測器。在這個例子里,我會建一個大概有 20 個隱藏單元的深度神經(jīng)網(wǎng)絡(luò),是怎么針對這張圖計(jì)算的。隱藏單元就是這些圖里這些小方塊(第一張大圖),舉個例子,這個小方塊(第一行第一列)就是一個隱藏單元,它會去找這張照片里“|”邊緣的方向。那么這個隱藏單元(第四行第四列),可能是在找(“—”)水平向的邊緣在哪里。之后的課程里,我們會講專門做這種識別的卷積神經(jīng)網(wǎng)絡(luò),到時(shí)候會細(xì)講,為什么小單元是這么表示的。你可以先把神經(jīng)網(wǎng)絡(luò)的第一層當(dāng)作看圖,然后去找這張照片的各個邊緣。我們可以把照片里組成邊緣的像素們放在一起看,然后它可以把被探測到的邊緣組合成面部的不同部分(第二張大圖)。比如說,可能有一個神經(jīng)元會去找眼睛的部分,另外還有別的在找鼻子的部分,然后把這許多的邊緣結(jié)合在一起,就可以開始檢測人臉的不同部分。最后再把這些部分放在一起,比如鼻子眼睛下巴,就可以識別或是探測不同的人臉(第三張大圖)。
你可以直覺上把這種神經(jīng)網(wǎng)絡(luò)的前幾層當(dāng)作探測簡單的函數(shù),比如邊緣,之后把它們跟后幾層結(jié)合在一起,那么總體上就能學(xué)習(xí)更多復(fù)雜的函數(shù)。這些圖的意義,我們在學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)的時(shí)候再深入了解。還有一個技術(shù)性的細(xì)節(jié)需要理解的是,邊緣探測器其實(shí)相對來說都是針對照片中非常小塊的面積。就像這塊(第一行第一列),都是很小的區(qū)域。面部探測器就會針對于大一些的區(qū)域,但是主要的概念是,一般你會從比較小的細(xì)節(jié)入手,比如邊緣,然后再一步步到更大更復(fù)雜的區(qū)域,比如一只眼睛或是一個鼻子,再把眼睛鼻子裝一塊組成更復(fù)雜的部分。
這種從簡單到復(fù)雜的金字塔狀表示方法或者組成方法,也可以應(yīng)用在圖像或者人臉識別以外的其他數(shù)據(jù)上。比如當(dāng)你想要建一個語音識別系統(tǒng)的時(shí)候,需要解決的就是如何可視化語音,比如你輸入一個音頻片段,那么神經(jīng)網(wǎng)絡(luò)的第一層可能就會去先開始試著探測比較低層次的音頻波形的一些特征,比如音調(diào)是變高了還是低了,分辨白噪音,咝咝咝的聲音,或者音調(diào),可以選擇這些相對程度比較低的波形特征,然后把這些波形組合在一起就能去探測聲音的基本單元。在語言學(xué)中有個概念叫做音位,比如說單詞 ca,c 的發(fā)音,“嗑”就是一個音位,a 的發(fā)音“啊”是個音位,t 的發(fā)音“特”也是個音位,有了基本的聲音單元以后,組合起來,你就能識別音頻當(dāng)中的單詞,單詞再組合起來就能識別詞組,再到完整的句子。
所以深度神經(jīng)網(wǎng)絡(luò)的這許多隱藏層中,較早的前幾層能學(xué)習(xí)一些低層次的簡單特征,等到后幾層,就能把簡單的特征結(jié)合起來,去探測更加復(fù)雜的東西。比如你錄在音頻里的單詞、詞組或是句子,然后就能運(yùn)行語音識別了。同時(shí)我們所計(jì)算的之前的幾層,也就是相對簡單的輸入函數(shù),比如圖像單元的邊緣什么的。到網(wǎng)絡(luò)中的深層時(shí),你實(shí)際上就能做很多復(fù)雜的事,比如探測面部或是探測單詞、短語或是句子。
有些人喜歡把深度神經(jīng)網(wǎng)絡(luò)和人類大腦做類比,這些神經(jīng)科學(xué)家覺得人的大腦也是先探測簡單的東西,比如你眼睛看得到的邊緣,然后組合起來才能探測復(fù)雜的物體,比如臉。這種深度學(xué)習(xí)和人類大腦的比較,有時(shí)候比較危險(xiǎn)。但是不可否認(rèn)的是,我們對大腦運(yùn)作機(jī)制的認(rèn)識很有價(jià)值,有可能大腦就是先從簡單的東西,比如邊緣著手,再組合成一個完整的復(fù)雜物體,這類簡單到復(fù)雜的過程,同樣也是其他一些深度學(xué)習(xí)的靈感來源,之后的視頻我們也會繼續(xù)聊聊人類或是生物學(xué)理解的大腦。
Small:隱藏單元的數(shù)量相對較少
Deep:隱藏層數(shù)目比較多
深層的網(wǎng)絡(luò)隱藏單元數(shù)量相對較少,隱藏層數(shù)目較多,如果淺層的網(wǎng)絡(luò)想要達(dá)到同樣的計(jì)算結(jié)果則需要指數(shù)級增長的單元數(shù)量才能達(dá)到。
另外一個,關(guān)于神經(jīng)網(wǎng)絡(luò)為何有效的理論,來源于電路理論,它和你能夠用電路元件計(jì)算哪些函數(shù)有著分不開的聯(lián)系。根據(jù)不同的基本邏輯門,譬如與門、或門、非門。在非正式的情況下,這些函數(shù)都可以用相對較小,但很深的神經(jīng)網(wǎng)絡(luò)來計(jì)算,小在這里的意思是隱藏單元的數(shù)量相對比較小,但是如果你用淺一些的神經(jīng)網(wǎng)絡(luò)計(jì)算同樣的函數(shù),也就是說在我們不能用很多隱藏層時(shí),你會需要成指數(shù)增長的單元數(shù)量才能達(dá)到同樣的計(jì)算結(jié)果。
我再來舉個例子,用沒那么正式的語言介紹這個概念。假設(shè)你想要對輸入特征計(jì)算異或或是奇偶性,你可以算,假設(shè)你有或者個特征,如果你畫一個異或的樹圖,先要計(jì)算,的異或,然后是和。技術(shù)上來說如果你只用或門,還有非門的話,你可能會需要幾層才能計(jì)算異或函數(shù),但是用相對小的電路,你應(yīng)該就可以計(jì)算異或了。然后你可以繼續(xù)建這樣的一個異或樹圖(上圖左),那么你最后會得到這樣的電路來輸出結(jié)果,,也就是輸入特征的異或,或是奇偶性,要計(jì)算異或關(guān)系。這種樹圖對應(yīng)網(wǎng)絡(luò)的深度應(yīng)該是,那么節(jié)點(diǎn)的數(shù)量和電路部件,或是門的數(shù)量并不會很大,你也不需要太多門去計(jì)算異或。
但是如果你不能使用多隱層的神經(jīng)網(wǎng)絡(luò)的話,在這個例子中隱層數(shù)為,比如你被迫只能用單隱藏層來計(jì)算的話,這里全部都指向從這些隱藏單元到后面這里,再輸出,那么要計(jì)算奇偶性,或者異或關(guān)系函數(shù)就需要這一隱層(上圖右方框部分)的單元數(shù)呈指數(shù)增長才行,因?yàn)楸举|(zhì)上來說你需要列舉耗盡種可能的配置,或是種輸入比特的配置。異或運(yùn)算的最終結(jié)果是 1 或 0,那么你最終就會需要一個隱藏層,其中單元數(shù)目隨輸入比特指數(shù)上升。精確的說應(yīng)該是個隱藏單元數(shù),也就是。
我希望這能讓你有點(diǎn)概念,意識到有很多數(shù)學(xué)函數(shù)用深度網(wǎng)絡(luò)計(jì)算比淺網(wǎng)絡(luò)要容易得多,我個人倒是認(rèn)為這種電路理論,對訓(xùn)練直覺思維沒那么有用,但這個結(jié)果人們還是經(jīng)常提到的,用來解釋為什么需要更深層的網(wǎng)絡(luò)。
除了這些原因,說實(shí)話,我認(rèn)為“深度學(xué)習(xí)”這個名字挺唬人的,這些概念以前都統(tǒng)稱為有很多隱藏層的神經(jīng)網(wǎng)絡(luò),但是深度學(xué)習(xí)聽起來多高大上,太深奧了,對么?這個詞流傳出去以后,這是神經(jīng)網(wǎng)絡(luò)的重新包裝或是多隱藏層神經(jīng)網(wǎng)絡(luò)的重新包裝,激發(fā)了大眾的想象力。拋開這些公關(guān)概念重新包裝不談,深度網(wǎng)絡(luò)確實(shí)效果不錯,有時(shí)候人們還是會按照字面意思鉆牛角尖,非要用很多隱層。但是當(dāng)我開始解決一個新問題時(shí),我通常會從logistic回歸開始,再試試一到兩個隱層,把隱藏層數(shù)量當(dāng)作參數(shù)、超參數(shù)一樣去調(diào)試,這樣去找比較合適的深度。但是近幾年以來,有一些人會趨向于使用非常非常深邃的神經(jīng)網(wǎng)絡(luò),比如好幾打的層數(shù),某些問題中只有這種網(wǎng)絡(luò)才是最佳模型。
這就是我想講的,為什么深度學(xué)習(xí)效果拔群的直覺解釋,現(xiàn)在我們來看看除了正向傳播以外,反向傳播該怎么具體實(shí)現(xiàn)。
4.6 搭建神經(jīng)網(wǎng)絡(luò)塊(Building blocks of deep neural networks)
這周的前幾個視頻和之前幾周的視頻里,你已經(jīng)看到過正向反向傳播的基礎(chǔ)組成部分了,它們也是深度神經(jīng)網(wǎng)絡(luò)的重要組成部分,現(xiàn)在我們來用它們建一個深度神經(jīng)網(wǎng)絡(luò)。
這是一個層數(shù)較少的神經(jīng)網(wǎng)絡(luò),我們選擇其中一層(方框部分),從這一層的計(jì)算著手。在第層你有參數(shù)和,正向傳播里有輸入的激活函數(shù),輸入是前一層,輸出是,我們之前講過,,那么這就是你如何從輸入走到輸出的。之后你就可以把的值緩存起來,我在這里也會把這包括在緩存中,因?yàn)榫彺娴膶σ院蟮恼蚍聪騻鞑サ牟襟E非常有用。
然后是反向步驟或者說反向傳播步驟,同樣也是第層的計(jì)算,你會需要實(shí)現(xiàn)一個函數(shù)輸入為,輸出的函數(shù)。一個小細(xì)節(jié)需要注意,輸入在這里其實(shí)是以及所緩存的值,之前計(jì)算好的值,除了輸出的值以外,也需要輸出你需要的梯度和,這是為了實(shí)現(xiàn)梯度下降學(xué)習(xí)。
這就是基本的正向步驟的結(jié)構(gòu),我把它成為稱為正向函數(shù),類似的在反向步驟中會稱為反向函數(shù)。總結(jié)起來就是,在 l 層,你會有正向函數(shù),輸入并且輸出,為了計(jì)算結(jié)果你需要用和,以及輸出到緩存的。然后用作反向傳播的反向函數(shù),是另一個函數(shù),輸入,輸出,你就會得到對激活函數(shù)的導(dǎo)數(shù),也就是希望的導(dǎo)數(shù)值。是會變的,前一層算出的激活函數(shù)導(dǎo)數(shù)。在這個方塊(第二個)里你需要和,最后你要算的是。然后這個方塊(第三個)中,這個反向函數(shù)可以計(jì)算輸出和。我會用紅色箭頭標(biāo)注標(biāo)注反向步驟,如果你們喜歡,我可以把這些箭頭涂成紅色。
然后如果實(shí)現(xiàn)了這兩個函數(shù)(正向和反向),然后神經(jīng)網(wǎng)絡(luò)的計(jì)算過程會是這樣的:
把輸入特征,放入第一層并計(jì)算第一層的激活函數(shù),用表示,你需要和來計(jì)算,之后也緩存值。之后喂到第二層,第二層里,需要用到和,你會需要計(jì)算第二層的激活函數(shù)。后面幾層以此類推,直到最后你算出了,第層的最終輸出值。在這些過程里我們緩存了所有的值,這就是正向傳播的步驟。
對反向傳播的步驟而言,我們需要算一系列的反向迭代,就是這樣反向計(jì)算梯度,你需要把的值放在這里,然后這個方塊會給我們的值,以此類推,直到我們得到和,你還可以計(jì)算多一個輸出值,就是,但這其實(shí)是你的輸入特征的導(dǎo)數(shù),并不重要,起碼對于訓(xùn)練監(jiān)督學(xué)習(xí)的權(quán)重不算重要,你可以止步于此。反向傳播步驟中也會輸出和,這會輸出和等等。目前為止你算好了所有需要的導(dǎo)數(shù),稍微填一下這個流程圖。
神經(jīng)網(wǎng)絡(luò)的一步訓(xùn)練包含了,從開始,也就是??然后經(jīng)過一系列正向傳播計(jì)算得到,之后再用輸出值計(jì)算這個(第二行最后方塊),再實(shí)現(xiàn)反向傳播。現(xiàn)在你就有所有的導(dǎo)數(shù)項(xiàng)了,也會在每一層被更新為α,也一樣,α,反向傳播就都計(jì)算完畢,我們有所有的導(dǎo)數(shù)值,那么這是神經(jīng)網(wǎng)絡(luò)一個梯度下降循環(huán)。
繼續(xù)下去之前再補(bǔ)充一個細(xì)節(jié),概念上會非常有幫助,那就是把反向函數(shù)計(jì)算出來的值緩存下來。當(dāng)你做編程練習(xí)的時(shí)候去實(shí)現(xiàn)它時(shí),你會發(fā)現(xiàn)緩存可能很方便,可以迅速得到和的值,非常方便的一個方法,在編程練習(xí)中你緩存了,還有和對吧?從實(shí)現(xiàn)角度上看,我認(rèn)為是一個很方便的方法,可以將參數(shù)復(fù)制到你在計(jì)算反向傳播時(shí)所需要的地方。好,這就是實(shí)現(xiàn)過程的細(xì)節(jié),做編程練習(xí)時(shí)會用到。
現(xiàn)在你們見過實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的基本元件,在每一層中有一個正向傳播步驟,以及對應(yīng)的反向傳播步驟,以及把信息從一步傳遞到另一步的緩存。下一個視頻我們會講解這些元件具體實(shí)現(xiàn)過程,我們來看下一個視頻吧。
4.7 參數(shù) VS 超參數(shù)(Parameters vs Hyperparameters)
想要你的深度神經(jīng)網(wǎng)絡(luò)起很好的效果,你還需要規(guī)劃好你的參數(shù)以及超參數(shù)。
什么是超參數(shù)?
比如算法中的learning rate?(學(xué)習(xí)率)、iterations(梯度下降法循環(huán)的數(shù)量)、(隱藏層數(shù)目)、(隱藏層單元數(shù)目)、choice of activation function(激活函數(shù)的選擇)都需要你來設(shè)置,這些數(shù)字實(shí)際上控制了最后的參數(shù)和的值,所以它們被稱作超參數(shù)。
實(shí)際上深度學(xué)習(xí)有很多不同的超參數(shù),之后我們也會介紹一些其他的超參數(shù),如momentum、mini batch size、regularization parameters等等。
如何尋找超參數(shù)的最優(yōu)值?
走Idea—Code—Experiment—Idea這個循環(huán),嘗試各種不同的參數(shù),實(shí)現(xiàn)模型并觀察是否成功,然后再迭代。
今天的深度學(xué)習(xí)應(yīng)用領(lǐng)域,還是很經(jīng)驗(yàn)性的過程,通常你有個想法,比如你可能大致知道一個最好的學(xué)習(xí)率值,可能說最好,我會想先試試看,然后你可以實(shí)際試一下,訓(xùn)練一下看看效果如何。然后基于嘗試的結(jié)果你會發(fā)現(xiàn),你覺得學(xué)習(xí)率設(shè)定再提高到 0.05 會比較好。如果你不確定什么值是最好的,你大可以先試試一個學(xué)習(xí)率,再看看損失函數(shù) J 的值有沒有下降。然后你可以試一試大一些的值,然后發(fā)現(xiàn)損失函數(shù)的值增加并發(fā)散了。然后可能試試其他數(shù),看結(jié)果是否下降的很快或者收斂到在更高的位置。你可能嘗試不同的并觀察損失函數(shù)這么變了,試試一組值,然后可能損失函數(shù)變成這樣,這個值會加快學(xué)習(xí)過程,并且收斂在更低的損失函數(shù)值上(箭頭標(biāo)識),我就用這個值了。
在前面幾頁中,還有很多不同的超參數(shù)。然而,當(dāng)你開始開發(fā)新應(yīng)用時(shí),預(yù)先很難確切知道,究竟超參數(shù)的最優(yōu)值應(yīng)該是什么。所以通常,你必須嘗試很多不同的值,并走這個循環(huán),試試各種參數(shù)。試試看 5 個隱藏層,這個數(shù)目的隱藏單元,實(shí)現(xiàn)模型并觀察是否成功,然后再迭代。這頁的標(biāo)題是,應(yīng)用深度學(xué)習(xí)領(lǐng)域,一個很大程度基于經(jīng)驗(yàn)的過程,憑經(jīng)驗(yàn)的過程通俗來說,就是試直到你找到合適的數(shù)值。
另一個近來深度學(xué)習(xí)的影響是它用于解決很多問題,從計(jì)算機(jī)視覺到語音識別,到自然語言處理,到很多結(jié)構(gòu)化的數(shù)據(jù)應(yīng)用,比如網(wǎng)絡(luò)廣告或是網(wǎng)頁搜索或產(chǎn)品推薦等等。我所看到過的就有很多其中一個領(lǐng)域的研究員,這些領(lǐng)域中的一個,嘗試了不同的設(shè)置,有時(shí)候這種設(shè)置超參數(shù)的直覺可以推廣,但有時(shí)又不會。所以我經(jīng)常建議人們,特別是剛開始應(yīng)用于新問題的人們,去試一定范圍的值看看結(jié)果如何。然后下一門課程,我們會用更系統(tǒng)的方法,用系統(tǒng)性的嘗試各種超參數(shù)取值。然后其次,甚至是你已經(jīng)用了很久的模型,可能你在做網(wǎng)絡(luò)廣告應(yīng)用,在你開發(fā)途中,很有可能學(xué)習(xí)率的最優(yōu)數(shù)值或是其他超參數(shù)的最優(yōu)值是會變的,所以即使你每天都在用當(dāng)前最優(yōu)的參數(shù)調(diào)試你的系統(tǒng),你還是會發(fā)現(xiàn),最優(yōu)值過一年就會變化,因?yàn)殡娔X的基礎(chǔ)設(shè)施,CPU或是GPU可能會變化很大。所以有一條經(jīng)驗(yàn)規(guī)律可能每幾個月就會變。如果你所解決的問題需要很多年時(shí)間,只要經(jīng)常試試不同的超參數(shù),勤于檢驗(yàn)結(jié)果,看看有沒有更好的超參數(shù)數(shù)值,相信你慢慢會得到設(shè)定超參數(shù)的直覺,知道你的問題最好用什么數(shù)值。
這可能的確是深度學(xué)習(xí)比較讓人不滿的一部分,也就是你必須嘗試很多次不同可能性。但參數(shù)設(shè)定這個領(lǐng)域,深度學(xué)習(xí)研究還在進(jìn)步中,所以可能過段時(shí)間就會有更好的方法決定超參數(shù)的值,也很有可能由于CPU、GPU、網(wǎng)絡(luò)和數(shù)據(jù)都在變化,這樣的指南可能只會在一段時(shí)間內(nèi)起作用,只要你不斷嘗試,并且嘗試保留交叉檢驗(yàn)或類似的檢驗(yàn)方法,然后挑一個對你的問題效果比較好的數(shù)值。
近來受深度學(xué)習(xí)影響,很多領(lǐng)域發(fā)生了變化,從計(jì)算機(jī)視覺到語音識別到自然語言處理到很多結(jié)構(gòu)化的數(shù)據(jù)應(yīng)用,比如網(wǎng)絡(luò)廣告、網(wǎng)頁搜索、產(chǎn)品推薦等等;有些同一領(lǐng)域設(shè)置超參數(shù)的直覺可以推廣,但有時(shí)又不可以,特別是那些剛開始研究新問題的人們應(yīng)該去嘗試一定范圍內(nèi)的結(jié)果如何,甚至那些用了很久的模型得學(xué)習(xí)率或是其他超參數(shù)的最優(yōu)值也有可能會改變。
在下個課程我們會用系統(tǒng)性的方法去嘗試各種超參數(shù)的取值。有一條經(jīng)驗(yàn)規(guī)律:經(jīng)常試試不同的超參數(shù),勤于檢查結(jié)果,看看有沒有更好的超參數(shù)取值,你將會得到設(shè)定超參數(shù)的直覺。
4.8 深度學(xué)習(xí)和大腦的關(guān)聯(lián)性(What does this have to do with the brain?)
深度學(xué)習(xí)和大腦有什么關(guān)聯(lián)性嗎?
關(guān)聯(lián)不大。
那么人們?yōu)槭裁磿f深度學(xué)習(xí)和大腦相關(guān)呢?
當(dāng)你在實(shí)現(xiàn)一個神經(jīng)網(wǎng)絡(luò)的時(shí)候,那些公式是你在做的東西,你會做前向傳播、反向傳播、梯度下降法,其實(shí)很難表述這些公式具體做了什么,深度學(xué)習(xí)像大腦這樣的類比其實(shí)是過度簡化了我們的大腦具體在做什么,但因?yàn)檫@種形式很簡潔,也能讓普通人更愿意公開討論,也方便新聞報(bào)道并且吸引大眾眼球,但這個類比是非常不準(zhǔn)確的。
一個神經(jīng)網(wǎng)絡(luò)的邏輯單元可以看成是對一個生物神經(jīng)元的過度簡化,但迄今為止連神經(jīng)科學(xué)家都很難解釋究竟一個神經(jīng)元能做什么,它可能是極其復(fù)雜的;它的一些功能可能真的類似logistic回歸的運(yùn)算,但單個神經(jīng)元到底在做什么目前還沒有人能夠真正可以解釋。
深度學(xué)習(xí)的確是個很好的工具來學(xué)習(xí)各種很靈活很復(fù)雜的函數(shù),學(xué)習(xí)到從到的映射,在監(jiān)督學(xué)習(xí)中學(xué)到輸入到輸出的映射。
但這個類比還是很粗略的,這是一個logistic回歸單元的sigmoid激活函數(shù),這里是一個大腦中的神經(jīng)元,圖中這個生物神經(jīng)元,也是你大腦中的一個細(xì)胞,它能接受來自其他神經(jīng)元的電信號,比如,或可能來自于其他神經(jīng)元?。其中有一個簡單的臨界計(jì)算值,如果這個神經(jīng)元突然激發(fā)了,它會讓電脈沖沿著這條長長的軸突,或者說一條導(dǎo)線傳到另一個神經(jīng)元。
所以這是一個過度簡化的對比,把一個神經(jīng)網(wǎng)絡(luò)的邏輯單元和右邊的生物神經(jīng)元對比。至今為止其實(shí)連神經(jīng)科學(xué)家們都很難解釋,究竟一個神經(jīng)元能做什么。一個小小的神經(jīng)元其實(shí)卻是極其復(fù)雜的,以至于我們無法在神經(jīng)科學(xué)的角度描述清楚,它的一些功能,可能真的是類似logistic回歸的運(yùn)算,但單個神經(jīng)元到底在做什么,目前還沒有人能夠真正解釋,大腦中的神經(jīng)元是怎么學(xué)習(xí)的,至今這仍是一個謎之過程。到底大腦是用類似于后向傳播或是梯度下降的算法,或者人類大腦的學(xué)習(xí)過程用的是完全不同的原理。
所以雖然深度學(xué)習(xí)的確是個很好的工具,能學(xué)習(xí)到各種很靈活很復(fù)雜的函數(shù)來學(xué)到從 x 到 y 的映射。在監(jiān)督學(xué)習(xí)中,學(xué)到輸入到輸出的映射,但這種和人類大腦的類比,在這個領(lǐng)域的早期也許值得一提。但現(xiàn)在這種類比已經(jīng)逐漸過時(shí)了,我自己也在盡量少用這樣的說法。
這就是神經(jīng)網(wǎng)絡(luò)和大腦的關(guān)系,我相信在計(jì)算機(jī)視覺,或其他的學(xué)科都曾受人類大腦啟發(fā),還有其他深度學(xué)習(xí)的領(lǐng)域也曾受人類大腦啟發(fā)。但是個人來講我用這個人類大腦類比的次數(shù)逐漸減少了。
參考資料
[1]
深度學(xué)習(xí)課程:?https://mooc.study.163.com/university/deeplearning_ai
[2]黃海廣:?https://github.com/fengdu78
[3]github:?https://github.com/fengdu78/deeplearning_ai_books
總結(jié)
以上是生活随笔為你收集整理的深度学习笔记第一门课第四周:深层神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习笔记第二门课 改善深层神经网络
- 下一篇: 深度学习笔记第二门课 改善深层神经网络