【機器學習】一個例子帶你瞭解神經網絡是什麼

之前寫過一篇文章:【機器學習】機器學習是什麼意思

裏面只是簡單地說明了一下機器學習是什麼

然而很多初學者誤以爲,機器學習=神經網絡

其實機器學習是一個學科,裏面包含了深度學習、深度神經網絡、神經網絡等......

神經網絡可以說是人工智能的 “ HELLO WORLD!”

所以瞭解什麼是神經網路還是十分必要的~

——————————————下面是正文————————————————

注意:在繼續往下面看時,請把你電腦上有關於神經網絡的網頁通通關掉,專注看我這篇就好了~如果看得越多反而越亂喔!

———————————————真·下面是正文——————————————

       神經網絡最擅長用於分類以及迴歸問題上,下面將通過講解一個神經網絡入門級例子(神經網絡的 “HELLO WORLD!”):識別手寫數字,來了解神經網絡是什麼。識別手寫數字簡單來說是指通過傳入一張帶有數字的照片給程序,程序可以自動識別出該數字是多少。比如現在我有這樣一張照片:

                                                                    

       ps:因爲該圖片是經過了我進行了圖像處理的結果,將照片壓縮到了28x28,然後進行了灰度變換等一系列處理後再放進神經網絡進行推理的結果,所以照片會變得用肉眼看起來十分模糊,但是關係不大,只要計算機可以識別就行。

       將這張照片丟到程序裏面後,程序經過識別以及推理,將得出一個結果:

                                                                  

       計算機之所以能夠得到這個結果,是因爲我已經在之前對這個程序進行了 “ 學習 ”,在未經任何學習時,程序就像一個初生的嬰兒,並不能識別任何東西,你能指望一個嬰兒可以識別數字1—10麼?但是隨着年齡的增長,嬰兒逐漸接觸數字的機會越來越多,學習的機會也就越來越多,當學習到了一定的程度,就可以正常地經行識別數字1—10 了,而在學習的過程中,嬰兒的大腦中對於數字的神經元就會被刺激,隨着學習的次數越來越多,大腦負責數字識別的神經元就會變得越來越靈敏,準確率越來越高,最終在到達一定的年齡時可以非常簡單的識別出數字來。

       程序亦是如此,剛開始時程序並不能識別任何東西,我們需要不斷地對程序進行學習,使得程序對識別數字越來越敏感,準確率越來越高。所以機器學習分爲 ” 學習 “ ” 推理 “ 兩個階段的原因就是如此。 

        那麼程序究竟是什麼進行學習的呢?       我們使用的是神經網絡,所以學習其實就是讓神經網絡進行學習啦~

        那麼學習要學到什麼程度呢?    這個需要看程序員自己來定,學習的樣本(一般至少幾萬張吧)越多,次數越多效果可能更好(注意:學習次數多並不會使得準確率越高,有可能適得其反,選擇合適的算法可能比單純多次學習好很多)

一.神經網絡的學習過程

       “ 神經網絡 ”,顧名思義,就是由衆多的神經元組成的網絡,而這個網絡則是仿照我們人類的大腦中神經,通過不斷學習來刺激網絡中的每個記憶神經,使得我們對事物產生自己的見解:

                              

       學過生物的同學都知道,人腦神經網絡最基本單位是:神經元(如圖上的發光點),神經元通過相互連接來傳遞介質,及時應對外界傳來的各種信息,所以,我們人工智能中神經網絡的最小單位也是神經元。下面我們給出一個簡單的神經網絡,方便我們理解:

              

        如上圖所示,每層都只有一個神經元,傳入的信號經過多層神經元的處理後,將變爲一種可以處理的結果輸出,而每個神經元裏面的數字即代表傳入信號在傳入神經元之後的處理結果。在神經網絡中,我們對於每一層都有着這樣的規定:

          

        每層的神經元數量以及中間層的層數都是不確定的,可以是任意多個,具體由多少個,是程序員自主手動設置的(看心情/按需分配),所以以下這樣也是可以的:

                          

     而在本例中(識別手寫數字),我們可以設置輸入層的神經元一共有784個(因爲照片的像素是28X28,一共784個像素),輸出層的神經元一共10個(數字0到9一共10個),中間層分爲一層,15個神經元(當然,你設置100層,每層100個神經元也可以)。這樣設置主要是爲了美觀,設置完成之後如圖下所示:

                                           

        而後,我們將照片壓縮爲28X28(784個像素點)大小的尺寸: 

                                                                                   

         其中每一個格子中都存有一個數值(至於這個數值是怎麼的來的,可以參考我以前寫過的文章:【計算機視覺】數字圖像以及圖像處理的基本步驟),該數值的範圍在1(白色)至0(黑色)之間浮動,代表了這個格子的像素值: 

                                                                              

注意:像素值已經經過了歸一化處理,使得像素值在1~0區間浮動,而沒有經過歸一化處理的像素值則是在0~255之間浮動。

          將照片的784個像素值通過第一層神經元傳輸進入輸入層,每個神經元中既有指定的數值:

                                    

            然後數據經過神經元的層層計算,最後得出一個結果:

                                      

       我們將程序計算得出的結果(也稱實際結果)與預測結果(也稱訓練標籤)相比對,發現結果是正確的,那麼我們就可以保留每個神經元的計算參數,不再繼續學習。如果實際的結果並非如我們所想(比如照片裏面的數字是“7”,但程序傳出的結果卻是“2”之類),那麼我們就需要對這個程序說:我辛辛苦苦找了一個這麼漂亮的數字給你,而你卻傳出一個錯誤的結果給我???你是在zuo si 嗎??讓程序自己感到慚愧,讓它重新進行計算,更新各個神經元的計算參數,直到可以正確地識別結果爲止

       而 “ 因程序傳出來一個錯誤的結果從而需要重新計算 ” 的實現過程,有很多實現的方法,比較常見的方法是:使用反向傳播法使得輸出結果的梯度下降至最低的方法(也可以稱爲梯度下降法),至於這個方法具體實現可以在百度上獲取,也可以參考我寫的文章:【機器學習】一個例子帶你瞭解監督學習中數據集、假設/代價/損失函數、梯度下降法等深奧概念是什麼意思

       那麼從宏觀上知道了神經網絡是怎麼進行學習的了,接下來再來了解下各個神經元是如何進行計算的

二.神經元的計算過程

      我們抽取其中一小部分的神經元進行說明:

                                            

      把神經元想象成一個裝數據的容器,神經元把數據往下一層傳遞時,數據會發生變化,是由於在神經元中經過了計算的結果,每個神經元可能會接收到不止一個輸入信號(在本例子中,輸入層每個神經元單獨接收一個像素的值,但是中間層的神經元則是每一個神經元都接收了上一層的784個神經元的信號):

                                            

       上圖可以看到是一個神經元接收三個輸入信號的例子,其中x1、x2、x3是輸入信號,w1、w2、w3是權重參數,B1是偏置參數,輸入信號被傳送到神經元時,會被分別乘以固定的權重(權重表示該輸入信號對於整個計算過程的重要性,如本例中照片的角落處像素值由於對識別數字貢獻不了什麼價值,所以重要性最低,所以權重可以爲0),然後計算總和,最後加上偏置參數(偏置表示該神經元被激活的容易程度),所以,當輸入信號經由網絡傳入到神經元之後,神經元經過計算將得到一個數值,公式可以表示爲:

                                                                

       ps:對於權重和偏置想要更爲了解可以參考我寫的一篇文章:【機器學習】機器學習是什麼意思

       神經元經過以上計算之後,還不能將數值直接往下傳遞,還需要通過一種叫激活函數(也稱傳遞函數)計算出最終的結果才能往下一個神經元進行數值傳遞,至於什麼是激活函數,可以參考我寫的文章:【機器學習】激活函數/傳遞函數

三.最後的反向傳播

        經由各層神經元的計算後,數值會來到最後一層輸出層,輸出層的神經元計算與其他層無異,唯一有所區別的就是在學習階段中,輸出層最終所得到的結果需要經由損失函數的計算來得知計算結果與預測結果相差多大,從而告知程序進行重新計算,而計算機可以做的就是根據損失函數所得到的結果(損失函數顧名思義的出來的結果是損失值,所以損失函數的結果越低,程序識別數字的準確率就越高),通過從輸出層到輸入層方向計算,重新將各個神經元的權重和偏置進行更新,使得損失函數的值降到最低。有關損失函數可以參考我寫的文章:【機器學習】損失函數

       至此,一個簡單的神經網絡學習過程就介紹完了,有關於 “識別手寫數字” 這個例子的代碼實現,有時間的話我會寫一篇文章,屆時我會在這裏更新地址,如果沒有的話就是還沒有寫(這個肯定會寫滴)~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章