深度學習系列(3.2)——神經網絡-sigmoid 神經元

1、weights、bias 參數學習

我們希望有一種學習算法,它能夠自動地調整網絡中的權重因子和偏置。 但是,我們怎樣才能設計出這樣的算法神經網絡?可以通過學習來解決一些問題。假如,網絡的輸入是從掃描的原始像素數據,亦或是手寫數字的圖像。我們希望通過網絡可以自動地學習權重和偏差,使輸出從網絡正確分類的數字。假設我們對網絡上的一些權重(或偏置)做一些小的調整,並且希望網絡上權重因子和偏差也僅有較小的變化,同樣的在輸出網絡中也只產生一個小的改變。我們想象一下這樣的參數學習能否爲自適應的形式?如下圖所示:

這裏寫圖片描述 (1)

假設一個小的權重變化(或偏置)對輸出也產生較小的影響,那麼我們通過這一策略來修改的權重(weight)和偏置(bias),讓網絡學習到更多想要的規則。例如,假設在網絡中圖像“9”被誤分爲“8”時。可以通過校正權重和偏(每次做細小的改變),使網絡變得更接近分類的圖像爲“9”。 最終網絡將循環校正,不斷調整權重(weight)和偏置(bias),使網絡得到更好的輸出結果。

問題並不是想象的這麼簡單,在一個網絡的衆多神經元當中,一個參數的細小改變,也許會發生天翻地覆的變化。實際上,在網絡中的任何一個單一的感知器(神經元)的權重或偏差發生變化,即使是細微的變化,有時會導致輸出完全相反,就像從 0 到 1 的變化。因此,雖然你的“9”可能被正確分類,但是網絡中的感知器就很可能無法學習到爲其它數字分類的‘規則’,這也就使得網絡中參數學習變得極其困難。也許有一些聰明的方法來解決這個問題,顯而易見這不是我們想要的結果。

2、sigmoid 神經元的引入

我們可以通過引入一種人工神經元(即 sigmoid neurons )來克服這個問題。 Sigmoid 神經元類似感知器,它使權重和偏置的微小變化對輸出也產生較小的變化,因而可以達到微調網絡的目的。接下來描述下 sigmoid 神經元:
這裏寫圖片描述(2)

和感知器一樣,這裏 sigmoid 神經元有輸入: x1,x2,x3,.... , sigmoid 神經元對於每一個輸入都有weightsw1,w2,w3,.... 和一個共有的偏置 b 。不同的是,sigmoid 的輸入並不是只能爲 0 or 1 ,它可以是 01 中的任意值。 輸出也不僅僅是 0 or 1,取而代之的是 σ(wx+b) 。 這裏的 σ 就叫做 sigmoidfunctions 定義爲:
這裏寫圖片描述(3)

上式中,將輸入、即參數帶入,形式上可以寫爲:
這裏寫圖片描述(4)

2.1、sigmoid 原理

僅從數學公式上看,sigmoid 神經元和感知器很不同。事實上,感知器和Sigmoid 神經元之間有許多相似之處。

爲了更詳細地瞭解感知器模型,假設 zwx+b 爲一個極大的正數。 那麼 ez0 ,則 σ(z)1 。換句話說,也就是當 zwx+b 爲一個很大的正數,sigmoid 神經元的輸出近似的爲 1 ; 如果zwx+b 爲極小的負數,那麼 ez,σ(z)0

sigmoid function:

這裏寫圖片描述

smoothed step function:

2.2、Sigmoid function

假如σ 的表現形式爲 階躍函數(step function ) ,那麼sigmoid 就是個普通的感知器 ,根據 wx+b 爲正還是負,決定輸出爲 0 or 1 。但實際上,sigmoid 神經元工作方式爲:平滑的 σ 函數表明,權重 Δwj 和 偏置 Δb 細微的改變,輸出 Δoutput 也只產生細微的變化。因而,Δoutput 可以近似的表示爲:

這裏寫圖片描述(5)

這裏 Δoutput 是一個有關於權重(weights )變化量 Δwj 和偏置(bias )變化量Δb 的線性函數。這種線性函數更有利於網絡對 weightsbias 進行微調,以至於感知器可以儘可能地學習到“想要”的規則。/font>

3 總結

我們該如何去闡述 sigmoid 神經元的輸出,很明顯,與感知器所不同的是,sigmoid 神經元的輸出不只侷限在 0 or 1 。它的輸出可以是 0 到 1 之間的任意數值,如 0.124…,0.864…。這樣的改變,將對整個神經網絡產生質的變化。

代碼實現:

class Network(object):

    def __init__(self, sizes):
        self.num_layers = len(sizes)
        self.sizes = sizes
        self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
        self.weights = [np.random.randn(y, x) 
                        for x, y in zip(sizes[:-1], sizes[1:])]
    def sigmoid(z):
        """
        sigmoid 函數實現
        """
        return 1.0/(1.0+np.exp(-z))
發佈了52 篇原創文章 · 獲贊 215 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章