最近開始看Michael Nilson的Neural Network and Deep Learning煤率,這位老兄最初是做量子物理研究的嗜闻,后來轉向了科普工作,寫了很多科學普及讀物典勇,有興趣的童鞋可以關注他的主頁:http://michaelnielsen.org/劫哼。就這本書的話,看了幾段之后感覺講得還不錯割笙,深入淺出权烧,每次有一些疑惑的地方發(fā)現后面都跟了解釋,于是決定認真地讀一下這本書伤溉,同時記錄一下讀書筆記般码。
Chapter 1
第一章主要是基于手寫數字識別這個案例介紹了神經網絡中的一些基本概念。首先是感知機(perceptrons)乱顾,這里的perceptrons我理解是一個和sigmoid neuron相對的概念板祝,即同樣是一個神經元,由輸出決定輸入走净,如果這個輸出是由輸入的線性組合決定的券时,那么這就是感知機孤里,而如果是由輸入的線性組合再加上一個sigmoid函數映射之后得到的,就是sigmoid neuron橘洞。書中作者給了一個例子捌袜。考慮你是不是要去一個節(jié)日聚會震檩,你有很多考慮因素琢蛤,比如天氣好不好,有沒有人陪抛虏,公交方不方便博其。而如果給這些因素都賦予一定的權重,那么就能夠計算得到這些因素的一個加權和迂猴,然后我們再設定一個閾值慕淡,如果加權和高于這個閾值,那么就去沸毁,如果小于就不去峰髓。這樣我們就實現了用一個模型來判斷是否去節(jié)日聚會,而這樣由加權和和閾值組成的模型就稱之為感知機息尺。
上面這個例子只涉及到一次加權和携兵,轉換到神經網絡中就相當于只涉及到了一個神經元。那如果這是一個正式的神經網絡搂誉,對應到現實當中可以是怎樣的一個邏輯呢徐紧?可以這樣思考,仍然是那三個原始輸入炭懊,天氣好不好并级,有沒有人陪,公交方不方便侮腹,但是這次這些因素并不會直接影響我的決定嘲碧,而是先影響我們班上每一個同學的決定,比如說班上有15個同學父阻,每個同學都基于上面三個條件表明自己想去的意愿愈涩,然后我(班主任)再基于同學們的意愿做出選擇,我就是那個輸出神經元加矛。
閾值與偏差:上面我們說的時候都用的是threshold(閾值)钠署,如果加權和的結果大于某一閾值就輸出1,否則輸出0荒椭。但是使用閾值有時候不太方便谐鼎,比如,我每次比較的等號兩邊的對象都不一樣,而且在變成矩陣形式的時候狸棍,我們一定是將閾值放到等號左邊然后將得到的結果與0比較身害,所以這時候用threshold的形式就不太方便,因此我們把threshold都放在等號左邊草戈,命名為bias塌鸯,來表示對加權和的一個評判標準。其實可能與其說是一個評判標準唐片,不如說就是一個仿射變換必須的偏移量丙猬,可以增加神經元的擬合能力。
以上是從加權和的角度來解釋感知機费韭,另一個感知機的解釋角度是邏輯電路茧球,實際上一個感知機神經元可以實現一個與非門,即只有11的時候是0星持,其他時候都是1抢埋,而在與非門的基礎上可以形成任何邏輯電路。那么神經網絡比邏輯電路的優(yōu)勢在哪里督暂?在于神經網絡可以自動學習權重和bias來解決問題揪垄,而這是顯式組合邏輯電路不能做到的。
感知機的問題在哪里逻翁?神經元的輸出是跳躍式的饥努,這使得我們無法通過更改權重實現輸出的漸進變化,也就是說我可能通過所謂的學習提升了識別“9”這個數字的精度八回,但是識別其他數字的精度可能發(fā)生很大的改變酷愧。(之前了解到不能解決異或問題是感知機的一個缺陷,但實際上這是單個感知機神經元的缺陷辽社,多層感知機是可以解決異或問題的,就像多個與非門結合一定能實現異或門)翘鸭。
解決這個問題的一個辦法是用sigmoid神經元替換perceptrons滴铅,這樣權重的微小變化只會引起輸出的微小變化,從而可以更好的學習(當你在某一方向上達到最優(yōu)時其他方向的狀態(tài)不會發(fā)生太大的改變就乓,從而可以使優(yōu)化的過程持續(xù)下去)汉匙。
Ex2:將一個網絡的所有神經元的激活函數都由階躍函數替換為sigmoid函數,然后把所有的權重和bias都乘上非零常數C生蚁,證明當C趨近于無窮的時候噩翠,網絡的表現會和感知機網絡的表現一樣。
解答思路:因為C趨近于無窮實際上就是讓sigmoid函數中指數冪趨近于正無窮或負無窮邦投,也就是sigmoid函數的值趨近于0或1伤锚,這就和感知機神經元一樣了。
(有時候即使激活函數是sigmoid函數志衣,也叫多層感知機)
前向神經網絡:上一層的輸入作為下一層的輸出屯援,即沒有循環(huán)猛们。對應的是循環(huán)神經網絡。
圖像分割問題:一種可能的辦法是嘗試多種分割狞洋,然后用神經網絡去識別弯淘,如果每一個結果模型的置信度都很高,那么就認為分割是正確的吉懊。
輸出層神經元個數的選擇:如果使用四個輸出神經元庐橙,意味著要用隱層的四個輸出(書中是零的四個部分)來決定二進制0中最大的一位值是什么,可是這有什么道理呢借嗽?隱藏層的輸出是0的四個部分态鳖,這些部分好像和二進制0的最大一位的值好像沒什么關系。所以使用10個神經元來代表0-9十個數字會更加合理一些淹魄。
損失函數:為什么損失函數要用平方函數而不是識別對的圖片的個數郁惜?因為個數這個函數對于權重和偏差不是光滑的,因此改變權重和偏差可能根本不會引起結果的任何改變甲锡,這使得很難知道怎么去優(yōu)化來提升模型的表現兆蕉。
梯度下降:為什么要用梯度下降?我們的目的缤沦,是要通過函數自變量在某個方向上的改變虎韵,使得函數值發(fā)生改變,并且最好是自變量改變量相同的情況下缸废,函數值的改變最大包蓝。那首先可以對函數進行泰勒展開,只取一階項企量,得到線性表達式测萎。這個式子中的一階導數對每一個點是確定的,假設要移動的距離也是一定的届巩,那么由柯西不等式可以得到當移動的方向是梯度方向時硅瞧,函數值的下降是最高的。
隨機梯度下降:原始梯度下降需要計算帶入每個樣本點后損失函數對應的項的梯度恕汇,當樣本量很多的時候腕唧,這樣計算量比較大。一個快一點的方法是每次只從中選擇一部分樣本來計算梯度瘾英。
epoch:隨機梯度下降時每次隨機選一部分樣本枣接,當所有樣本都選完一遍的時候,稱為一個epoch缺谴。
Ex2:當隨機梯度下降每次只選一個樣本的時候但惶,稱為增量或在線學習,優(yōu)點是速度快,缺點是與最優(yōu)方向可能偏離較大榆骚。
驗證集:本身測試集是有60000張圖片片拍,現在把他分成50000和10000兩部分,10000的作為驗證集妓肢,用于超參數調優(yōu)捌省。
深度神經網絡:想象我們是如何識別一個人臉的,看是否有五官碉钠。又怎么識別五官(比如眼睛)纲缓?看是否有睫毛、眼皮喊废。又怎么識別睫毛祝高?看是否有...