1. 程式人生 > >01第一章、神經網路任何工作 1.1到1.8

01第一章、神經網路任何工作 1.1到1.8

第 1 章、神經網路如何工作

1.1、尺有所短,寸有所長

  計算機和人的關係:尺有所短,寸有所長   有些任務,對傳統的計算機而言很容易,對人類而言卻很難。例如,對數百萬個數字進行乘法運算。   另一方面,有些任務對傳統的計算機而言很難,對人類而言卻很容易。例如,從一群人的照片中識別出面孔。

1.2、一臺簡單的預測

1、思想過程

  人類:問題->思考->答案   計算機:輸入->流程(計算)->輸出   計算機的例項:輸入(3*4)->流程(4+4+4)->輸出(12)   所有有用的計算機系統都有一個輸入和一個輸出,並在輸入和輸出之間進行某種型別的計算。神經網路也是如此。

2、案例

  一個預測案例:千米和英里的轉換   計算機:輸入(千米)->流程(?)->輸出(英里)   已知:千米和英里之間的關係是線性的。(這裡,“線性的”被叫做模型)   一些線索:0千米=0英里 100千米=62.137英里   所以,假設流程是英里=千米*C(根據“線性的”模型得到的公式)   假設C=0.5,得到100千米=50英里,和目標62.137英里差距是12.137,這個12.137被叫做誤差。   然後,修改引數值,0.5變成0.6,100千米=60英里,和目標62.137英里差距是2.137,現在這個誤差比之前好多了。   然後,修改引數值,0.6變成0.7,100千米=70英里,和目標62.137英里差距是-7.863,這個誤差的負號告訴我們,我們超調了。   那麼我們將引數值變成0.61,100千米=61英里,和目標62.137英里差距是1.137,現在這個誤差比之前好多了,這改變引數的方法,叫做學習率,在梯度下降法中又叫步長。

3、啟發

  通過預測案例得到的啟發   誤差的大小指導如何改變引數C的值。   大誤差意味著大的修正值,小誤差意味著小的修正值。   迭代:嘗試得到一個答案,並多次改進答案,這是種方法叫做迭代。   當我們不能精確知道一些事情如何運作時,我們可以嘗試使用模型來估計其運作方式,在模型中,包括了我們可以調整的引數。如果我們不知道如何將千米轉換為英里,那麼我們可以使用線性函式作為模型,並使用可調節的梯度值作為引數。   改進這些模型中引數的一種好方法是,基於模型和已知真實示例之間的比較,得到模型偏移的誤差值,調整引數。   選擇正確的模型很重要。

1.3、分類器與預測器並無太大差別

  預測器:機器接受了一個輸入,並作出應有的預測,輸出結果。   書中舉了個根據長度和寬度分類花園裡毛蟲和瓢蟲的案例。   因為毛蟲細而長,瓢蟲短而寬,所以可以用一條線來分開。   在這裡插入圖片描述

  在這裡插入圖片描述   在這裡插入圖片描述   在修改這條線的過程中,用預測器來做引數的改變,其實也就是分類。   所以,分類器和預測期並沒有太大差別,機制都是一樣的。

1.4、訓練簡單的分類

1、例子引入

  根據一個數據來設定分割線的例子講解:   還是之前1.3的分類毛蟲和瓢蟲的問題。   假設模型為線性的,分界線函式為y=Ax,長度為y,寬度為x。   已知有兩個例項:   瓢蟲:寬3.0 長:1.0   毛蟲:寬1.0 長:3.0   即:   在這裡插入圖片描述   從常識A=0.25開始,即:   在這裡插入圖片描述   我們做什麼樣的期望呢,即:我們希望毛蟲得到的結果Y都在這條線的下方,瓢蟲得到的結果Y都在這條線的上方。   期望值是多少呢,我們希望瓢蟲得到的結果Y都在這條線的上方,現在的瓢蟲的資料是(3.0,1.0),即我們期望的值應該比1.0大一些,注意,大一點即可,比如1.1,所以,瓢蟲的期望目標值為1.1。同理,希望毛蟲得到的結果Y都在這條線的下方,毛蟲的是(1.0,3.0),所以假設毛蟲的期望目標值是2.9即可。   誤差值=(期望目標值-實際輸出值)。   所以,瓢蟲的資料在A=0.25的情況下,得到的誤差值E=1.1-(0.253)=1.1-0.75=0.35。   如下圖所示:   在這裡插入圖片描述   現在,我們的任務是對A做調整,用以得到合適的A,方法是要對E做些什麼,來調整A,即用E來調整A(根據誤差調整引數的思想)。   E是誤差值,根據期望值算出來的y叫做目標值t,t=(A+ΔA)x   所以這裡瓢蟲的期望值作為目標值,即目標值t=1.1。那麼誤差E=目標值-實際輸出=t-y=(A+ΔA)x-Ax=ΔAx。   所以E和ΔA系就有了,可以使用誤差E,講所得到的ΔA所謂調整分界線的斜率A的量,來調整A,是之得到正確的A。   比如上例,誤差值E為0.35,x=0.3。這樣ΔA=E/x=0.35/3=0.1167,這樣目標t=當前的A+當前的ΔA即t=0.25+0.1167=0.3667,這樣計算出來的y=0.3667*3=1.1,即為目標結果。   同理,如果根據毛蟲的資料設定目標值,將目標值定為2.9,這樣誤差E=2.9-0.3667=2.5333,ΔA=E/x=2.5333/1.0=2.5333,則新的A=0.3667+2.5333=2.9,得到了目標期望值。

2、改進

  機器學習的一個重要思路,我們應該進行適度改進(moderate),即我們不要改進的過於激烈。也就是說不要一下子將本次的A改進到目標的A。   這種自我節制的調整,還帶來了一個非常強大、行之有效的“副作用”。當訓練資料本身不能確信為完全正確並且包含在現實世界測量中普遍出現的錯誤或噪聲這兩種情況時,有節制的調整可以抑制這些錯誤或噪聲的影響。這種方法使得錯誤或噪聲得到了調解和緩和。   這次,我們新增一個調劑係數:ΔA=L* (E/x),假設L=0.5,第一次訓練,x=3.0,A=0.25,y=0.253.0=0.75,期望值為1.1,得到了誤差值E為0.35,ΔA=L (E/x)=0.0583,更新後的A為0.25+0. 0583=0.3083。   使用更新後的A進行第二次訓練,x=3.0,A=0.3083,y=0. 3083*3.0=0.9250,期望值為小於1.1,雖然還是錯誤的,但是再進行多次訓練,總能正確,因為這條直線確實向正確的方向移動了。

3、結論

  我們使用簡單的數學,理解了線性分類器輸出誤差值和可調節斜率引數之間的關係。也就是說,我們知道了在何種程度上調整斜率,可以消除輸出誤差值。   使用樸素的調整方法會出現一個問題,即改進後的模型只與最後一次訓練樣本最匹配,“有效地”忽略了所有以前的訓練樣本。解決這個問題的一種好方法是使用學習率:調節改進速率,這樣單一的訓練樣本就不能主導整個學習過程。   來自真實世界的訓練樣本可能充滿噪聲或包含錯誤。適度更新有助於限制這些錯誤樣本的影響。

1.5、有時候一個分類器不足以求解問題

  如果資料本身不是由單一線性過程支配,那麼一個簡單的線性分器不能對資料進行劃分。例如,由邏輯XOR運算子支配的資料明瞭這一點。   但是解決方案很容易,你只需要使用多個線性分類器來劃分由單直線無法分離的資料。   比如,邏輯and運算的分類,一個分類器解決問題:   在這裡插入圖片描述   比如邏輯or運算的分類(書上的這個標題寫錯了),一個分類器解決問題:   在這裡插入圖片描述   比如邏輯xor運算(異或)的分類(書上的這個標題寫錯了),就得兩個分類器了:   在這裡插入圖片描述   神經網路的核心思想:使用多個分類器一起工作,多條直線可以分離出異常狀的區域,對各個區域進行分類。

1.6、神經元——大自然的計算機器

1、神經元的結構

  在這裡插入圖片描述   由上圖可知,單個神經元通過樹突接收一些神經元給他的訊號,即電輸入,經過軸突的傳遞,傳送給終端,也就是突觸,然後傳遞給下一個神經元。

2、閾值(threshold)

  觀察表明:神經元不會立即反應,而是會抑制輸入,直到輸入增強,強大到可以觸發輸出。一些簡單的階躍函式可以實現這種效果,如下圖所示:   在這裡插入圖片描述   改進階躍函式,如下圖所使用的sigmoid函式。書中解釋是:“這個函式,比起冷冰冰、硬邦邦的階躍函式要相對平滑,這使得這個函式更自然、更接近現實。自然界很少有冰冷尖銳的邊緣!”   這點我覺得解釋的不夠,要麼就是這個函式和神經元的機制更像,要麼就是他對預測結果更好,他僅僅是說更平滑,更接近自然,難道更平滑和更接近自然和神經元的機制有關係嗎,還是對預測機制有好處? Sigmoid函式的表達形式如下所示:   在這裡插入圖片描述   Sigmoid函式的優點:一個是它比較簡單,事實上也非常常見,另一個原因是比其他S型函式計算起來容易得多。

3、輸入問題

  現在,整理一下整個神經元的模擬結果,如下圖所示:   在這裡插入圖片描述   書上說:“對於所有這些輸入,我們只需對它們進行相加,到最終總和,作為 S 函式的輸入, 然後輸出結果。 這實際上反映了神經元工作機制。”   後面有說了:“如果組合訊號不夠強大, 那麼 S 閾值函式的效果是抑制輸出訊號。 如果和x足夠大, S 函式的效果就是激發神經元。”   還有:“如果中一些輸入,單個而言一般大,但不是非常大,這樣由於訊號的組合足夠大超過閾值, 那麼神經元也能激發。”   說明了神經元的各個輸入的訊號電量大小是不同的。

4、權重

  本來神經元的結構如下所示:   在這裡插入圖片描述   當前訊號傳到後一個的各個神經元都是一樣的。   但是,為了執行學習功能,為了針對訓練樣本做出調整和反應,為了達到之前線性分類器中斜率類似的引數可以供我們調整的效果,所以給每個連線設定權重。   在這裡插入圖片描述   採用完全連線形式的原因:   (1)、這種一致的完全連線形式事實上可以相對容易地編碼成計算機指令   (2)、神經網路的學習過程將會弱化這些實際上不需要的連線(也就是這些連線的權重將趨近於0),因此對於解決特定任務所需最小數量的連線冗餘幾個連線,也無傷大雅。   (3)、隨著神經網路學習過程的進行,神經網路通過調整優化網路內部的連結權重改進輸出,一些權重可能會變為零或接近於零。零或幾乎為零的權重意味著這些連結對網路的貢獻為零,因為沒有傳遞訊號。零權重意味著訊號乘以零,結果得到零,因此這個連結實際上是被斷開了。

1.7、在神經網路中追蹤訊號

  本節模擬了輸入如何在神經網路中變成輸出的過程。使用的是一個很簡單的神經網路。   如下圖,一個簡單的神經網路示意圖,兩個輸入分別為1.0和0.5,四個權重也已經標在了圖上。   在這裡插入圖片描述   按照下圖的原理進行計算,在前幾節已經做了一些解釋。   在這裡插入圖片描述   則第2層1結點的輸出為:y(x)=y((1.00.9)+(0.50.3))=y(0.9+0.15)=y(1.05)=1/(1+e^(-1.05))=1/(1+0.3499)=0.7408   同理,第2層2結點的輸出為:0.6457   除了計算量大一些,好像並不難。

1.8、憑心而論,矩陣乘法大有用途

  本節用大量的語音解釋了矩陣的點乘的原理,這裡我就不詳細記錄了,都是學過好幾遍的東西。   重點記錄一下關於神經網路的東西。   對於上一節所描述的計算,假設有權值矩陣和輸入值矩陣,並將其做點乘運算,將會得到如下結果:   在這裡插入圖片描述   在來看看上一節的示意圖:   在這裡插入圖片描述   就會發現第2層的兩個結點的輸入,正好和矩陣運算的結果一樣。   所以有結論:X=W·I,此處,W是權重矩陣,I是輸入矩陣,X是組合調節後的訊號,即輸入到第2層的結果矩陣。   所以,第二次的最終輸出O=sigmoid(X),O代表來自神經網路最後一層的所有輸出。   通過神經網路向前饋送訊號所需的大量運算可以表示為矩陣乘法。   不管神經網路的規模如何,將輸入輸出表達為矩陣乘法,使得我們可以更簡潔地進行書寫。   更重要的是,一些計算機程式語言理解矩陣計算,並認識到潛在的計算方法的相似性。這允許計算機高速高效地進行這些計算。 未完待續······

另:一些說明 1、本部落格僅用於學習交流,歡迎大家瞧瞧看看,為了方便大家學習。 2、如果原作者認為侵權,請及時聯絡我,我的qq是244509154,郵箱是[email protected],我會及時刪除侵權文章。 3、我的文章大家如果覺得對您有幫助或者您喜歡,請您在轉載的時候請註明來源,不管是我的還是其他原作者,我希望這些有用的文章的作者能被大家記住。 4、最後希望大家多多的交流,提高自己,從而對社會和自己創造更大的價值。