引言
機(jī)器學(xué)習(xí)欄目記錄我在學(xué)習(xí)Machine Learning過程的一些心得筆記,涵蓋線性回歸导街、邏輯回歸披泪、Softmax回歸、神經(jīng)網(wǎng)絡(luò)和SVM等等搬瑰,主要學(xué)習(xí)資料來自Standford Andrew Ng老師在Coursera的教程以及UFLDL Tutorial款票,同時(shí)也參考了大量網(wǎng)上的相關(guān)資料(在后面列出)。
本文主要記錄我在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)過程中的心得筆記泽论,共分為三個(gè)部分:
Neural network - Representation:神經(jīng)網(wǎng)絡(luò)的模型描述艾少;
Neural network - Learning:神經(jīng)網(wǎng)絡(luò)的模型訓(xùn)練;
Neural network - Code:神經(jīng)網(wǎng)絡(luò)的代碼實(shí)現(xiàn)翼悴。
在本文中缚够,我們將神經(jīng)網(wǎng)絡(luò)看作是一個(gè)分類算法,其輸出是樣本屬于某類別的概率值 P(y==k|x;Θ)鹦赎,暫時(shí)不去考慮深度學(xué)習(xí)中用于特征學(xué)習(xí)的復(fù)雜卷積神經(jīng)網(wǎng)絡(luò)谍椅。因此,本文將按照一個(gè)分類模型的維度去安排文章結(jié)構(gòu)古话,包括模型結(jié)構(gòu)及數(shù)學(xué)描述毯辅、模型訓(xùn)練等,記錄我在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)過程中的心得和思考煞额。
本文是我在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練(Learning)時(shí)的筆記,主要以Andrew Ng老師在Coursera課程中以及UFLDL Tutorial中的關(guān)于神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練的資料為主,文章小節(jié)安排如下:
1)神經(jīng)網(wǎng)絡(luò)的背景
2)代價(jià)函數(shù)(cost function)
3)優(yōu)化(Optimization)/模型訓(xùn)練/參數(shù)學(xué)習(xí)
4)梯度檢查(Gradient Checking)
5)隨機(jī)初始化(Random Initialization)
6)Putting It Together
7)參考資料
8)結(jié)語
在閱讀這部分筆記之前膊毁,請(qǐng)先閱讀《Neural network - Representation:神經(jīng)網(wǎng)絡(luò)的模型描述》這一篇筆記胀莹,以了解神經(jīng)網(wǎng)絡(luò)的模型描述,激活函數(shù)婚温,前向傳播等基礎(chǔ)知識(shí)描焰。
《Neural network - Representation:神經(jīng)網(wǎng)絡(luò)的模型描述》
這里重復(fù)一遍神經(jīng)網(wǎng)絡(luò)的靈感來源,
實(shí)驗(yàn)證明大腦利用同一個(gè)學(xué)習(xí)算法實(shí)現(xiàn)了聽覺栅螟、視覺等等所有的功能荆秦,這也是神經(jīng)網(wǎng)絡(luò)算法美好的愿景。
我認(rèn)為一個(gè)好的算法力图,是具備自我學(xué)習(xí)步绸、成長和進(jìn)步能力的,可以不斷的適應(yīng)問題和環(huán)境變化吃媒。同樣瓤介,一個(gè)好的人,一個(gè)好的公司赘那,一個(gè)好的國家刑桑,也應(yīng)該是具備這樣的自我成長性,所謂好的事物是長出來的募舟。
記得聽過一個(gè)講座祠斧,主講人是國外大學(xué)的一位教授,他說:Deeplearning就是入侵其他領(lǐng)域的強(qiáng)有力武器拱礁,我們課題組是做圖像的琢锋,半年前還一點(diǎn)都不懂 Natural language processing,但半年后我們就在該領(lǐng)域的頂級(jí)會(huì)議發(fā)了paper觅彰,因?yàn)槲覀冎恍枰P(guān)心Raw data和深度網(wǎng)絡(luò)模型吩蔑,至于分詞等技術(shù)我們并沒有什么工作。
這位教授說的話也許有一定夸張成分填抬,但也說明了神經(jīng)網(wǎng)絡(luò)是極具潛力的機(jī)器學(xué)習(xí)模型烛芬,可以用一套技術(shù)解決多個(gè)領(lǐng)域的問題,是不是非常類似于前述的人腦工作機(jī)制飒责?并且現(xiàn)在大家也可以看到赘娄,深度神經(jīng)網(wǎng)絡(luò)目前基本上一統(tǒng)江湖,正在逐項(xiàng)碾壓其他機(jī)器學(xué)習(xí)技術(shù)宏蛉。
這是好事遣臼,也是壞事。
神經(jīng)網(wǎng)絡(luò)模型的代價(jià)函數(shù)取決于輸出層是什么拾并,也就是說不同的應(yīng)用場(chǎng)景對(duì)應(yīng)不同的代價(jià)函數(shù)揍堰,那么進(jìn)一步的求導(dǎo)計(jì)算也就會(huì)有差異鹏浅。
例如,在Autoencoder網(wǎng)絡(luò)中屏歹,輸出層等于輸入層隐砸,此時(shí)采用均方誤差(MSE)函數(shù)作為代價(jià)函數(shù);在分類問題中蝙眶,如果輸出層采用Softmax回歸進(jìn)行分類季希,則可以直接采用Softmax回歸的代價(jià)函數(shù)作為整個(gè)神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)。如果輸出層采用Logistic regression進(jìn)行分類幽纷,那么輸出層其實(shí)就是K個(gè)Logistic regression式塌,整個(gè)網(wǎng)絡(luò)的代價(jià)函數(shù)就是這K個(gè)Logistic regression模型代價(jià)函數(shù)的加和。
1)輸出層采用Logistic Regression
其實(shí)只要理解Cost function反映的就是預(yù)測(cè)值與實(shí)際值的誤差友浸,那么完全可以根據(jù)問題自定義一個(gè)Cost function表達(dá)式峰尝。在Coursera Machine Learning課程中將神經(jīng)網(wǎng)絡(luò)看作是輸出層采用邏輯回歸的分類器,因此其代價(jià)函數(shù)如下:
對(duì)比Logistic regression:
分析可以看出尾菇,
此時(shí)境析,神經(jīng)網(wǎng)絡(luò)里使用的代價(jià)函數(shù)是邏輯回歸里中代價(jià)函數(shù)的一般化形式(generalization),也就是神經(jīng)網(wǎng)絡(luò)中不再是僅有一個(gè)邏輯回歸輸出單元派诬,而是K個(gè)(就好像K個(gè)邏輯回歸模型并行計(jì)算劳淆,也就是邏輯回歸中的多分類問題)。
2)輸出層采用Softmax Regression
其中默赂,
θ 指的是Softmax Regression的參數(shù)矩陣沛鸵。
3)Autoencoder(輸出層=輸入層)
自編碼神經(jīng)網(wǎng)絡(luò)是一種無監(jiān)督學(xué)習(xí)算法,學(xué)習(xí)一個(gè) Hw,b (x) ≈ x 的函數(shù)缆八。換句話說曲掰,它嘗試逼近一個(gè)恒等函數(shù),從而使得輸出接近于輸入奈辰。此時(shí)栏妖,自編碼神經(jīng)網(wǎng)絡(luò)采用均方誤差(MSE)作為代價(jià)函數(shù),其代價(jià)函數(shù)形式如下:
實(shí)際上奖恰,
Autoencoder并不是用于分類吊趾,而是用于學(xué)習(xí)輸入數(shù)據(jù)的壓縮表示,可以發(fā)現(xiàn)輸入數(shù)據(jù)中隱含著的一些特定結(jié)構(gòu)瑟啃。具體可以參考:Autoencoders and Sparsity
討論:
1)代價(jià)函數(shù)的均值化問題
這里均值化指的是代價(jià)函數(shù)是否除以樣本數(shù)论泛,以及代價(jià)函數(shù)中哪一項(xiàng)應(yīng)該除以樣本數(shù)的問題。
首先對(duì)比Coursera ML課程中神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)公式:
細(xì)心的同學(xué)可以看到蛹屿,
這里正則化項(xiàng)是除以樣本數(shù) m 的屁奏,而我給出的代價(jià)函數(shù)是沒有除以樣本數(shù)的,如下:
對(duì)于正則項(xiàng)是否除以樣本數(shù)這個(gè)問題错负,我作為初學(xué)者還沒有看到確切深入的討論坟瓢,并且看到的大多數(shù)資料中是沒有均值化的勇边。根據(jù)實(shí)驗(yàn),在不同的問題中折联,正則項(xiàng)是否均值化對(duì)優(yōu)化過程的影響也不一樣的粥诫,有時(shí)候可能沒有影響,有時(shí)候就會(huì)致使梯度無法收斂崭庸,這一點(diǎn)大家可以在代碼中實(shí)驗(yàn)一下。
通過引入正則項(xiàng)是否均值化問題谊囚,我想討論的其實(shí)是:代價(jià)函數(shù)是否除以樣本數(shù)(均值化)怕享?哪一項(xiàng)應(yīng)該除以樣本數(shù)?
這里我根據(jù)學(xué)習(xí)和實(shí)驗(yàn)中粗淺的經(jīng)驗(yàn)總結(jié)如下:
其實(shí)代價(jià)函數(shù)是否除以樣本數(shù)(均值化)镰踏,是整體均值化函筋?還是部分均值化?這在很多算法模型中都存在這個(gè)問題奠伪,比如在Sparse Autoencoder中跌帐,代價(jià)函數(shù)由誤差項(xiàng),權(quán)重衰減項(xiàng)(正則化項(xiàng))绊率,稀疏懲罰項(xiàng)構(gòu)成谨敛,如下:
Cost function = Error term + Sparsity penalty term + Weight decay term
那么,在具體實(shí)現(xiàn)時(shí)滤否,到底應(yīng)該如何均值化呢脸狸?
基本原則是這樣,
如果某個(gè)term與整個(gè)訓(xùn)練樣本集有關(guān)藐俺,那么就應(yīng)該均值化(除以樣本數(shù))炊甲,否則就不均值化。例如Sparse Autoencoder的代價(jià)函數(shù)欲芹,誤差項(xiàng)是所有訓(xùn)練樣本誤差的總和卿啡,稀疏懲罰項(xiàng)是對(duì)所有樣本的稀疏性懲罰,因此這兩項(xiàng)應(yīng)該均值化菱父,而權(quán)重衰減項(xiàng)是針對(duì)參數(shù)的颈娜,所以不應(yīng)該均值化。
2)什么時(shí)候采用邏輯回歸作為分類滞伟?什么時(shí)候采用Softmax回歸呢揭鳞?
這里引用UFLDL的講解:
Softmax Regression vs. k Binary Classifiers
如果你在開發(fā)一個(gè)音樂分類的應(yīng)用,需要對(duì)k種類型的音樂進(jìn)行識(shí)別梆奈,那么是選擇使用 softmax 分類器呢野崇,還是使用 logistic 回歸算法建立 k 個(gè)獨(dú)立的二元分類器呢?
這一選擇取決于你的類別之間是否互斥亩钟,例如乓梨,如果你有四個(gè)類別的音樂鳖轰,分別為:古典音樂、鄉(xiāng)村音樂扶镀、搖滾樂和爵士樂蕴侣,那么你可以假設(shè)每個(gè)訓(xùn)練樣本只會(huì)被打上一個(gè)標(biāo)簽(即:一首歌只能屬于這四種音樂類型的其中一種),此時(shí)你應(yīng)該使用類別數(shù) k = 4 的softmax回歸臭觉。(如果在你的數(shù)據(jù)集中昆雀,有的歌曲不屬于以上四類的其中任何一類,那么你可以添加一個(gè)“其他類”蝠筑,并將類別數(shù) k 設(shè)為5狞膘。)
現(xiàn)在我們來看一個(gè)計(jì)算視覺領(lǐng)域的例子,你的任務(wù)是將圖像分到三個(gè)不同類別中什乙。(i) 假設(shè)這三個(gè)類別分別是:室內(nèi)場(chǎng)景挽封、戶外城區(qū)場(chǎng)景、戶外荒野場(chǎng)景臣镣。你會(huì)使用sofmax回歸還是 3個(gè)logistic 回歸分類器呢辅愿? (ii) 現(xiàn)在假設(shè)這三個(gè)類別分別是室內(nèi)場(chǎng)景、黑白圖片忆某、包含人物的圖片点待,你又會(huì)選擇 softmax 回歸還是多個(gè) logistic 回歸分類器呢?
在第一個(gè)例子中褒繁,三個(gè)類別是互斥的亦鳞,因此更適于選擇softmax回歸分類器 。而在第二個(gè)例子中棒坏,建立三個(gè)獨(dú)立的logistic回歸分類器更加合適燕差。
3)是否懲罰偏置單元對(duì)應(yīng)的參數(shù)?
當(dāng)設(shè)置偏置單元=1坝冕,并在參數(shù)矩陣 Θ 中設(shè)置第 0 列對(duì)應(yīng)為偏置單元的參數(shù)時(shí)徒探,就存在一個(gè)問題:是否懲罰偏置單元對(duì)應(yīng)的參數(shù)?
引用Andrew Ng老師對(duì)該問題的說明:
不應(yīng)該把這些項(xiàng)加入到正規(guī)化項(xiàng)里去喂窟,因?yàn)槲覀儾⒉幌胝?guī)化這些項(xiàng)测暗,但這只是一個(gè)合理的規(guī)定,即使我們真的把他們加進(jìn)去了磨澡,也就是 i 從0 加到s(l)碗啄,這個(gè)式子(代價(jià)函數(shù))依然成立,并且不會(huì)有大的差異稳摄。這個(gè)“不把偏差項(xiàng)正規(guī)化”的規(guī)定可能只是更常見一些稚字。
一般來說是不懲罰偏置項(xiàng)的,因?yàn)闆]什么意義。
補(bǔ)充:
1)均方誤差
均方誤差(MeanSquaredError,MSE)是衡量“平均誤差”的一種較方便的方法胆描,可以評(píng)價(jià)數(shù)據(jù)的變化程度瘫想。對(duì)于等精度測(cè)量來說,還有一種更好的表示誤差的方法昌讲,就是標(biāo)準(zhǔn)誤差国夜。標(biāo)準(zhǔn)誤差定義為各測(cè)量值誤差的平方和的平均值的平方根。數(shù)理統(tǒng)計(jì)中均方誤差是指參數(shù)估計(jì)值與參數(shù)真值之差平方的期望值短绸,記為MSE车吹。MSE是衡量“平均誤差”的一種較方便的方法,MSE可以評(píng)價(jià)數(shù)據(jù)的變化程度醋闭,MSE的值越小礼搁,說明預(yù)測(cè)模型描述實(shí)驗(yàn)數(shù)據(jù)具有更好的精確度。與此相對(duì)應(yīng)的目尖,還有均方根誤差RMSE、平均絕對(duì)百分誤差等等扎运。
2)標(biāo)準(zhǔn)誤差
1瑟曲,標(biāo)準(zhǔn)誤差一般用來判定該組測(cè)量數(shù)據(jù)的可靠性,在數(shù)學(xué)上它的值等于測(cè)量值誤差的平方和的平均值的平方根豪治。
2洞拨,標(biāo)準(zhǔn)誤差在正態(tài)分布中表現(xiàn)出正態(tài)分布曲線的陡峭程度介袜,標(biāo)準(zhǔn)誤差越小捏萍,曲線越陡峭睦番,反之靶溜,曲線越平坦重窟。
3谣妻,標(biāo)準(zhǔn)誤差在實(shí)際的計(jì)算中使用的是標(biāo)準(zhǔn)誤差估算值胞锰。
4们颜,標(biāo)準(zhǔn)誤差不是實(shí)際誤差厨姚。
參考:Bing網(wǎng)典 - 標(biāo)準(zhǔn)誤差
優(yōu)化(Optimization)/模型訓(xùn)練/參數(shù)學(xué)習(xí)
前述已經(jīng)給出了神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)衅澈,下面就可以通過最小化(minimize)該代價(jià)函數(shù)來求解神經(jīng)網(wǎng)絡(luò)模型的最優(yōu)參數(shù)。
神經(jīng)網(wǎng)絡(luò)的優(yōu)化依然可以采用梯度下降法(Gradient descent)谬墙,而梯度下降法需要兩方面的計(jì)算:
1)代價(jià)函數(shù)
2)梯度
即今布,
代價(jià)函數(shù)的計(jì)算公式前面已經(jīng)給出,
J(Θ) 的梯度如何計(jì)算就需要請(qǐng)出大名鼎鼎的反向傳播算法(Backpropagation Algorithm)拭抬!
重點(diǎn):反向傳播(Backpropagation)
定義如下網(wǎng)絡(luò)部默,輸出層采用邏輯回歸:
首先,我們引入符號(hào) δ造虎,解釋如下:
代表了第 l 層的第 j 個(gè)節(jié)點(diǎn)的誤差傅蹂。
那么,各層各節(jié)點(diǎn)的error計(jì)算如下:
其中累奈,
可以看出贬派,與激勵(lì)值(activation)計(jì)算類似急但,誤差的計(jì)算也是層層傳遞的,δ3的計(jì)算依賴于δ4搞乏,δ2的計(jì)算依賴于δ3波桩。這樣一種誤差計(jì)算方式,就稱之為反向傳播(backpropagation)请敦。
以上面的網(wǎng)絡(luò)模型為例镐躲,反向傳播算法從后往前(或者說從右往左)計(jì)算,即從輸出層開始計(jì)算侍筛,并反向逐層向前計(jì)算每一層的 δ 萤皂。反向傳播法這個(gè)名字源于我們從輸出層開始計(jì)算 δ 項(xiàng),然后我們返回到上一層計(jì)算第 3 個(gè)隱藏層的 δ 項(xiàng)匣椰,接著我們?cè)偻耙徊絹碛?jì)算 δ2裆熙。所以說我們是類似于把輸出層的誤差反向傳播給了第3層,然后是再傳到第2層禽笑,這就是反向傳播的意思入录。
通過反向傳播計(jì)算的這些 δ 項(xiàng),可以非臣丫担快速的計(jì)算出所有參數(shù)的偏導(dǎo)數(shù)項(xiàng)(J(Θ) 關(guān)于 所有θ的偏導(dǎo)數(shù)項(xiàng))僚稿。
讓我們將反向傳播與前向傳播對(duì)比一下:
直觀地看,這個(gè) δ 項(xiàng)在某種程度上捕捉到了在神經(jīng)節(jié)點(diǎn)上的激勵(lì)值的誤差蟀伸。反過來理解蚀同,一個(gè)神經(jīng)節(jié)點(diǎn)的殘差也表明了該節(jié)點(diǎn)對(duì)最終輸出值的殘差產(chǎn)生了多少影響。
因此可以說啊掏,
反向傳播算法就是在逐層計(jì)算每個(gè)神經(jīng)節(jié)點(diǎn)的激勵(lì)值誤差蠢络。
備注,
上面只是一種直觀的解釋迟蜜,那么 δ 項(xiàng)到底是什么谢肾?其實(shí) δ 本質(zhì)上是代價(jià)函數(shù) J 對(duì)加權(quán)和 z 的求導(dǎo)結(jié)果。
重點(diǎn):反向傳播的直觀理解
這里引用Coursera ML課程中的描述:
重點(diǎn):關(guān)于 δ(L) 的計(jì)算
這里重點(diǎn)討論兩個(gè)問題:
1)為何上面所講的網(wǎng)絡(luò)最后一層的 δ 與其他層計(jì)算不一致小泉?
其實(shí)是一致的芦疏,
如前面所述,δ 本質(zhì)上是代價(jià)函數(shù) J 對(duì)加權(quán)和 z 的求導(dǎo)結(jié)果微姊。這里 δ(4) 是 J 對(duì) z(4) 的導(dǎo)數(shù)酸茴,δ(3) 是 J 對(duì) z(3) 的導(dǎo)數(shù),具體推導(dǎo)見后文兢交。
2)在閱讀資料時(shí)薪捍,為何最后一層(輸出層)的 δ 有各種計(jì)算方式?
比如,
再比如酪穿,
那么是什么原因?qū)е铝松厦娌煌墓叫问侥氐矢桑科鋵?shí)原因就在于所采用的代價(jià)函數(shù)和輸出層激勵(lì)函數(shù)的形式。
不同形式的代價(jià)函數(shù)和輸出層激勵(lì)函數(shù)被济,會(huì)推導(dǎo)出不同的輸出層誤差計(jì)算公式救赐!
下面我們可以利用兩種形式的代價(jià)函數(shù)進(jìn)行偏導(dǎo)數(shù)計(jì)算,驗(yàn)證上述結(jié)論只磷,如下:
1)
Cost function采用:
輸出層激勵(lì)函數(shù)(也可以稱為預(yù)測(cè)函數(shù))采用:
則 δ(L) 推導(dǎo)如下:
2)
Cost function采用:
輸出層激勵(lì)函數(shù)(也可以稱為預(yù)測(cè)函數(shù))采用:
則 δ(L) 推導(dǎo)如下:
如果经磅,
輸出層激勵(lì)函數(shù)(也可以稱為預(yù)測(cè)函數(shù))采用:
則 δ(L) 推導(dǎo)如下:
綜上可以看出,
δ(L) 的形式與代價(jià)函數(shù) J 和輸出層激勵(lì)函數(shù) g 的形式直接相關(guān)钮追。
備注预厌,
Andrew Ng老師在課程中為了降低理解難度,并沒有講明上述的推演關(guān)系元媚,而是給出一種直觀的解釋轧叽,即:δ(L) = 實(shí)際值 - 預(yù)測(cè)值。作為入門的話刊棕,這樣理解也未嘗不可犹芹。
至此,完成 δ(L) 計(jì)算的推導(dǎo)和討論鞠绰,也解答了神經(jīng)網(wǎng)絡(luò)最后一層誤差計(jì)算出現(xiàn)不同公式形式的原因,希望可以為大家提供一定參考飒焦。
如果對(duì)于上述推導(dǎo)感興趣蜈膨,請(qǐng)參考:https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learninghttp://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm
重點(diǎn):梯度計(jì)算(Gradient Computation)
在神經(jīng)網(wǎng)絡(luò)模型中,代價(jià)函數(shù) J(Θ) 關(guān)于 參數(shù) θ 的偏導(dǎo)數(shù)(partial derivative terms)/梯度計(jì)算如下:
向量化描述如下:
關(guān)于該計(jì)算公式的推導(dǎo)可以參考wiki ML中關(guān)于Neural Network: Learning一節(jié)(https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learning)牺荠。
Andrew Ng老師給出的用于計(jì)算梯度的Backpropagation Algorithm如下:
Backpropagation Algorithm
寫到這里想起來前陣子聽講座翁巍,主講人的兩句吐槽:
1)入門神經(jīng)網(wǎng)絡(luò)只要學(xué)會(huì)計(jì)算梯度就行了,其他什么概念都不需要了解休雌,比SVM簡單多了灶壶,并且想現(xiàn)在很多Toolbox連梯度都幫你計(jì)算了,你還需要做什么杈曲?你只需要配置下網(wǎng)絡(luò)結(jié)構(gòu)就可以了驰凛,代碼都不用寫,越來越?jīng)]有門檻了担扑。
2)算個(gè)梯度還搞出個(gè)什么反向傳播(Backpropagation)恰响,說到底不就是鏈?zhǔn)椒▌t(chain rule)么!現(xiàn)在人真會(huì)玩涌献,換個(gè)名詞就炒冷飯胚宦!
關(guān)于利用反向傳播算法計(jì)算梯度,可以重點(diǎn)參考:
備注,
也許有人會(huì)有疑問枢劝,反向傳播到底是用來計(jì)算梯度的井联?還是僅僅用來逐層計(jì)算誤差的?您旁?烙常,為何這里所寫的反向傳播只計(jì)算了誤差,而沒有計(jì)算梯度被冒?军掂?
確實(shí),在Coursera ML課程中昨悼,Andrew Ng老師的講解一開始告訴你說蝗锥,Backpropagation是用來反向逐層計(jì)算誤差的。而后續(xù)的講解率触,包括很多資料里所描述的BP算法又是是用來計(jì)算梯度的终议。這到底是咋回事呢?
如前所述葱蝗,反向傳播僅僅是計(jì)算過程的一個(gè)直觀上的稱呼罷了穴张,更重要的是其背后的神經(jīng)網(wǎng)絡(luò)求導(dǎo)思想,所以两曼,
無論說:反向傳播是用來逐層計(jì)算(或稱傳遞)誤差的皂甘;又或者說:反向傳播是用來計(jì)算梯度的。
其實(shí)所說所指的都是如何對(duì)神經(jīng)網(wǎng)絡(luò)的參數(shù)進(jìn)行快速求導(dǎo)這個(gè)事情悼凑。
如果非要較真兒偿枕,也許可以這樣理解前向傳播、反向傳播户辫、梯度計(jì)算之間的關(guān)系:
前向傳播和反向傳播是一種計(jì)算過程的直觀描述渐夸,而梯度是基于前向傳播得到的Activation和反向傳播得到的Error進(jìn)行計(jì)算的。
為了更清晰更方便的記憶激勵(lì)值渔欢、誤差墓塌、前向傳播、反向傳播等概念奥额,可以這樣:
前向傳播計(jì)算 a苫幢,反向傳播計(jì)算 δ,基于 a 和 δ 計(jì)算梯度垫挨。
重點(diǎn):梯度下降(Gradient Descent)
得到代價(jià)函數(shù)和梯度态坦,就可以利用梯度下降算法來求解最優(yōu)參數(shù),描述如下:
補(bǔ)充:
1)梯度棒拂、偏導(dǎo)數(shù)伞梯、方向?qū)?shù)
方向?qū)?shù):函數(shù)上某一點(diǎn)在某一方向上的導(dǎo)數(shù)值玫氢,偏導(dǎo)數(shù)就是沿著坐標(biāo)軸的方向?qū)?shù);
偏導(dǎo)數(shù):一個(gè)多變量的函數(shù)的偏導(dǎo)數(shù)谜诫,就是它關(guān)于其中一個(gè)變量的導(dǎo)數(shù)而保持其他變量恒定(相對(duì)于全導(dǎo)數(shù)漾峡,在其中所有變量都允許變化),偏導(dǎo)數(shù)反映的是函數(shù)沿坐標(biāo)軸正方向的變化率喻旷;
梯度:梯度即是某一點(diǎn)最大的方向?qū)?shù)生逸,沿梯度方向函數(shù)有最大的變化率(正向增加,逆向減少)且预;
參考:
方向?qū)?shù)和梯度
http://blog.csdn.net/wolenski/article/details/8030654
百度百科-梯度
http://baike.baidu.com/subview/454441/12503183.htm
反向傳播算法作為一個(gè)有很多細(xì)節(jié)的算法在實(shí)現(xiàn)的時(shí)候比較復(fù)雜槽袄,可能會(huì)遇到很多細(xì)小的錯(cuò)誤。所以如果把BP算法和梯度下降法或者其他優(yōu)化算法一起運(yùn)行時(shí)锋谐,可能看起來運(yùn)行正常遍尺,并且代價(jià)函數(shù)可能在每次梯度下降法迭代時(shí)都會(huì)減小,但是可能最后得到的計(jì)算結(jié)果誤差較高涮拗,更要命的是很難判斷這個(gè)錯(cuò)誤結(jié)果是哪些小錯(cuò)誤導(dǎo)致的乾戏。
解決該問題的方法是:梯度檢查 (Gradient Checking)
梯度檢查 (Gradient Checking)的思想就是通過數(shù)值近似(numerically approximately)的方式計(jì)算導(dǎo)數(shù)近似值,從而檢查導(dǎo)數(shù)計(jì)算是否正確三热。雖然數(shù)值計(jì)算方法速度很慢鼓择,但實(shí)現(xiàn)起來很容易,并且易于理解就漾,所以它可以用來驗(yàn)證例如BP算法等快速求導(dǎo)算法的正確性呐能。
如前所述,機(jī)器學(xué)習(xí)中大部分算法的核心就是代價(jià)值計(jì)算和梯度計(jì)算抑堡,因此摆出,在實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)或者其他比較復(fù)雜的模型時(shí)候,利用Gradient Checking可以檢查算法是否正確實(shí)現(xiàn)夷野。
梯度檢查 (Gradient Checking)的核心是導(dǎo)數(shù)的數(shù)值計(jì)算,公式如下:
多參數(shù)情況的公式如下:
梯度檢查 (Gradient Checking)的實(shí)現(xiàn)荣倾,
其中悯搔,
DVec:利用反向傳播算法得到的導(dǎo)數(shù),BP是一個(gè)比較有效率的計(jì)算導(dǎo)數(shù)的方法舌仍;
gradApprox:利用數(shù)值近似得到的導(dǎo)數(shù)妒貌,數(shù)值計(jì)算法速度很慢;
如果兩者相等或者近似铸豁,最多幾位小數(shù)的差距灌曙,那么就可以確信所實(shí)現(xiàn)的BP算法是正確的。
隨機(jī)初始化(Random Initialization)
當(dāng)運(yùn)行一個(gè)優(yōu)化算法(例如梯度下降算法或者其他高級(jí)優(yōu)化算法)時(shí)节芥,需要給變量 θ 設(shè)置初始值在刺。例如逆害,在梯度下降法中,需要對(duì) θ 進(jìn)行初始化(通常為全0)蚣驼,然后使用梯度下降的方法不斷最小化函數(shù) J魄幕,最終代價(jià)函數(shù) J 下降到最小。
但要注意的是颖杏,
將 θ 初始化為全 0 向量在邏輯回歸時(shí)是可行的的纯陨,但在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)是不可行的,這會(huì)使得神經(jīng)網(wǎng)絡(luò)無法學(xué)習(xí)出有價(jià)值的信息留储。
以第一層參數(shù)矩陣(權(quán)重矩陣)為例翼抠,假定有K個(gè)隱藏單元,那么神經(jīng)網(wǎng)絡(luò)的參數(shù)矩陣 Θ1 實(shí)質(zhì)上對(duì)應(yīng)著特征的K個(gè)映射函數(shù)(映射關(guān)系)获讳,如果參數(shù)全為 0阴颖,那就意味著所有映射關(guān)系都是相同的,即所有的隱藏單元都在計(jì)算相同的激勵(lì)值赔嚎,那么這樣一個(gè)具有很多隱藏單元的網(wǎng)絡(luò)結(jié)構(gòu)就是完全多余的表達(dá)膘盖,最終該網(wǎng)絡(luò)只能學(xué)到一種特征。
這種現(xiàn)象稱為:對(duì)稱權(quán)重(Symmetric ways)
解決辦法其實(shí)很簡單尤误,即:隨機(jī)初始化(Random Initialization)
描述如下:
所有權(quán)重相同的問題稱為對(duì)稱權(quán)重(Symmetric ways)侠畔,隨機(jī)初始化解決的就是如何打破這種對(duì)稱性,需要做的就是對(duì) θ 的每個(gè)值進(jìn)行初始化损晤,使其范圍在 -? 到 +? 之間软棺。
? 的取值:
Θ 的初始化:
上面已經(jīng)講解了神經(jīng)網(wǎng)絡(luò)訓(xùn)練的各個(gè)部分,綜合起來就可以得到一個(gè)最基礎(chǔ)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法的實(shí)現(xiàn)過程尤勋。
訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)算法模型喘落,第一件事就是設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu),也就是搭建網(wǎng)絡(luò)的大體框架(architecture)最冰,框架的意思是神經(jīng)元之間的連接模式瘦棋,包括,
· 網(wǎng)絡(luò)層數(shù)暖哨,主要是隱層數(shù)量赌朋;
· 每一層的節(jié)點(diǎn)個(gè)數(shù),主要是隱藏單元數(shù)量篇裁;
這里引用課程中的一張PPT來作說明:
下面總結(jié)網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)的幾點(diǎn)基本原則:
網(wǎng)絡(luò)結(jié)構(gòu)的選擇規(guī)則:
神經(jīng)網(wǎng)絡(luò)搭建時(shí)沛慢,可能會(huì)從上面PPT中所示的幾種結(jié)構(gòu)中選擇,一個(gè)默認(rèn)的規(guī)則是只使用單個(gè)隱藏層达布,即PPT中最左邊的結(jié)構(gòu)团甲,或者如果使用不止一個(gè)隱藏層的話,同樣也有一個(gè)默認(rèn)規(guī)則就是每一個(gè)隱藏層通常都應(yīng)有相同的隱藏單元數(shù)黍聂。
通常來說躺苦,PPT中左邊這個(gè)結(jié)構(gòu)是較為合理的默認(rèn)結(jié)構(gòu)身腻。
輸入層與輸出層:
對(duì)于一個(gè)用于分類的神經(jīng)網(wǎng)絡(luò),輸入層即特征圾另,輸出層即類別霸株。
Number of input units = dimension of features x(i)
Number of output units = number of classes
隱藏單元的選擇規(guī)則:
通常情況下隱藏單元越多越好,不過需要注意的是如果有大量隱藏單元集乔,那么計(jì)算量一般會(huì)比較大去件。一般來說,每個(gè)隱藏層所包含的單元數(shù)量還應(yīng)該和輸入 x 的維度相匹配扰路,也要和特征的數(shù)目匹配尤溜。
可能隱藏單元的數(shù)目和輸入特征的數(shù)量相同,或者是它的二倍或者三倍汗唱、四倍宫莱。一般來說,隱藏單元的數(shù)目取為稍大于輸入特征數(shù)目都是可以接受的哩罪。
完成上述理解授霸,便可以得到神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程,如下际插。
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程:
下面附一張Andrew Ng老師在Coursera ML課程中的PPT碘耳,來給出神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程的直觀描述:
(由于繪圖所限,這里假定代價(jià)函數(shù) J(Θ) 只有兩個(gè)參數(shù)值)
說明:
神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)J(θ)是一個(gè)非凸函數(shù)框弛,因此理論上是只能夠停留在局部最小值的位置辛辨。
———————————————————————
實(shí)際上,梯度下降算法和其他一些高級(jí)優(yōu)化方法理論上都只能使神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)收斂于局部最小值瑟枫,不過一般來講這個(gè)問題并不是什么要緊的事斗搞,因?yàn)楸M管不能保證這些優(yōu)化算法一定會(huì)得到全局最優(yōu)值,但通常來講這些算法在最小化代價(jià)函數(shù) J(θ) 的過程中還是表現(xiàn)得很不錯(cuò)的慷妙,通常能夠得到一個(gè)很小的局部最小值僻焚,雖然這不一定是全局最優(yōu)值。
UFLDL Tutorial
http://ufldl.stanford.edu/tutorial/
Coursera - Machine learning( Andrew Ng)
https://www.coursera.org/learn/machine-learning
Coursera -ML:Neural Networks: Representation
https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Representation
Coursera -ML:Neural Networks: Learning
https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learning
以上就是神經(jīng)網(wǎng)絡(luò)模型Learning的相關(guān)知識(shí)點(diǎn)和實(shí)現(xiàn)過程膝擂,其中重點(diǎn)討論了神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù)模型和參數(shù)學(xué)習(xí)中的Backpropagation算法虑啤,這也是我在學(xué)習(xí)NN時(shí)反復(fù)理解了好久的問題,希望可以為大家提供一些幫助猿挚,也歡迎交流討論咐旧,謝謝驶鹉!
本文的文字绩蜻、公式和圖形都是筆者根據(jù)所學(xué)所看的資料經(jīng)過思考后認(rèn)真整理和撰寫編制的,如有朋友轉(zhuǎn)載室埋,希望可以注明出處:
[機(jī)器學(xué)習(xí)] Coursera ML筆記 - 神經(jīng)網(wǎng)絡(luò)(Learning)