【Neural Networks and Deep Learning】4.神經網路可以計算任何函數的可視化證明(1)

神經網路的一個最顯著的事實就是它可以計算任何的函數。也就是說,假設某個人給你某種

複雜而奇特的函數,f (x):

不管這個函數是什麼樣的,總會確保有一個神經網路能夠對任何可能的輸入 x,其值 f (x)

(或者某個足夠準確的近似)是網路的輸出,例如:

即使函數有很多輸入和輸出,f = f (x 1 , . . . , x m ),這個結果都是成立的。結果表明神經網路擁有一種普遍性。不論我們想要計算什麼樣的函數,我們都確信存在一個神經網路可以計算它。

有一篇原始的論文使用了哈恩?巴拿赫定理定理、里斯表示定理和一些傅里葉分析證明了這個結果。

4.1兩個預先聲明

第一點,這句話不是說一個網路可以被用來準確地計算任何函數。而是說,我們可以獲得儘可能好的一個近似。通過增加隱藏元的數量,我們可以提升近似的精度。

為了讓這個表述更加準確,假設我們給定一個需要按照目標精度 ε > 0 的函數 f (x)。通過使用足夠多的隱藏神經元使得神經網路的輸出 g(x) 對所有的 x,滿足 |g(x) ? f (x)| < ε 從而實現近似計算。換言之,近似對每個可能的輸入都是限制在目標準確度範圍內的。

第二點,就是可以按照上面的方式近似的函數類其實是連續函數。如果函數不是連續的,也就是會有突然、極陡的跳躍,那麼一般來說無法使用一個神經網路進行近似。然而,即使那些我們真的想要計算的函數是不連續的,一般來說連續的近似其實也足夠的好了。

總結一下,更加準確的關於普遍性定理的表述是包含一個隱藏層的神經網路可以被用來按照任意給定的精度來近似任何連續函數。


開始證明


4.2一個輸入和一個輸出的普遍性

先從理解如何構造這樣一個神經網路開始,它能夠近似一個只有一個輸入和一個輸出的函數(它有兩個隱藏神經元):

首先專註於最頂上的那個隱藏神經元。在下圖例子中,展示了頂部隱藏神經元的權重 w,偏置 b 和輸出曲線的關係。

隱藏神經元在計算的是 σ(wx + b),這裡 σ(z) ≡ 1/(1 + e ?z ) 是S 型函數。

開始,增加偏置 b 的值。當偏置增加時,圖形往左移動,但是形狀不變。接下來,減小偏置。當偏置減小時圖形往右移動,但是再一次,它的形狀沒有變化。繼續,將權重減小到大約 2 或 3。當你減小權重時,曲線往兩邊拉寬了。你可以同時改變偏置,讓曲線保持在框內。最後,把權重增加到超過 w = 100。當你這樣做時,曲線變得越來越陡,直到最終看上去就像是一個階躍函數。試著調整偏置,使得階躍位置靠近 x = 0.3。下面一個圖示顯示你應該看到的結果。

你能給權重增加很大的值來簡化分析,使得輸出實際上是個非常接近的階躍函數。下面畫出了當權重為 w = 999 時從頂部隱藏神經元的輸出。

處理階躍函數比一般的 S 型函數更加容易。原因是在輸出層我們把所有隱藏神經元的貢獻值加在一起。分析一串階躍函數的和是容易的,相反,思考把一串 S 形狀的曲線加起來是什麼則要更困難些。所以假設我們的隱藏神經元輸出階躍函數會使事情更容易。更具體些,我們把權重 w 固定在一個大的值,然後通過修改偏置設置階躍函數的位置。

x 取何值時階躍會發生呢?階躍發生在 s = ?b/w 的位置。

我們隱式地設置輸入上的權重 w 為一些大的值 —— 大到階躍函數能夠很好地近似。通過選擇偏置 b = ?ws,我們能很容易地將一個以這種方式參數化的神經元轉換回常用的模型。

目前為止我們專註於僅僅從頂部隱藏神經元輸出。看看整個網路的行為。

假設隱藏神經元在計算以階躍點 s 1 (頂部神經元)和 s 2 (底部神經元)參數化的節約函數。它們各自有輸出權重 w 1 和 w 2 。是這樣的網路:

右邊的繪圖是隱藏層的加權輸出 w 1 a 1 + w 2 a 2 。這裡 a 1 和 a 2 各自是頂部和底部神經元的輸出 。這些輸出由a 表示,是因為它們通常被稱為神經元的激活值(activations)

試著設置 w 1 為 0.8,w 2 為 ?0.8。你得到一個「凸起」的函數:

當然,我們可以調整為任意的凸起高度。讓我們用一個參數,h,來表示高度。

試著將 h 值改大或改小,看看凸起的高度如何改變。試著把高度值改為負數,觀察發生了什麼。

順便提一下,你會注意到,我們用神經元的方式,可以認為不只是在圖形的?度,而且是更傳統的編程形式,作為 if-then-else 的一種聲明,即:

if input >= step point: add 1 to the weighted outputelse: add 0 to the weighted output

我們可以用凸起製作的技巧來得到兩個凸起,通過把兩對隱藏神經元一起填充進同一個網

絡:

更普遍地,我們可以利用這個思想來取得我們想要的任何高度的峰值。尤其,我們可以把間隔 [0, 1] 分成大量的子區間,用 N 表示,並利用 N 對隱藏神經元來設置任意期望高度的峰值。讓我們看看 N = 5 這如何工作。

每對神經元對應的連接點是 0, 1/5,然後是 1/5, 2/5 等等,最後到4/5, 5/5。這些值是固定的??它們使得我們在圖形上得到五個均勻分布的凸起。


回想在本章開始繪製出的函數:

f (x) = 0.2 + 0.4x 2 + 0.3x sin(15x) + 0.05 cos(50x)

x 取值範圍從 0 到 1,y 軸取值為 0 到 1。

解出如何使用一個神經網路來計算它。網路輸出的是 σ( sum_{j} w _j a_ j + b) ,其中 b 是在輸出神經元的偏置。有什麼辦法可以實現對網路的實際輸出控制嗎?

解決方案是設計一個神經網路,它的隱藏層有一個加權輸出 σ ^{?1} ? f (x) ,其中 σ ^{?1} 是 σ 函數的倒數。也就是說,我們希望從隱藏層的加權輸出是:

一個完成的圖形看起來像是這樣。

這只是一個粗略的近似,但我們可以很容易地做得更好,僅僅通過增加隱藏神經元對的數量,分配更多的凹凸形狀。

快速總結一下那是如何工作的。

第一層的權重都有一些大的,恆定的值,比如:w = 1000。隱藏神經元上的偏置只是 b = ?ws。例如,對於第二個隱藏神經元 s = 0.2 變成了 b =?1000 × 0.2 = ?200。最後一層的權重由 h 值決定。例如,我們上面已經選擇的第一個 h,h = ?0.5,意味著頂部兩個隱藏神經元的相應的輸出權重是 ?0.5 和 0.5。如此等等,確定整個層的輸出權重。最後,輸出神經元的偏置為 0。

h沒看懂是什麼????????

推薦閱讀:

Inception-v2/v3結構解析(原創)

TAG:深度學習DeepLearning | 神經網路 |