神經網絡中的sigmoid函數

1、weights、bias 參數學習

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

這裏寫圖片描述 (1)

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

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

2、sigmoid 神經元的引入

我們可以通過引入一種人工神經元(即 sigmoid(function () { 神經元:
這裏寫圖片描述(2)

和感知器一樣,這裏 sigmoid 。 定義爲:
這裏寫圖片描述(3)

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

2.1、sigmoid 原理

僅從數學公式上看,sigmoid 神經元之間有許多相似之處。

爲了更詳細地瞭解感知器模型,假設 zwx+b

sigmoid

這裏寫圖片描述

smoothed

2.2、Sigmoid function

假如σ 可以近似的表示爲:

這裏寫圖片描述(5)

這裏 Δoutput 進行微調,以至於感知器可以儘可能地學習到“想要”的規則。/font>

3 總結

我們該如何去闡述 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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;var numbering = $('
    ').addClass('pre-numbering').hide(); (this).addClass(hasnumbering).parent().append( numbering); for (i = 1; i
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章