《神经⽹络与深度学习》-自学笔记01
最近在工作中遇到一個用傳統(tǒng)的規(guī)則模型無法很好解決的問題,于是才又想起了人工神經(jīng)網(wǎng)絡。終于在好奇心的驅使下,在網(wǎng)上找到了這本很多程序員都推薦的機器學習入門書籍《神經(jīng)?絡與深度學習》(英文書名:Neural Networks and Deep Learning),作者Michael Nielsen。
目前這本書有團隊已經(jīng)翻成中文了,更加方便學習,知乎上的鏈結,跳轉前麻煩雙擊屏幕給點贊:
紅色石頭:火爆網(wǎng)絡的《神經(jīng)網(wǎng)絡與深度學習》,有人把它翻譯成了中文版!再推薦一本復旦大學邱錫鵬教授寫的入門的書籍,中文書名居然完全相同,也叫《神經(jīng)?絡與深度學習》。想學習更完整知識體系的朋友可以看看,書中還有貼心總結的“數(shù)學基礎”章節(jié),適合需要補習數(shù)學原理的朋友。
在自己推導反向傳播公式的時候,發(fā)現(xiàn)知乎上的一本電子書非常棒,每一步推導都寫得有理有據(jù)。而且還配有詳細的圖解,非常適合初學神經(jīng)網(wǎng)絡的小白。
這里與大家分享一下,自學《Neural Networks and Deep Learning》第一、二章的過程。
一、學習準備
全書的例子都是用python寫的,開始看書前第一件事情就是把github的倉庫拉到本地:
https://github.com/mnielsen/neural-networks-and-deep-learning作者還推薦一個兼容python3.5版本的github倉庫地址,我們就以python3.5為例子:
https://github.com/MichalDanielDobrzanski/DeepLearningPython352. 在linux上安裝python3.5
首先,在ubuntu下安裝python3
sudo apt-get install python3但這樣只安裝了python3.4,要想使用python3.5,則必須升級python3.4
sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update sudo apt-get install python3.5使用以上三行命令便可升級python3.4到python3.5。注意,在啟動時需要命令行輸入python3.5。
3. 安裝numpy
apt-get安裝的pyhton3.5中自帶了pip,可以通過下面命令訪問:
python3.5 -m pip -V pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.5)但是pip的版本太老了,需要更新一下
python3.5 -m pip install --upgrade pip Downloading/unpacking pip from https://files.pythonhosted.org/packages/36/74/38c2410d688ac7b48afa07d413674afc1f903c1c1f854de51dc8eb2367a5/pip-20.2-py2.py3-none-any.whl#sha256=d75f1fc98262dabf74656245c509213a5d0f52137e40e8f8ed5cc256ddd02923Downloading pip-20.2-py2.py3-none-any.whl (1.5MB): 1.5MB downloaded Installing collected packages: pipFound existing installation: pip 1.5.4Not uninstalling pip at /usr/lib/python3/dist-packages, owned by OS Successfully installed pip Cleaning up...pip默認安裝包是從網(wǎng)站https://pypi.org/simple下載,我們可以將其改成國內的鏡像網(wǎng)站,加速下載過程,下面以安裝numpy庫為例:
# 清華鏡像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy如果運行時報錯,使用上述方案繼續(xù)安裝需要的庫。
二、運行python代碼
先按照書上的方法,把代碼跑一遍先有個感觀上的認識。其中mnist_loader主要加載訓練和測試數(shù)據(jù),network主要實現(xiàn)神經(jīng)網(wǎng)絡的初始化和訓練及測試。輸出的結果就是每次學習迭代后,使用10000個測試數(shù)據(jù)的正確率。
#python3.5 >>> import mnist_loader >>> training_data, validation_data, test_data = mnist_loader.load_data_wrapper() >>> import network >>> net=network.Network([784,30,10]) >>> net.SGD(training_data, 30, 10, 3.0, test_data=test_data) Epoch 0 : 9108 / 10000 Epoch 1 : 9309 / 10000 Epoch 2 : 9371 / 10000 Epoch 3 : 9392 / 10000 Epoch 4 : 9405 / 10000 Epoch 5 : 9404 / 10000 Epoch 6 : 9449 / 10000 Epoch 7 : 9410 / 10000 Epoch 8 : 9434 / 10000 Epoch 9 : 9475 / 10000 Epoch 10 : 9460 / 10000 Epoch 11 : 9494 / 10000 Epoch 12 : 9473 / 10000 Epoch 13 : 9479 / 10000 Epoch 14 : 9468 / 10000 Epoch 15 : 9496 / 10000 Epoch 16 : 9472 / 10000 Epoch 17 : 9489 / 10000 Epoch 18 : 9497 / 10000 Epoch 19 : 9488 / 10000 Epoch 20 : 9496 / 10000 Epoch 21 : 9502 / 10000 Epoch 22 : 9486 / 10000 Epoch 23 : 9486 / 10000 Epoch 24 : 9489 / 10000 Epoch 25 : 9501 / 10000 Epoch 26 : 9501 / 10000 Epoch 27 : 9498 / 10000 Epoch 28 : 9489 / 10000 Epoch 29 : 9497 / 10000三、感受
看完第一、二章之后,感覺入門的難點主要是:
- 矩陣相關的加、減、乘和除
- 導數(shù)、偏導數(shù)、梯度和微分
2. 反向傳播的數(shù)學公式推導,理解單元素公式轉變成向量化公式的過程
3. python知識
- python內置函數(shù):zip
- numpy庫相關的函數(shù)
- 向量化代碼
- 理解如何從傳統(tǒng)編程語言對每個元素操作,轉變成使用numpy庫的向量化編程風格
四、分享自學過程
1、前向傳播
使用權重ω和偏置b沿前饋方向計算每個神經(jīng)元的激活輸出神經(jīng)網(wǎng)絡為[2,3,1]下面是根據(jù)示意圖進行的過程計算:
1.1 元素化計算過程
第一層,輸入:
[[x1],[x2]]第一層到第二層權重:
[[ω211, ω212],[ω221, ω222],[ω231, ω232]]第二層偏置:
[[b21],[b22],[b23]]第二層激活輸出:
[[σ(x1*ω211+x2*ω212+b21)],[σ(x1*ω221+x2*ω222+b22)],[σ(x1*ω231+x2*w232+b23)]]第二層到第三層權重:
[[ω311, ω312, ω313]]第三層偏置:
[[b33]]第三層激活輸出:
[[σ(σ(x1*ω211+x2*ω212+b21)*ω311+ σ(x1*ω221+x2*ω222+b22)*ω312 + σ(x1*ω231+x2*w232+b23)*ω313 + b33)]]1.2 向量化計算過程:
第一層輸入:X,shape(2,1) 第一層到第二層的權重:W21, shape(3,2) 第二層偏置:B2, shape(3,1) 第二層激活輸出: σ(W21*X+B2),注意矩陣的shape(3,1) 第二層到第三層權重:W32, shape(1,3) 第三層偏置:B3, shape(1,1) 第三層激活輸出:σ(W32*σ(W21*X+B2)+B3), shape(1,1)2、反向傳播
使用梯度下降和偏導數(shù)的數(shù)學概念,從神經(jīng)網(wǎng)絡最后一層的輸出開始,反向更新每個神經(jīng)元的偏置b',以及每條神經(jīng)元連接的權重ω'。理解了梯度和偏導之后,再弄明白為什么叫反向傳播,反向傳播的到底是什么?這就要引入一個概念神經(jīng)元誤差:神經(jīng)元誤差是代價函數(shù)C關于第l層第j個神經(jīng)元帶權輸入的偏導數(shù),這個神經(jīng)元誤差代表帶權輸入給代價函數(shù)帶來的變化率。在反向傳播中,首先計算出輸出層的神經(jīng)元誤差,再利用公式計算出前一層的神經(jīng)元誤差,實際上反向傳播的就是神經(jīng)元誤差。
(強烈推薦知乎上的一本書《深度學習的數(shù)學》,書中第四章非常詳細的進行了反向傳播的公式推導)
2.1 代價函數(shù)
用于衡量前向傳播的輸出與訓練樣本的期望輸出的偏差 (公式1)下面是二次代價函數(shù)的幾何圖形,反向傳播就是為了更新權重ω和偏置b使代價函數(shù)接近圖形的最低點。
2.2 梯度
為什么選擇函數(shù)的梯度?
因為梯度是函數(shù)在A點無數(shù)個變化方向中變化最快的那個方向,要找最低點當然選擇“梯度下降”最快。為什么梯度下降,又變成求偏導數(shù)了呢?
因為數(shù)學家們發(fā)現(xiàn),只要每一個變量都沿著關于這個變量的偏導所指定的方向來變化,函數(shù)的整體變化就能達到最快。所以,梯度是偏導數(shù)的向量。反向傳播示例圖上圖的梯度向量為公式2
(公式2)2.3 神經(jīng)元誤差
為什么叫反向傳播,反向傳播的到底是什么?
這里就要引入一個概念“神經(jīng)元誤差”:神經(jīng)元誤差,是代價函數(shù)C關于第l層第j個神經(jīng)元帶權輸入的偏導數(shù),這個神經(jīng)元誤差代表帶權輸入給代價函數(shù)帶來的變化率。在反向傳播中,首先計算出輸出層的神經(jīng)元誤差,再利用公式計算出前一層的神經(jīng)元誤差,實際上反向傳播的就是神經(jīng)元誤差。
神經(jīng)元誤差定義為公式3
(公式3)緊接著推導出,代價函數(shù)C關于第l層第j個神經(jīng)元的第i條權重的偏導數(shù)為神經(jīng)元誤差乘以l-1層的激活輸出值,公式4
(公式4)代價函數(shù)C關于第l層第j個神經(jīng)元的偏置的偏導數(shù)為神經(jīng)元誤差,公式5
(公式5)下一步,只要帶推導出上下層之間神經(jīng)元誤差的關系,就可以開始反向傳播了:第l層第j個神經(jīng)元的誤差等于,該神經(jīng)元到第l+1層每個神經(jīng)元的權重與神經(jīng)元的誤差相乘求和,再乘以參數(shù)為第l層第j個神經(jīng)元的帶權輸入的激活函數(shù)的導函數(shù)的值,公式6
(公式6)反向傳播簡化了求導過程,只需要找出輸出層的神經(jīng)元誤差,再使用公式計算反向推出各層的神經(jīng)元誤差,再利用神經(jīng)元誤差計算每層各神經(jīng)元的偏導數(shù),從而更新權重和偏置。
2.4 反向誤差傳播的過程
五、反向誤差傳播舉例計算(代價函數(shù)為方差)
2. 計算倒數(shù)第二層神經(jīng)元誤差
σ21 = (σ31*ω311 + σ32*ω321) * a'(z21) σ22 = (σ31*ω312 + σ32*ω322) * a'(z22) σ23 = (σ31*ω313 + σ32*ω323) * a'(z23) σ24 = (σ31*ω314 + σ32*ω324) * a'(z24)3. 計算輸出層權重和偏置的偏導數(shù)
?C/?ω311 = σ31*a21 ?C/?ω312 = σ31*a22 ?C/?ω313 = σ31*a23 ?C/?ω314 = σ31*a24 ?C/?b31 = σ31?C/?ω321 = σ32*a21 ?C/?ω322 = σ32*a22 ?C/?ω323 = σ32*a23 ?C/?ω324 = σ32*a24 ?C/?b32 = σ324. 計算倒數(shù)第二層的權重和偏置的偏導數(shù)
?C/?ω211 = σ21*a11 ?C/?ω212= σ21*a12 ?C/?ω213= σ21*a13 ?C/?b21 = σ21?C/?ω221 = σ22*a11 ?C/?ω222= σ22*a12 ?C/?ω223= σ22*a13 ?C/?b22 = σ22?C/?ω231 = σ23*a11 ?C/?ω232= σ23*a12 ?C/?ω233= σ23*a13 ?C/?b23 = σ23?C/?ω241 = σ24*a11 ?C/?ω242 = σ24*a12 ?C/?ω243 = σ24*a13 ?C/?b24 = σ245. 更新權重和偏置
ω211 = ω211 - α * ?C/?ω211 = ω211 - α * σ21*a11 ω212 = ω212 - α * ?C/?ω212 = ω212 - α * σ21*a12 ω213 = ω213 - α * ?C/?ω213 = ω213 - α * σ21*a13 b21 = b21 - α * ?C/?b21 = b21 - α * σ21ω221 = ω221 - α * ?C/?ω221 = ω221 - α * σ22*a11 ω222 = ω222 - α * ?C/?ω222 = ω222 - α * σ22*a12 ω223 = ω223 - α * ?C/?ω223 = ω223 - α * σ22*a13 b22 = b22 - α * ?C/?b22 = b22 - α * σ22ω231 = ω231 - α * ?C/?ω231 = ω231 - α * σ23*a11 ω232 = ω232 - α * ?C/?ω232 = ω232 - α * σ23*a12 ω233 = ω233 - α * ?C/?ω233 = ω233 - α * σ23*a13 b23 = b23 - α * ?C/?b23 = b23 - α * σ23ω241 = ω241 - α * ?C/?ω241 = ω241 - α * σ24*a11 ω242 = ω242 - α * ?C/?ω242 = ω242 - α * σ24*a12 ω243 = ω243 - α * ?C/?ω243 = ω243 - α * σ24*a13 b24 = b24 - α * ?C/?b24 = b24 - α * σ24ω311 = ω311 - α * ?C/?ω311 = ω311 - α * σ31*a21 ω312 = ω312 - α * ?C/?ω312 = ω312 - α * σ31*a22 ω313 = ω313 - α * ?C/?ω313 = ω313 - α * σ31*a23 ω314 = ω314 - α * ?C/?ω314 = ω314 - α * σ31*a24 b31 = b31 - α * ?C/?b31 = b31 - α * σ31ω321 = ω321 - α * ?C/?ω321 = ω321 - α * σ32*a21 ω322 = ω322 - α * ?C/?ω322 = ω322 - α * σ32*a22 ω323 = ω323 - α * ?C/?ω323 = ω323 - α * σ32*a23 ω324 = ω324 - α * ?C/?ω324 = ω324 - α * σ32*a24 b32 = b32 - α * ?C/?b32 = b32 - α * σ32以上就是學習過程的總結,后續(xù)再更新學習第三章的總結。如果您看到這里,說明您很認真的閱讀,同時覺得分享的東西還有點用,那就再麻煩您雙擊文章給個贊同,謝謝各位看官。
總結
以上是生活随笔為你收集整理的《神经⽹络与深度学习》-自学笔记01的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 转行产品经理,必看的避坑指南!
- 下一篇: 【JavaScript】制作日历
