1. 程式人生 > >【Python】搭建你的第一個簡單的神經網路_理論篇_NN&DL學習筆記(一)

【Python】搭建你的第一個簡單的神經網路_理論篇_NN&DL學習筆記(一)

前言

本文為《Neural Network and Deep Learning》學習筆記(一),可以轉載但請標明原文地址

本人剛剛入門、筆記簡陋不足、多有謬誤,而原書精妙易懂、不長篇幅常有柳暗花明之處,故推薦閱讀原書。

《Neural Network and Deep Learning》下載地址(中文版):Neural Network and Deep Learning(中文版)

注:這本書網上有很多免費版,隨便搜一下就有了,不用非得花積分下載我上傳的資料。


第一部分:理論篇(介紹神經網路)

若不想看乾巴巴的理論,想要直接食用原始碼,可以跳到實踐篇(抱歉現在還沒有寫出來orz)。

但理論篇不長,也不難懂,都是最基本的知識,看一下也是好的。

一、人工神經元

顧名思義,神經網路的基本節點。

1.1 感知器:一種簡單的人工神經元

1、感知器的定義

一個感知器接受幾個二進位制輸入(x1、x2、x3…),產生一個二進位制輸出(output)

(注:二進位制的意思就是,x1、x2、x3、output這些變數的取值只有0和1)

2、output的計算公式

顯然,輸出(output)需要由輸入(x1、x2、x3…)計算得來,如何計算呢?

① 引入權重(w1、w2、w3…)分別表示輸入(x1、x2、x3…)的重要性

② 引入閾值(threshold),表示output更容易輸出0還是1(這似乎有點難理解,會在下文解釋)

下面給出output的計算公式,就很好理解了:

這個公式的意思是:我們用來表示w1*x1+w2*x2+w3*x3……,把這個叫做加權和,當這個加權和<=閾值threshold時,output輸出0;反之輸出1。

由此可見,閾值threshold越大,output越容易輸出1,越小越容易輸出0.

這就是簡單的感知器的全部工作。

我們把上面那個公式變換一下,使它看起來更漂亮:

① 用w*x代替,不要忘了,w為權重向量(剛剛引入的)、x為輸入向量

② 將不等式右邊的threshold移到左邊,變成-threshold,再令b=-threshold,給b起個名字叫做偏置

那麼上面那個公式就變成了這樣(看起來更熟悉叭):

由上式可以看出,偏置b的意義也在於【b越大,output越容易輸出1】,此後我們將不再使用閾值threshold,而總是使用偏置b。

1.2 S型神經元:一種也很簡單但更常用的神經元

1、為什麼要引入S型神經元?

首先想一個問題:為什麼感知器不常用呢?

答案是:output只有兩個值0和1,很小的權重w和偏置b的變化,可能會引起完全翻轉,網路的輸出變化太大,我們很難微調。

我們希望有一種神經元,當我們微調權重w和偏置b的時候,output也相應有微小變化,這樣才可能一點點接近目標,達到我們的目的(比如正確識別手寫數字)。通過改變w和b,進而改變output,這個過程就叫做學習

於是我們引入了S型神經元。

2、定義

S型神經元有多個輸入(x1、x2、x3…),一個輸出output,與感知器不同的是:輸入x1、x2、x3可以取0和1之間的任何值

(感知器的輸入是二進位制輸入,只有0和1)

3、output的計算公式

同樣的,為了得到output的計算公式,我們也引入權重w和偏置b,作用跟感知器裡面w和b的作用相同(還記得w和b的作用嗎?)

但是,我們使用了一個新的函式來計算output,這個函式叫做S型函式,記作\sigma

假設這個函式\sigma的輸入是z,那麼輸出\sigma \left ( z \right )由下面這個公式計算得出:

而在我們的S型神經元裡,函式\sigma的輸入是\sum {_{j}} w{_{j}} x{_{j}} + b,簡寫就是wx+b,將這個輸入代入上面的公式,得到輸出output的計算公式如下:

output=\sigma \left ( wx+b \right )=\frac{1}{1+e^{-wx-b}}=\frac{1}{1+exp\left ( -wx-b\right )}

(注:exp()的意思就是e^,這樣的形式看著更整齊一點)

4、S型神經元能夠滿足我們的要求嗎?

這樣的S型神經元能夠滿足我們的要求嗎?當w和b改變很小的時候,output也會改變很小嗎?只要看看S型函式\sigma \left ( z \right )的函式影象我們就明白了:

 我們再看看感知器的函式影象(其實就是一個階躍函式):

可以看出不同了吧?上面的是平滑的,下面的會有跳動。因此S型神經元能夠滿足我們的要求:微小變化。

但是又出現了一個新問題,如何解釋output的輸出值呢?

在感知器中,output只有兩個值0和1,假如我們要識別手寫數字9,那輸出1代表“輸入影象是一個9”、輸出0代表“輸入影象不是一個9”;

在S型神經元中,output能夠輸出0和1之間的所有值,這時我們可以人為約定,輸出0.5以上的值代表“輸入影象是一個9”、輸出0.5以下的值代表“輸入影象不是一個9”.

二、神經網路的架構

介紹完單個的神經元,自然要把他們連起來,連起來就變成神經網路啦。

1、神經網路的基本架構

假設我們把很多S型神經元連起來,得到了一個下面這樣的網路,這種網路常被人叫做多層感知器或者MLP

(注:雖然由S型神經元構成,不是由感知器構成,但網路名字卻叫多層感知器,作者表示他也很困惑,並拒絕使用這個名字)

由上圖可見:最左邊的一個豎層叫輸入層(input layer),裡面有3個輸入神經元;

最右邊的一個豎層叫輸出層(output layer),裡面有1個輸出神經元(也可以是多個輸出神經元);

除了輸入層和輸出層,中間的所有層都叫做隱藏層(hidden layer),上圖中只有一個隱藏層(有的網路有多個)。

2、如何設計屬於自己的神經網路

2.1 設計輸入層和輸出層

可以看出,設計輸入層和輸出層是比較簡單的,我們舉一個例子:

假設我們需要輸入一張手寫數字圖片,輸出“這張圖片是否是9”,那麼我們可以這麼設計輸入層和輸出層:

① 對於輸入層:我們可以將圖片畫素的強度進行編碼,作為輸入神經元。

如果影象是一個64×64的灰度影象(請自行百度灰度影象和彩色影象的區別),那麼我們會需要4096=64×64個輸入神經元,每個神經元根據灰度取0到1之間合適的值。

② 對於輸出層:我們只需要一個輸出神經元(還記得我們使用的S型函式的影象嗎?那副影象表明輸出值只能是0和1之間的值。)

我們應該人為約定輸出值的意義,比如這麼約定:當輸出值小於0.5,表示“輸入影象不是9”;反之表示“輸入影象是9”.

2.2 設計隱藏層

作者:設計隱藏層是一種藝術,是沒有經驗可言的。

但是,神經網路的研究人員為隱藏層開發了許多設計最優法則,可以幫助我們權衡隱藏層數量、和訓練網路所需的時間開銷。

但在這裡,按下不表,我們可以通過實踐來學習隱藏層的設計。

3、神經網路的分類

上文中,我們討論的神經網路,都是以上一層的輸出作為下一層的輸入,比如輸入層→隱藏層→輸出層,這樣的網路叫做前饋神經網路。如下圖(a)所示。

在前饋神經網路中,資訊總是向前傳播(顯然右邊是“前”),從不反向回饋。

然而,在一種如下圖(b)所示的遞迴神經網路中,存在著“反向回饋”,也就是網路中形成了一個環路,\sigma函式的輸出值又接入到網路的輸入中,並在經過幾層神經元之後又影響輸出值。遞迴網路的學習演算法不太強大,但原理上比前饋網路更接近大腦的實際工作,並且在一些領域表現得比前饋網路更好。

而前饋網路的影響力更大,本書只使用更廣泛的前饋網路。


【2018/11/18後記】

1、本來該複習下一門考試的,然而又手賤打開了部落格開始碼字……然後一個上午就過去了orz,因為這本書實在太棒了,太適合我這種初學者了,所以忍不住想要把自己學到的東西發上來啊orz

2、爭取很快找時間把實踐篇寫出來,run成功的那一刻心情超棒的qwq。

3、希望通過這個NNandDL學習筆記系列讓訪問量快點破萬!