为什么在反向传播中感知器初始值不能为0_深度学习理论分享之——单层感知器简述...
圖1 單層感知器結構圖
2單層感知器基本知識點讓我們對照著圖1來仔細感受一下單層感知器的基本知識點:首先,單層感知器需要有輸入,也即圖中的x1,x2,x3等。注意,這里的輸入通常都是說的一個數據樣本X的各個特征分量,也就是我們在機器學習中所學習過的那樣。其次,我們再看每個特征輸入都會對應著一個輸入節點,這個輸入節點我們稱之為輸入神經元,而所有的輸入神經元匯總在一排上,就構成了輸入層神經元,簡稱輸入層。然后,連接特征輸入與每個輸入神經元的都是一條帶方向的直線,從輸入指向輸入神經元,我們稱這個方向為前向,其反方向稱之為后向。前向、后向是至關重要的兩個方向,這在后面的BP算法介紹中尤其重要。再次,我們看到圖1中還存在著輸出節點,我們稱之為輸出神經元。輸出神經元個數不限,最簡單的就是如圖1所示的一個,也可能存在著多個。注意:所謂的單層感知器并非指的是輸出神經元個數為1的感知器模型,而是說除去輸入節點和輸出節點之外,再無其他類別的神經元,比如后面我們要提到的前饋神經網絡等復雜神經網絡中的各種隱藏層。因此,我們可以簡單地理解為單層感知器其實就只有輸入層和輸出層,沒有隱藏層。第四,在輸入層神經元與輸出層神經元之間也存在著一條帶方向的連接線,所指也是從輸入層到輸出層。這也是前向。并且,在這些帶方向的連接線上都存在著一個個被冠以wi的變量,這樣的變量,我們稱之為權重。如同我們在機器學習中學習廣義線性模型時看到的那個數學公式那樣,這里的權重就等價于那個數學公式中各個特征分量xi前的那個系數。其意義也是表征在某一層面上的某個特征的重要性。在圖1中,三個權重值均為:0.3。此外,通常的神經網絡模型(包括單層感知器),其每一層神經元都會有一個統一的偏置值,我們稱之為b,英文簡稱為bias。這個偏置值能夠起到一定的修正作用,比如當最終結算結果可能有些走極端時,它就好比是一位好心大叔,能夠把它往回拉一點點,使之不至于太“離經叛道”。偏置值在圖1中體現的形式為t=0.4。第五、在輸出神經元上,我們通常看到的是一個完整的神經元節點,但實際其內部計算通常會被劃分為兩部分:第一部分:對該神經元的各個方向來的輸入值進行線性加權求和,即:input=w1*x1+w2*x2+w2*x2+t注意,這里的t實際就是偏置值:b第二部分:對input進行某種函數映射,使得最終的輸出結果落在一個指定的范圍之內。通常這個范圍都會在[-1,1]之間選擇,可能是[0,1],也可能就是[-1,1]。甚至有可能是幾個離散的取值,當然這些取值依然會在[-1,1]之間來取。為了能夠做到這種映射結果,我們在這個輸出神經元上使用一種被稱之為非線性變換的函數。這樣的一種映射函數也被稱之為激活函數。在單層感知器中,比較常用到的激活函數為符號函數:圖2 單層感知器激活函數
從這個激活函數,我們不難看出一點:單層感知器天然就很適合做一個分類器來使用。而且當單層感知器的輸出神經元個數大于1時,還能承擔多分類器的重擔。只需要我們對所有的真實標簽采取One-Hot編碼即可。比如我們有一個多分類問題,已知的數據類別有n種,則采用One-Hot編碼,提供一個二進制位數為n的整數,某一位取值為1,則表示當前數據樣本被識別成是某個類別:例如,第m位被置為1,則表示當前學習的數據的標簽大概率是第m類。要做到這一點,就需要在單層感知器上設計出n個輸出神經元。在每個神經元上都開展線性加權求和以及對求和結果開展符號函數變換,這樣每個輸出神經元都只能輸出1或者-1。而我們把-1看成是0,即可滿足上述要求。
第六,同樣發生在輸出神經元上的事情就是如何來衡量對每一個數據樣本的學習結果好壞。此時我們通常利用一個叫損失函數的機制來幫助我們實現這樣的好壞度量。
所謂損失函數,是指對于每一個輸入數據的訓練,總會產生一個預測值,但大多數情況下,這個預測結果并不絕對等于實際的真實結果。因此,在預測結果與真實結果之間就必然有一定的誤差,我們稱這樣的誤差為損失。利用這樣的損失所建立的函數就稱之為損失函數。
在單層感知器中,常用到的損失函數有這么幾種:
MAE:平均絕對誤差(誤差的絕對值的平均值)。意思就是說如果輸出層有L個神經元,每個神經元上都必然存在這一個誤差,把這些誤差取絕對值之后相加,再除以輸出層神經元個數L,則為本次輸入數據學習之后所得到的損失值。圍繞這個損失值我們就可以建立一個相應的損失函數。
MSE:均方誤差(誤差的平方和的平均值)。也就是說讓所有的誤差值求平方之后再匯總求和,而后對求和結果除以L得到的平均值即為本次輸入數據學習過后的損失值。
SSE:誤差平方和,它與MSE的區別在于不再需要求平均值,其余計算過程保持不變。
在后續的復雜神經網絡或深度學習模型中,上面這三種損失值的計算函數也通常會被用到。不過在高級的深度學習模型中,還存在著其他不同的損失值計算函數。這一點我們在介紹深度學習相關算法時也會重點提到。
損失函數,可以說是神經網絡或者深度學習算法的根所在。正是因為存在著如何度量學習結果好壞的損失函數,我們才能夠基于這個損失函數來推導出神經網絡模型中的各個神經元上的權重參數和偏置值參數,并最終建立起一個高效的學習模型。
因此,損失函數是我們必須要重點掌握的。當然我們如果能夠把損失函數的原理搞得通透固然最好,如果不能,也可以先記住有哪些損失函數及其對應的名稱縮寫,以便我們能夠依葫蘆畫瓢地去使用其中某個損失函數。
第七,學習率:η。當我們計算出每一次輸入數據學習過后的損失值時,我們希望利用這個損失值來反向推導各個神經元上的權重參數與偏置值參數的最新值。此時,我們在推導過程中就會考慮學習率的存在。
學習率是指導我們,在梯度下降法中,如何使用損失函數的梯度調整網絡權重的超參數。
學習率如果過大,可能會使損失函數直接越過全局最優點,此時表現為loss過大或者為無窮大值;
學習率如果過小,損失函數的變化速度很慢,會大大增加網絡模型訓練的收斂復雜度,延長訓練時間,并且很容易被困在局部最小值附近。
這是在一般意義上的一種數學解釋。通常我們認為學習率就是一個以合理的速度來尋找最優的權重參數值和偏置值參數值的參數而已。
這個學習率通常會被設置得比較小,比如0.1、0.01、0.001、0.0001等。
學習率是不可或缺的,至少在現在的深度學習算法中,還真就找不出幾個不用到學習率的地方。所以大家也需要對此有一個正確的認識。在每一次的DL訓練時都要顯示地指明學習率是多少。
PS:在后續的神經網絡發展歷程中,大拿們又對單層感知器的激活函數做了擴充處理。其實這一點我們在介紹機器學習等知識就曾專門提到過有關激活函數的知識,并且列舉了當前常見的一些激活函數,這里再列舉如下:
圖3 常用的激活函數匯總表截圖
在這種匯總表中,我們在后續的神經網絡模型或深度學習模型中,廣泛使用的又是諸如:sigmoid函數、relu函數、tanh函數、PRelu函數等。以后我們還會專門提到這些激活函數的妙用之處。在這里大家姑且記住有這些激活函數,以及這些激活函數的基本形式、取值范圍即可。
以上五部分就是有關單層感知器的基本知識點所在。圍繞著這些知識點,我們就可以來重點闡述其工作原理。
3單層感知器工作原理在理解單層感知器的基本知識點之后,我們就需要來弄明白單層感知器的基本工作原理,看看單層感知器究竟學習的是個啥,又是如何學習的。弄清楚這個工作原理非常重要,因為我們已經不止一次說過:不管多么復雜的神經網絡或深度學習模型,其核心要素就是由一個個神經元組成的。而單層感知器實際上我們就可以被簡化為一個神經元(假如我們把輸入神經元與各個特征輸入融為一體的話。)。因此,弄懂單個神經元的工作原理就顯得十分必要。此外它還是多層感知器、前饋神經網絡等復雜神經網絡模型中所用到的“誤差反向傳播”算法的一個理論基礎所在:即如何通過輸出層來反向推導出坐落在不同連接線上的各個權重參數值以及偏置值等。
可以簡單地說就是:單層感知器也好、多層感知器也罷,甚至是更復雜的深度學習模型,其最終所要學習到的就是坐落在這些有向的連接不同神經元之間的連接線上的權重系數以及每一層神經元的一個偏置值。
注意:我們這里說的是連接不同神經元之間的連接線。因此不論在不再同一層,只要是神經元之間有一條有向的連接線,那就需要對該連接線上的權重展開學習。
現在我們就來聊一聊單層感知器的基本工作原理:
第一步:為輸入數據、各個權重、偏置值賦值初始值,具體取值,各位隨意取,但有一個經驗很完美地表明:權重值、偏置值的初始值還是盡量小一點比較妥當。通常都會利用Numpy庫或者TensorFlow庫中的正態分布函數來幫我們選擇一批初始權重。
第二步:利用圖2中的output的表達式來開展輸入特征的線性加權求和;
第三步:再選用圖2的激活函數來對加權求和結果進行映射,得到的預測結果我們標記為oj,而該樣本的真實結果,則即為:dj;j表示第j次的輸入數據的學習。
第四步:求出本次學習結果的損失值:
? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)
第五步:利用公式(1)求出的損失值來更新權重參數與偏置值參數:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)
這里的i表示的是第i個權重參數,j表示的是第j次的輸入數據的學習。
同樣的邏輯,我們可以計算偏置值的更新過程如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)
PS:請注意,由于我們這里采用的是符號函數作為激活函數,因此可以直接利用公式(2)和公式(3)來分別更新權重參數與偏置值參數。但在實際的復雜神經網絡模型中,我們通常都會利用其它激活函數,且這些激活函數是可以求導數的。因此在其他場合下,我們將利用對激活函數的求導結果結合損失值來更新權重參數與偏置值參數。
第六步:判斷當前的訓練結束條件是否滿足:
①、模型訓練過程中所產生的損失值已經小于我們給定的一個閾值:δ。如果已經小于,則本模型的訓練過程結束。但在單層感知器中,我們使用的激活函數為符號函數,因此,在這里我們并不適用條件①來作為判斷模型訓練是否結束的標準。采用的是下面這兩條準則之一。
②、在指定的訓練次數之內,判斷前后兩次訓練的權重之差是否已經小于給定的一個閾值:ε,如果已經小于,則判定本模型的訓練過程結束;
③、如果條件②尚不滿足,但已經訓練了足夠的訓練次數,比如我們指定的最多500次訓練,則同樣結束本模型的訓練。
第七步:如果判斷模型訓練結束條件不滿足,則繼續回到第二步,并繼續新一輪學習過程。
4單層感知器的TensorFlow實現理解了單層感知器的具體知識點以及工作原理之后,我們接下來就利用所學習的TensorFlow知識來實現一下這樣的一個簡單的單層感知器。在這里稍微說明一下,為了能夠利用TensorFlow庫中給我們提供的一個自動求導機制:tf.GradientTape()。我們在以下代碼中所示的單層感知器實現中使用的激活函數為Sigmoid函數。此時我們就需要考慮對損失值進行求導了。至于利用Sigmoid函數怎么來求導,我們在多層感知器以及更為復雜的BP算法的介紹中會專門提到,這里僅簡單列出以下Sigmoid函數的求導結果:
接下來我們就來看看這個簡單的單層感知器的實際代碼:
import tensorflow as tf
x = tf.Variable(tf.random.normal([5,3]))#5個樣本,3個特征參數
y = tf.constant([0,1,0,1,0])#實際標簽值
w = tf.Variable(tf.random.normal([3,1]))#3維將為1維
b = tf.Variable(tf.zeros([1]))
with tf.GradientTape() as tape:
? ? output = x@w + b
? ? out = tf.sigmoid(output?)
? ? loss = tf.reduce_mean(tf.losses.MAE(y,out))
res = tape.gradient(loss,[w,b])
dw =?res?[0]
db =?res?[1]
print('dw = ' + str(dw))
print('db = ' + str(db))
其運行結果截圖如下:
代碼簡單解釋如下:
tf.Variable:生成一個tf的張量;
tf.random.normal([5,3]):從標準正態分布中隨機生成一個shape為5行3列的數組張量;
tf.constant:生成一個tf的張量,是一個常量;
tf.zeros([1]):生成一個shape為1一個元素的一維向量,元素值為0;
with tf.GradientTape() as tape:TensorFlow庫中提供的一個自動求導機制的慣用寫法,大家只需要這么記住即可;
x@w:在TensorFlow庫中,提供的兩個張量數組相乘運算符;注意:相乘的兩個矩陣必須要滿足一個要求:矩陣x的列數必須等于矩陣w的行數。
tf.sigmoid(output ):使用TensorFlow庫中的sigmoid()函數來作為激活函數,對output結果進行激活處理;
tf.reduce_mean():計算用于計算張量tensor沿著指定的數軸(tensor的某一維度)上的的平均值,主要用作降維或者計算tensor(圖像)的平均值。在這里主要計算損失值的平均值;
tf.losses.MAE(y,out):利用TensorFlow庫中的losses模塊內的MAE()函數(即:平均絕對誤差)來計算損失值,需要提供真實值與預測值。由于真實值與預測值都是一個同shape大小的數組張量,故而可以使用tf.reduce_mean()函數來計算平均值。
tape.gradient(loss,[w,b]):利用TensorFlow庫中的啟動求導機制的gradient()函數來對損失函數開展求導運算。需要輸入的參數有:
損失函數;
需要開展求導的參數列表,比如這里的權重參數與偏置值參數等。
res?[0]/res [1]:自動求導結束之后,我們所計算出來的權重參數就被存儲在求導結果的第0個元素上,偏置值則存放于第1個元素上。
以上就是一個單層感知器的具體代碼實現以及代碼簡介。
這里順帶提一個小問題供大家思考,如果我們不使用TensorFlow的自動求導機制,且激活函數選擇為符號函數sgn(),那么又該如何來實現?
5總結到此為止,我們就簡單介紹了有關單層感知器的基本原理、知識點、工作機制以及簡單的代碼實現與代碼簡介。
單層感知器天然適合開展線性可分的問題解決工作。但對于一些非線性問題,比如異或問題處理,就會顯得很蒼白無力。此外,單層感知器還缺乏泛化能力。對離群點的檢測也需要花費更多的時間和精力。因此總得來說單層感知器在實際使用中還是存在比較大的局限性,特別是現在這種AI越來越普及的時代,已經很難再尋覓到有關單層感知器的使用場景,
但不管怎么說,單層感知器為我們打開了一扇通往神經網絡乃至深度學習領域的大門。而且正是由于前輩們對單層感知器的不斷完善改進,才有了后來的多層感知器等前饋神經網絡、深度置信網絡、卷積神經網絡、循環神經網絡等更加高級的神經網絡算法。
因此,我們說單層感知器是我們理解研究其他神經網絡的基礎,其學習訓練規則對于其他神經網絡的權重訓練有極為重要的意義。這里也希望大家多揣摩揣摩它的意義。
OK,本節知識的分享就到此為止,謝謝大家!下一節我們繼續分享梯度下降算法、BP算法的相關知識,屆時不見不散!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的为什么在反向传播中感知器初始值不能为0_深度学习理论分享之——单层感知器简述...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python语言程序的特点_Python
- 下一篇: http中的请求头各部分都是什么意思_小