多層感知機不等於神經網絡?

    在前一章節(https://blog.csdn.net/u012132349/article/details/86166324),我們介紹了感知機可以實現與門、或門、非門。只需給定合適的參數(w1, w2, b)並利用Python就可以簡單實現對輸入的任意(x1,x2),輸出0或1。

    今天我們將介紹感知機的侷限性(嚴格說是單層感知機的侷限性)。這裏我們想用感知機實現異或門,所謂異或門,指的是隻有x1或x2中的一方爲1時,纔會輸出1,真值表如下圖所示:

                                                   

    讀者可嘗試用前面介紹的感知機去實現這個異或門,您可以設置任意的(w1, w2, b)值,看看對輸入的任意(x1,x2),輸出是否一定滿足上圖的條件。實際上,用前面介紹的單層感知機是無法實現這個異或門的。下面我們通過畫圖的方式來分析這個問題。首先,我們試着將前面介紹的與非門的動作形象化,當權重(w1,w2,b)=(-0.5,-0.5,0.7)時感知機可用下式表示:

                                                 

    與非門表明只要有一個輸入信號爲0,則輸出就爲1,上式滿足此條件。該公式表示的感知機生成了由直線0.7-0.5x1-0.5x2=0分割開的兩個空間,如下圖所示,一個空間輸出0,一個空間輸出1。

                                              

    不難驗證,與非門在(x1,x2)等於(0,0)、(1,0)、(0,1)時輸出爲1,在(x1,x2)等於(1,1)時輸出爲0。實際上圖中的那條線就將這四個點正確地分開了。同樣地,我們將異或門的真值表在圖中標記出來。如下圖所示。

                                      

    圖中,(x1,x2)等於(0,0)、(1,1)時輸出爲0,在(x1,x2)等於(0,1)和(1,0)時輸出爲1。顯然已經不能用一條直線將圖中的0和□分割開來。事實上一條直線是無法將它們分割開來的,只能用下圖所示的曲線將它們分割開來。

                                         

    可見,單層感知機的侷限性就在於它只能表示由一條直線分割的空間(稱爲線性空間)。像上圖這樣的彎曲的曲線是無法用單層感知機表示。說明一下,曲線分割的空間稱爲非線性空間

    由上面的分析可知單層感知機無法表示異或門,即單層感知機無法分離非線性空間。因此需要組合感知機(疊加層)來實現異或門,這裏先不考慮疊加層具體是指什麼。在電路專業中,可以通過組合與門、非門、或門實現異或門。如下圖所示。

                                                     

    從圖中可知,x1和x2是與非門和或門的輸入,而與非門和或門的輸出則是與門的輸入。圖中的s1是與非門的輸出,s2是或門的輸出。s1和s2作爲與門的輸入,y作爲與門的輸出。現在給出異或門的真值表如下所示:

                              

   觀察真值表x1、x2、y,可以發現確實符合異或門的輸出。使用Python可輕鬆實現異或門,如下所示:

import numpy as np

def yufei(x1,x2):
    """與非門的實現"""
    x=np.array([x1,x2])
    w=np.array([-0.5,-0.5])
    b=0.7
    value=np.sum(w*x)+b
    if value<=0:
        return 0
    else:
        return 1

def huo(x1,x2):
    """或門的實現,只有參數不一樣"""
    x=np.array([x1,x2])
    w=np.array([0.5,0.5])
    b=-0.2
    value=np.sum(w*x)+b
    if value<=0:
        return 0
    else:
        return 1

def yu(x1,x2):
    """與門的實現,只有參數不一樣"""
    x=np.array([x1,x2])
    w=np.array([0.5,0.5])
    b=-0.7
    value=np.sum(w*x)+b
    if value<=0:
        return 0
    else:
        return 1  

def yihuo(x1,x2):
    """異或門的實現"""
    s1=yufei(x1,x2)
    s2=huo(x1,x2)
    y=yu(s1,s2)
    return y

yihuo(0,0)  #輸出0
yihuo(1,0)  #輸出1
yihuo(0,1)  #輸出1
yihuo(1,1)  #輸出0

    下面用感知機的表示方法來表示這個異或門,如下圖所示。異或門是一種多層結構的神經網絡(簡單來說,就是多層感知機)。這裏將最左邊的一列稱爲第0層,中間的一列稱爲第1層,最右邊的一列稱爲第二層。前面介紹的與門、或門等都是單層感知機,異或門是2層感知機(第0層沒有權重,所以這裏不算)。疊加了多層的感知機也稱爲多層感知機。可見通過疊加層(加深層)能夠進行非線性的表示。

                                              

    上圖中的2層感知機,先在第0層和第1層的神經元之間進行信號的傳遞和接收,然後在第1層和第2層之間進行信號的傳送和接收。通過異或門的實現,我們不難理解,可以通過增加層來實現更復雜的電路,像加法運算的加法器也可以用感知機實現。實際上,只需要通過與非門的組合,就能再現計算機進行的處理,這說明使用感知機也可以表示計算機(當然這不是我們所關心的)。

    本章主要講解了單層感知機的侷限性,並引出2層感知機來表示異或門。這裏提到了多層感知機組成了神經網絡,當然神經網絡沒這麼簡單,但是它和多層感知機是有很多共同點,如果你掌握了文章中介紹的2層感知機,相信對你學習神經網絡是非常有幫助的。後面我們將正式進入神經網絡的學習! 歡迎關注我的博客,有歡迎歡迎關注我的微信公衆號“Python生態智聯”

 

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