7.12
第三章 神經網路
對於感知機來說,設定權重的工作,即確定合適的,能符合預期的輸入與輸出的權重,現在還是由人工進行的。神經網路的乙個重要性質是它可以自動的從資料中學習到合適的權重引數。
本章內容:先介紹神經網路的概要,然後重點關注神經網路進行識別時的處理。
1.從感知機到神經網路(了解不同之處,即啟用函式不同,訊號轉換方式不同)
啟用函式,將輸入訊號的總和轉換為輸出訊號,啟用函式的作用在於決定如何來啟用輸入訊號的總和。
2.啟用函式
感知機中使用了階躍函式(以閾值為界,一旦輸入超過閾值,就切換輸出)作為啟用函式。如果將啟用函式從階躍函式換成其他函式,就可以進入神經網路的世界了。
(1)sigmoid函式
首先知道它的表示式,神經網路中用sigmoid函式作為啟用函式,進行訊號轉換,轉換後的訊號被傳送給下乙個神經元(節點)。其他方面,比如神經元的多層連線的構造,訊號的傳遞方法等,基本上和感知機是一樣的。
(2)階躍函式的實現和圖形
感知機使用階躍函式作為啟用函式。
實現階躍函式,用到了numpy的「技巧」,在這裡,可以用y.astype()方法將布林型別的陣列轉換為int型的陣列,true轉換為1,false轉換為0。
階躍函式的影象呈階梯式變化。
(3)sigmoid函式的實現
sigmoid函式是神經網路中經常使用的乙個啟用函式。可用python語句寫出sigmoid函式:
def sigmoid(x):
return 1/(1+np.exp(-x))
這裡的引數x可以是numpy陣列,之所以sigmoid函式支援numpy陣列,是因為numpy的廣播功能。根據numpy的廣播功能,如果在標量和numpy陣列之間進行運算,則標量會和numpy陣列的各個元素進行運算。
sigmoid函式與階躍函式比較,不同點在於:
sigmoid函式是一條平滑的曲線,輸出隨著輸入發生連續性的變化。而階躍函式以0為界,輸出發生急劇性的變化。sigmoid函式的平滑性對神經網路的學習具有重要意義。
另乙個不同點是,階躍函式只能返回0/1,sigmoid函式可以返回實數。也就是說,感知機中神經元之間流動的是0/1的二元訊號,而神經網路中流動的是連續的實數值訊號。
兩個函式的共同性質:兩者的結構均是「輸入小時,輸出接近0(為0);隨著輸入的增大,輸出向1靠近(變為1)。」
也就是說,當輸入訊號為重要資訊時,階躍函式和sigmoid函式都會輸出較大的值;當輸入訊號為不重要的資訊時,兩者都輸出較小的值。還有乙個共同點是,不管輸入訊號有多小,或者有多大,輸出訊號的值都在0-1之間。
(4)非線性函式
階躍函式和sigmoid函式均為非線性函式。神經網路的啟用函式必須使用非線性函式。啟用函式不能使用線性函式,線性函式的問題在於,不管如何加深層數,總是存在與之等效的「無隱藏層的神經網路」。使用線性函式時,無法發揮多層網路帶來的優勢。
(5)relu函式
relu函式在輸入大於0時,直接輸出該值,在輸入小於等於0時,輸出0。
relu函式的實現:
def relu(x):
return np.maximum(0,x)
這裡使用了numpy的maximum函式。maximum函式會從輸入的數值中選擇較大的那個值進行輸出。
3.多維陣列的運算
如果掌握了numpy多維陣列的運算,就可以高效的實現神經網路。
(1)多維陣列
多維陣列就是「數字的集合」,數字排成一列的集合,排成長方形的集合,排成三維狀或者(更加一般化的)n維狀的集合都稱為多維陣列。
接著講了用numpy生成多維陣列。
a=np.array([1,2],[3,4],[5,6])
陣列的維數可以通過np.admin()函式獲得,陣列的形狀可以通過例項變數shape獲得,結果是乙個元組。
二維陣列也稱為矩陣,陣列的橫向排列稱為行,縱向排列稱為列。
(2)矩陣乘法
矩陣乘法在python中的**實現:
np.dot(a,b)
no.dot()接收兩個numpy陣列作為引數,並返回陣列的乘積。
(3)神經網路的內積
通過矩陣的乘積一次性完成計算的技巧,在實現的層面上是非常重要的。
3層神經網路的實現
巧妙的使用numpy陣列,可以使用很少的**完成神經網路的前向處理。
神經網路的運算可以作為矩陣運算打包進行。
(1)符號確認,各層間訊號傳遞的實現
最後一層輸出時的啟用函式用到了「恒等函式」(identity_function),恒等函式會將輸入按原樣輸出。這樣實現只是為了和之前的流程保持一致。
隱藏層的啟用函式用h()表示
輸出層的啟用函式用õ()表示
輸出層所用的啟用函式,要根據求解問題的性質決定。一般的,回歸問題可以使用恒等函式,二元分類問題可以使用sigmod函式,多元分類問題可以使用softmax函式。
(2)**實現小結
使用了兩個函式
init_network()會進行權重和偏置的初始化,並將它們儲存在字典變數network中。這個字典變數network中儲存了每一層所需的引數(權重和偏置)。forward()函式中則封裝了輸入訊號轉換為輸出訊號的處理過程。
5.輸出層的設計
神經網路可以用在分類問題和回歸問題上,不過需要根據情況改變輸出層的啟用函式。一般而言,回歸問題用恒等函式,分類問題用softmax函式。
機器學習的問題大致可以分為分類問題和回歸問題。分類問題是資料屬於哪一類別的問題。回歸問題是根據某個輸入**乙個/連續個數值的問題。
(1)恒等函式和softmax函式
恒等函式會將輸入按原樣輸出,對於輸入的資訊,不加以任何改動的直接輸出。
softmax函式,假設輸出層共有n個神經元,計算第k個神經元的輸出,softmax函式的分子是第k個輸入訊號的指數,分母是所有輸入訊號的指數函式的和。輸出層的各個神經元都受到所有輸入訊號的影響。
(2)實現softmax函式時的注意事項
溢位問題:softmax函式的實現中要進行指數函式的運算,但是此時指數函式的值很容易變得非常大,如果這些超大值之間進行除法運算,結果就會出現「不確定」的情況。
(計算機處理「數」時,數值必須在4位元組或8位元組的有限資料寬度內。這意味著數存在有效位,也就是說,可以表示的數值範圍是有限的,因此會出現超大值無法表示的問題,稱為溢位)
softmax函式改進:
分子分母指數下同時加上或減去輸入訊號中的最大值。
(3)softmax函式的特徵
softmax()的輸出是0.0到1.0之間的實數。並且,softmax函式的輸出值的總和是1(softmax函式的乙個重要性質)。因為有了這個性質,我們才可以把softmax函式的輸出解釋為「概率」。也就是說,通過使用softmax函式,我們可以用概率的(統計的)方法處理問題。
即便使用了softmax函式,各個元素之間的大小關係也不會改變。一般而言,神經網路只把輸出值最大的神經元所對應的類別作為識別結果。並且,即便使用softmax函式,輸出值最大的神經元的位置也不會變。因此,神經網路在進行分類時,輸出層的softmax函式可以省略。
(4)輸出層的神經元數量
輸出層的神經元數量需要根據待解決的問題來決定。對於分類問題,輸出層的神經元數量一般設定為類別的數量。
深度學習入門之第三章 神經網路 輸出層的設計方案
本節所講的神經網路輸出層主要是指用於識別器中的輸出層設計,識別器的輸出層一般具有兩個功能,第一判斷影象是真實影象還是生成的影象,第二用於conditional gans中判斷影象的類別。如果是判別影象是否是真實影象,通常我們會直接使用sigmoid函式,如果是判別影象的類別,且不是二分類問題的話 我...
深度學習 神經網路入門
在進行這方面學習工作的時候,在網上蒐集到了很多的資料與部落格,之前一直把學習的筆記存放在有道雲裡,最近決定還是想要整理成部落格所以接下來會一直把我之前的機器學習 深度學習 強化學習的相關知識和自己的經驗整理成部落格陸續更新 深度學習是基於神經網路的研究,含多隱層的多層感知器就是一種深度學習結構。深度...
機器學習,深度學習,神經網路,深度神經網路
先來說一下這幾者之間的關係 人工智慧包含機器學習,機器學習包含深度學習 是其中比較重要的分支 深度學習源自於人工神經網路的研究,但是並不完全等於傳統神經網路。所以深度學習可以說是在傳統神經網路基礎上的公升級。神經網路一般有輸入層 隱藏層 輸出層,一般來說隱藏層大於2的神經網路就叫做深度神經網路,深度...