在這篇和接下來的幾篇文章中,我們將用最通俗的語言介紹機器學習中的神經(jīng)網(wǎng)絡概念和算法思路,盡可能讓每個普通人都能聽懂。
什么是神經(jīng)網(wǎng)絡NN(artificial neural network)?
就是用數(shù)學算法和計算機,參照動物(包括人類)大腦的神經(jīng)結(jié)構(gòu),建立的模擬系統(tǒng),科學家們希望以這樣的方式不斷進化擴展,能夠模擬人類大腦的行為和能力。
簡單說NN就是電子神經(jīng)大腦。
人類大腦主要有三個關鍵要素:數(shù)以百億的神經(jīng)元,更加龐大的互相交錯的神經(jīng)元之間的連接,以及這些神經(jīng)元和連接是如何運作的機制。
什么是神經(jīng)元(neuron)?
人類大腦的神經(jīng)元是我們思維的基礎,我們之所以能夠看聽讀寫,進行各種思考都是大腦里800多億神經(jīng)元共同作用的結(jié)果。
粗糙的說,神經(jīng)元有兩種狀態(tài):激活(active),或未激活(inactive)。就像燈泡,開燈發(fā)光,還是關燈。
我們頭腦里的每個念頭,本質(zhì)上都是不同組合的神經(jīng)元被點亮。
比如我們腦海里浮現(xiàn)出“貓”這個概念的時候,可能只是第187、2933、1223、90、22323...3912等幾千萬個神經(jīng)元被點亮。就像我們看到電視屏幕上出現(xiàn)一個“貓”字的畫面,但本質(zhì)上是電視屏幕數(shù)百萬個像素被不同點亮而已。

學習人工智能之前,請務必放下人類的高傲,從科學上認識我們自己的大腦。我們的意識之所以存在,只是神經(jīng)元不停的變化而已,就像電視一直打開,像素一直閃爍變化一樣。一旦電視關閉,所有神經(jīng)元就很快完全停止下來,我們也就死亡了。
但我們和電視機不同,電視機每個像素之間并沒有互相關聯(lián)互相作用,像素完全是被動點亮熄滅。所以雖然電視里的卡通角色雖然鮮活,但我們都知道那是假的。
誰來開燈(active)?
是誰在不斷點亮我們大腦中數(shù)以百億的神經(jīng)元?
當我們還未出生時候,當細胞還在分裂的時候,我們的神經(jīng)元才出現(xiàn)的時候,它就啟動了。
每個神經(jīng)元不僅自己忽明忽暗的變化著,而且能夠通過通過連接向其他數(shù)以千計的神經(jīng)元傳遞信號,也能接受其他神經(jīng)元傳遞過來的信號,并且能夠根據(jù)這些傳入的信號再調(diào)整發(fā)出新的信號。
這就像一張網(wǎng),所有神經(jīng)元互相影響,互為輸出輸入,互為因果,互相激活,互相抑制。

這里僅是粗糙的說法,即使目前科學家也還沒有能完全準確的描述人類大腦活動的細節(jié)機制。
如何形成意識?
首先我們必須明確,腦海里閃現(xiàn)的念頭只不過是不同神經(jīng)元組合被激活。
對于某一批神經(jīng)元被激活的這個狀態(tài),我們可能叫做貓,也可能叫cat,也可以叫第87893中激活組合。
不停的有神經(jīng)元被重新激活,同時也有很多已經(jīng)激活神經(jīng)元被抑制,變?yōu)槲醇せ顮顟B(tài)。這種不停的變化,就是我們的思想。
如果我們用心體驗,就會發(fā)現(xiàn),我們腦海里閃現(xiàn)的只是文字概念,而不是曾經(jīng)被記憶的現(xiàn)實事物。我們腦海里會浮現(xiàn)“綠”字,但并沒有綠色,綠色只存在于我們的視覺系統(tǒng)。
所以,人類意識的最小單元是文字字符,或者說是數(shù)字符號而已。
神經(jīng)元的激活值Activation
目前人工神經(jīng)網(wǎng)絡中的神經(jīng)元還是極簡陋的,原則上只是一個數(shù)字,代表了這個神經(jīng)元被激活的程度,比如我們規(guī)定0是未激活,1是全激活,那么0.5就是半激活的中間狀態(tài)。
這個數(shù)字我們就叫做激活值activation。

激活函數(shù)Activation function
由于我們使用計算機來模擬神經(jīng)元,通過外部輸入過來的信號計算這個activation激活值,有時候可能計算得到很大的數(shù)字比如幾百多,那么就會導致各個神經(jīng)元的激活值有的很大有的很小,而我們還是希望把它縮小到0~1之間更合理。
這時候我們會對直接計算的激活值進行一下處理,把它對應到0~1之間,最常用來做這個處理的函數(shù)就是Sigmoid函數(shù):

也就是說:

這里e是自然常數(shù),固定值,就像π那樣,e的近似值2.718。e-x相當于1/ex,這樣我們知道,x無限小的負數(shù)時候,1/ex就是e|x|,趨于無限大,而1/(1+e-x)趨于0;而x是無限大正數(shù)的時候,e-x就是1/e|x|,趨于0,1/(1+e-x)趨于1;正好落在0~1之間。
但Sigmoid是個曲線函數(shù),要乘方還要取倒數(shù),對于數(shù)以萬億次的計算來說還是太復雜了,而且由于曲線過渡也太平滑,不利于干凈利落的區(qū)分激活或不激活兩種狀態(tài)。所以后來大家就更多的改用RELU函數(shù)(rectified linear unit)。

RELU是相當?shù)暮唵未直攁<0的時候,返回0;當a>0的時候,返回a。也就是如果直接算出來的激活值是負的,那么就直接改為0未激活,如果是正的,那么就保留這個值不變?!獩]錯,它并不在0到1之間,而是0到無窮大,所以一般還需要后續(xù)處理的,這在后面文章中會提到。
逐層抽象Layer
我們上面粗略的談到神經(jīng)元、神經(jīng)網(wǎng)絡和意識,意識就是神經(jīng)網(wǎng)絡中不同神經(jīng)元被點亮的狀態(tài)。
對于抽象的字符,人類大腦需要經(jīng)過大量反復的訓練,才能把眼睛看到的其他人隨手寫下的9字抽象成為“9”這個概念的。

我們來逐層分解上面這個圖。
首先是視網(wǎng)膜獲得數(shù)以千萬計的顏色信息(我們假設黑白圖片只有亮度信息),我們可以理解每個視網(wǎng)膜細胞就是一個神經(jīng)元,代表著一個表示顏色的數(shù)字,視網(wǎng)膜細胞就是一個神經(jīng)元,它的亮度數(shù)字就是激活值。

視網(wǎng)膜層上的神經(jīng)元捕獲了圖像,但并不能思考。它們把數(shù)據(jù)通過神經(jīng)元連接傳遞到下一層,下一層也包含了很多的神經(jīng)元,并且每個神經(jīng)元會從視網(wǎng)膜層數(shù)千萬的激活值中尋找到一些小的圖案,比如一個小橫線、小弧線之類。
每個不同小圖案對應了不同的神經(jīng)元,比如靠近下面的小橫線對應這一層的第3個神經(jīng)元,當我們發(fā)現(xiàn)視網(wǎng)膜傳來的圖像數(shù)據(jù)中包含靠下的小橫線的時候,就點亮它。當然,我們看到的圖像是復雜的,包含很多小圖案,所以在這一層也就會點亮很多神經(jīng)元,但肯定不會有前面視網(wǎng)膜層數(shù)千萬那么多。

從輸入層數(shù)千萬輸入數(shù)據(jù),變?yōu)榈?層數(shù)千個,這就是神經(jīng)元逐層抽象的過程。
我們把視網(wǎng)膜層叫輸入層Input layer,計做第0層,識別小圖案的一層算是第1層,因為我們實際上也搞不懂這一層到底是怎么識別的是哪些具體圖案,這層很神秘,我們把這樣的神秘層叫做隱藏層Hidden layer。你可以自己體驗一下,我們看到貓的時候直接就識別了,完全不知道自己怎么做到的。
然后,第1層又會繼續(xù)傳遞下去到達后面一層神經(jīng)元,到達第2層。
第2層會用同樣的方法,利用從第1層傳來的數(shù)千神經(jīng)元激活值(表示各種各樣的小圖案),從中識別出更高級一些的圖形內(nèi)容,比如小圖案拼接成的小圓圈。

第2層我們也搞不懂到底是具體怎么進行的,也是神秘的,仍然是隱藏層。
如果繼續(xù)下去,可能有很多隱藏層,逐層抽象。直到最后一層,從前一層是別的圖形中直接可以識別出我們想要的“9”數(shù)字概念。

最后這一層我們叫做輸出層,在上面的示意圖中是最右面的第3層。
這里中間第1和第2兩個隱藏層都是任意示意的16個神經(jīng)元;最右面只有0~9共10個神經(jīng)元,這也是極簡化的示意情況。
權(quán)重weight和偏置bias
讓我們回到神經(jīng)網(wǎng)層級圖。

我們看到每一個神經(jīng)元的激活值都是前一層所有神經(jīng)元連接激活的結(jié)果(輸入層除外):

這個算法很簡單,每個神經(jīng)元都等于前一層所有神經(jīng)元的加權(quán)和(每個前一層神經(jīng)元激活值a,乘以它的權(quán)重w,然后加在一起),再經(jīng)過激活函數(shù)Sigmoid或RELU處理。
注意上圖還包含了一個Bias偏置值,用來限定被激活函數(shù)處理之前的最小值。
我們進一步考慮整個第n層的情況,那么就可以把它表示成一個由前一層所有神經(jīng)元權(quán)重組成的矩陣,乘以前一層所有神經(jīng)元激活值組成的向量,然后加上第n層每個神經(jīng)元對應的偏置值,得到的是一個向量,對應了第n層每個神經(jīng)元的激活值。

矩陣乘以向量規(guī)定:
向量加法規(guī)定A(X1,Y1) B(X2,Y2),則A+B=(X1+X2,Y1+Y2),得到新的向量。
圖中的σ(希臘字母西格瑪)代表的就是激活函數(shù):
將以上算法整合展開就是:

遠未結(jié)束
我們再回看這個圖:

似乎我們已經(jīng)完全掌握了每個神經(jīng)元的算法,但根本沒有!
因為這張圖只是我們希望的樣子,也就是每個權(quán)重w和每個偏置b都是恰恰好的時候,最終右側(cè)輸出層才能像我我們希望的那樣點亮正確代表數(shù)字的神經(jīng)元。
什么樣的權(quán)重和偏置才是恰恰好的?
先說我們有多少個權(quán)重和偏置需要恰恰好呢?對于這個28x28=784個像素的輸入值,如果我們?nèi)鐖D有2個隱藏層每層16個神經(jīng)元,那么第1層每個神經(jīng)元需要784個權(quán)重w,共784x16=12544個w,以及16個偏置b;第2層需要16x16+16=256個權(quán)重w和16個偏置b;第三層需要10x16=160個權(quán)重和10個偏置b;這些加在一起是:
12544+256+160+16+16+10=13002
共有1萬3千多個數(shù)字要恰恰好才能實現(xiàn)正確的分類!
機器學習的過程其實就是尋找著1萬3千多個恰恰好的數(shù)字的過程,在下一篇文章中繼續(xù)介紹。
本篇回顧
- 意識就是不同批次神經(jīng)元不斷被激活或被抑制
- 神經(jīng)元就是一個決定它是否被激活的數(shù)字
- 或者一個可以計算出數(shù)字的函數(shù),比如Sigmoid或RELU
- 算法就是前一層所有神經(jīng)元激活值的加權(quán)和再加上偏置值
- 神經(jīng)網(wǎng)絡層就是一個權(quán)重矩陣×激活值向量+偏移值向量得到的一個向量
讓知識變得簡單
如果您發(fā)現(xiàn)文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,感謝轉(zhuǎn)發(fā)~
END

