文章導讀:git
1. 兩個前提數組
2. 單輸入單輸出的狀況網絡
3. 通常情形:多輸入多輸出狀況 app
4. 使用sigmoid之外的神經元函數
5. 修正階躍函數spa
6.總結設計
神經網絡最使人激動的一個性質,就是它能夠實現任意功能的函數。並且是即便對於只有一個隱藏層的神經網絡,這個結論依然成立。3d
大部分神經網絡的使用者都知道這個性質,可是並不理解爲何神經網絡會有這樣的性質。而其理論證實對於非數學專業的同窗來講並很差理解,因此本章旨在用直觀的方式幫助你們理解這個性質。對象
神經網絡能夠計算任意函數實際上是有前提的。blog
首先要明白的是它並非能夠徹底準確的計算原函數的值,可是經過增長隱藏層神經元的值咱們能夠愈來愈逼近原函數。就是說對於一個須要實現的函數$f(x)$,要求實現精度爲$\epsilon > 0$,也就是須要足夠的隱藏層神經元使得神經網絡輸出$g(x)$知足$|g(x) - f(x)| < \epsilon$對全部輸入$x$。
第二個前提是被模擬的函數是連續函數,不過有的時候對於非連續函數,神經網絡獲得的連續近似已經足夠知足要求了。
先考慮最基礎的單輸入單輸出的函數狀況。爲了理解怎麼利用神經網絡去計算給定函數$f$,咱們先考慮只有一個隱藏層的狀況,其中含有兩個神經元。
考慮隱藏層第一個神經元,其輸出由$\sigma (wx+b)$決定。改變其參數$w$和$b$能夠發現以下規律:
繼續增大$w$的值使得其輸出更加接近階躍函數:
當咱們對隱藏層的神經元的輸出進行加權求和的時候,分析階躍函數要比分析sigmoid函數容易。咱們很容易能夠知道兩個階躍函數的和是什麼形式,可是對於兩個sigmoid函數就沒有這麼容易獲得。因此咱們先假設這些神經元輸出函數就是階躍函數,固然這也是一種近似,咱們隨後再看這和真正的狀況相比會有什麼影響。
再考慮另一個問題,咱們知道標準的$\sigma (z)$的中點在$z=0$處,當它近似爲一個階躍函數的時候,階躍點在哪呢?容易知道就是在$wx+b = 0$處,即$s = -\frac{b}{w}$。因而對於已經近似被認爲是階躍函數的神經元就能夠只用一個參數$s = -\frac{b}{w}$來代替以前的兩個參數$w$和$b$。
接着再來考慮整個神經網絡的狀況。
右邊展現的是加權輸出的結果$w_1 a_1 + w_2 a_2$,其中$a_1$和$a_2$分別是隱藏層兩個神經元的輸出。不過注意到這裏神經網絡最終的輸出爲$\sigma (w_1 a_1 + w_2 a_2 +b)$。
經過調節這些參數能夠觀察到:
最後,試着讓$w_1 = 0.8, w_2 = -0.8$,而後$s_1 = 0.4, s_2 = 0.6$就獲得一個在(0.4, 0.6)上的門函數:
若是咱們固定$s_1$和$s_2$,而後$w_1 = -w_2$,這樣就能夠將門函數看做是隻有一個參數$h$的模型,其中$h = w_1$,對應着就是門函數的「門梁」的位置。
經過組合神經元咱們就能夠輕易獲得兩個門函數組合的狀況:
一樣的方法,咱們能夠構造任意數量任意高度的門函數。由於對於[0,1]這個區間的劃分是能夠有無限多N個的,只要使用N對隱藏層神經元就,而後分別配上對應的$h$就能夠達到要求了。
上圖就是一個五個寬度同樣的門函數的情形,高度由各自的參數$h$決定。可是僅僅這樣就能說明神經網絡能夠計算任意函數嗎?看下面這個例子:
這個函數來自:
$$f(x)=0.2 + 0.4x^2 + 0.3x sin(15x) + 0.05 cos(50x) \quad (113)$$
看上去這個函數形式和神經網絡徹底沒什麼聯繫,接下來就來看看神經網絡是怎麼去近似計算它的。
前面提到過$w_1 a_1 + w_2 a_2 + ...$並非神經網絡最終輸出,最終輸出爲$\sigma (\sum_j w_j a_j + b)$,那麼爲了讓最終輸出爲須要的函數$f(x)$,就要求$\sigma$函數的輸入爲$\sigma^{-1} (f(x))$,即隱藏層輸出的加權和爲$\sigma^{-1} (f(x))$,其中$\sigma^{-1}$爲$\sigma$的反函數。
因而只要有方法可讓隱藏層輸出和近似等於上面反函數,就至關於神經網絡的最終輸出近似等於$f(x)$了。對於上面五個門函數的情形,經過調節各自的$h$獲得符號近似要求的結果:
這雖然只是一個粗略的近似,結果也不惟一,可是隻要經過增長門函數的個數,即增長隱藏層神經元的個數,就可讓結果愈來愈精確。將這個獲得的模型轉換到咱們的神經網絡參數上,隱藏層的$w$取了很大的數$w=1000$,因爲$s=-\frac{b}{w}=0.2$,獲得$b = -1000*0.2=-200$。
輸出層的權重由$h$決定,例如第一個$h=-1.3$,說明它表明的兩個權重分別爲-1.3和1.3,以此類推,輸出層的bias這裏被設置爲0。
這樣就完成了經過構造一個神經網絡來逼近目標函數的目的了,並且經過增長隱藏層神經元的個數可使得這個近似結果更加準確。事實上,咱們的目標函數$f(x)=0.2+0.4x^2+0.3sin(15x)+0.05cos(50x)$的形式可有可無,本質上咱們使用一個單層神經網絡構建了一個lookup表,不一樣區間對應不一樣的值,區間分的越細小,就越準確。
先考慮兩個輸入的狀況:
咱們將$x$和$y$看做是變量,其加權輸出和爲因變量,這樣就將以前的平面圖像轉變爲了3d圖像,不妨先設$w_2 = 0$,這樣圖像爲:
能夠看到平行於x軸的任意截面都是以前看到的平面上的曲線形式。一樣的原理,改變$w_1$和$b$分別改變曲線的形狀和位置。一樣將$w_1$設定爲一個很大的數,曲線轉變爲階躍函數,位置爲$s_x = -\frac{b}{w_1}$:
這裏對應着$w_1 = 1000, w_2 = 0$。一樣能夠設定$w_2 = 1000, w_1 = 0$這樣就成了平行於y軸的曲線:
接着經過組合,咱們獲得了對應門函數的一個3d狀況:
注意這裏的y並無起到做用,和y相連的權重都被設置成了0。相似也有隻有y的版本,將和x的相連的權重設置爲0:
若是咱們將這兩個方向垂直的門函數相加呢:
改變$h$的大小能夠改變圖像的高度,很容易能夠知道中間最高的地方是邊上的兩倍高。咱們因而想到可否用中間的高度做爲中間區間上的值,這種方法去將定義域分割成一個個區間呢,而後每一個區間對應一個值,區間分的越細就越逼近原函數。相似於以前單輸入的狀況,此次是一個二維的lookup表。
可是這就須要咱們獲得的是一個下圖相似的塔函數:
可是咱們獲得的狀況是除了中間是高的($2h$),邊上並非平的,也有必定的高度($h$),並不知足塔函數的條件。怎麼將其轉變爲塔函數的形狀呢?注意到,這裏只是隱藏層的加權輸出和,並非輸出神經元的輸出,也就是說還有一個$\sigma$函數的做用沒有考慮,就能夠嘗試調節輸出神經元的bias$b$來進行調節。
考慮門函數的輸出值由$h$決定,咱們能夠獲得神經網絡的輸出值(再也不是隱藏層的輸出了)中間區域的值近似爲$f_{max} = \frac{1}{1+e^{-(2h+b)}}$,邊上區域的值近似爲$f_{min} = \frac{1}{1+e^{-(h+b)}}$。咱們想要$f_{max}$可以近似等於須要的值$g$,這種狀況下獲得條件一:$2h+b=c$,其中$c$爲一個常數。又爲了讓$f_{min} \approx 0$,就須要條件二:$h+b<<0$。這樣就能夠經過調節$h$與$b$的值使得這兩個條件都成立,由於只要$h$足夠大,$h+b = c - h$就會足夠小。不妨選擇$h=10, b \approx -\frac{3h}{2}$,獲得:
注意到這裏的圖像是輸出神經元的輸出,也就是通過$\sigma$函數後的結果。能夠看到,這已經獲得了一個形式不錯的塔函數了,繼續增長$h$的值,調節$b=-\frac{3h}{2}$,效果會更加明顯。
接着咱們將兩個相似這樣的神經網絡組合去獲得兩個塔函數:
每一個塔函數對應着第二個隱藏層的每一個神經元的輸出,調節兩個$w$的值能夠分別調節其高度。一樣的方式咱們能夠獲得任意多個自定義高度的塔函數,每一個塔函數對應2維平面上的一個區域,經過這樣的2維lookup就可使得第二個隱藏層的加權輸出能夠近似等價於任意關於兩個變量的函數$f(x,y)$。
可是這畢竟不是輸出層的輸出,因而相似的方法咱們使用$\sigma$函數的反函數,讓第二個隱藏層加權輸出等價於$\sigma^{-1} (f(x,y))$便可。
若是輸入變量個數多餘兩個呢?
先看一下三個變量的狀況$x_1, x_2, x_3$。相似於上面的狀況,下面這個神經網絡能夠獲得一個四維空間上的塔函數:
這裏$x_1,x_2,x_3$爲神經網絡的輸入,$s_1,t_1,s_2,t_2$都是控制門函數的位置,其中第一層隱藏層的權重已經足夠大了使得它們各自的輸出爲階躍函數,而後各自的誤差由$b=-sw$獲得。而後第二層隱藏層的權重所有爲$h$和$-h$,而後不妨令其bias爲$-\frac{5h}{2}$,驗證仍然知足以前構造塔函數的條件$h+b = -\frac{3h}{2} << 0$和$3h+b = \frac{h}{2} = c$(c爲一常數)。
隨着增大$h$到必定程度,這個神經網絡因而就至關於對於3維上一塊區域$x_1 \in (s_1,t_1), x_2 \in (s_2, t_2), x_3 \in (s_3, t_3)$,其值爲1,其餘任意位置爲0的塔函數。
經過組合這樣的神經網絡就能夠將多個塔函數相組合就能夠近似替代任意三個變量的函數。一樣的想法能夠拓展到$m$維空間,只要記得將進行組合處的神經元bias設置爲$(-m+\frac{1}{2})h$使得函數形式爲中間凸起,旁邊爲0。
這樣就獲得了使用神經網絡逼近任意輸出爲一維的函數的方法了。可是神經網絡的輸出常常是多維的$f(x_1, ..., x_m) \in R^n$,例如前面的MNIST問題時輸出爲10維,這種狀況怎麼處理呢?
這種狀況能夠看做是$n$個獨立的函數:$f^1 (x_1, ..., x_,m), f^2 (x_1, ..., x_m)$,咱們分別設計神經網絡近似表示$f_1, f_2$等等,而後簡單的將它們組合便可。
上面介紹瞭如何用兩個隱藏層的神經網絡去近似表示函數,可否證實只須要一層隱藏層就能夠完成這樣的設計?試着在兩個輸入的狀況下,依次證實:(a)除了x軸,y軸之外,能夠構造任意方向的階躍函數;(b)經過將大量的(a)中的函數疊加,能夠獲得一個底面形狀再也不是長方形而是圓形的塔函數;(c)使用這些圓形的塔函數,能夠近似表示任意函數。
(a):
先看一下以前獲得的方向爲何是x軸,y軸,或者說這些方向是由什麼決定的。$\frac{1}{1+e^{-(w_1 x+ w_2 y +b)}}$,以前選擇w_2爲0時,獲得的階躍函數時x軸方向的,能夠發現階躍函數的方向是和直線$w_1 x+ w_2 y +b = 0$垂直的方向。因此說只要根據須要的方向構造與該方向垂直的直線$w_1 x + w_2 y + b = 0$中的$w_1$和$w_2$便可,也就是說如今的階躍函數的構造不只僅依靠一個輸入神經元,而是兩個都須要。
(b):
兩個長方形垂直相交的重疊部分是方形,若是三個,四個呢?這個也許很差想象,可是換一個思路,對一個長方形繞着其中心旋轉,中間不變的部分就是以中心爲圓心的內切圓,因此只要組合足夠多不一樣方向的(a)中階躍函數,就能夠獲得近似圓形底面的塔函數。
(c):
長方形區域很容易能夠拼成一塊大的區域,可是圓形卻不行,它們之間老是有縫隙的。能夠經過本文後面部分介紹的方法,將這些未覆蓋的部分當成是「失敗區域」,使用函數近似表示原函數的$\frac{1}{M}$,每次移動$\frac{1}{M}$單位個步長,最後疊加就獲得覆蓋滿全部區域的目標函數。
這裏按照做者給出的提示解答完了這三步,可是我仍是不大清楚這和能用一個隱藏層有什麼聯繫,由於圓形的塔函數依然面臨以前的一個問題,就是除了中間高的區域外,還存在邊上的不爲0的區域,仍是要依靠一個神經元將其轉變爲真正的塔的形式,中間凸出,邊緣爲0。我理解的一個隱藏層能夠解決的緣由是相似於在進行傅立葉級數展開的時候,咱們將函數表示成一組三角函數基函數的線性疊加。其實任意連續函數均可以看做爲一組基函數的疊加,而後在一個隱藏層選擇合適的基函數疊加便可。
前面已經證實了以sigmoid神經元爲基礎的神經網絡能夠計算任意函數。回憶一下sigmoid函數的形式,對於輸入$z=\sum_j w_j x_j +b$,$\sigma(z)$的形式爲:
若是將其換成一個不同的激活函數$s(z)$:
會出現什麼狀況呢?
一樣得方法,咱們用這個函數也能夠獲得階躍函數。試着增大$w=100$:
相似於sigmoid函數的狀況,新的激活函數同樣會收縮,隨着$w$的繼續增大,它最終也會成爲一個階躍函數的近似表示。而後經過改變$b$的值就能實現對該階躍函數的移動。使用以前同樣的方法就能夠構造神經網絡近似表示所需的目標函數。
那麼是否是全部的激活函數$s(z)$都知足這樣的要求能夠獲得階躍函數呢?事實上只須要$s(z)$在$z\rightarrow -\infty$和$z \rightarrow \infty$時極限存在,而且這兩個極限的值不相等便可。相等的話就不是階躍了,而是一個「平」的常量函數了。激活函數知足這些性質以後,神經網絡就能夠逼近任意函數了。
拓展一:
證實以前介紹的RELU神經元不知足上述的條件,可是RELU函數同樣能夠構造上述神經網絡近似表示任意函數。
答案:
RELU在$x>0$時是一個線性增加的函數,當$x\rightarrow \infty$時,$RELU(x) \rightarrow \infty$,極限值並不存在,因此不知足要求。
雖然一個RELU函數按照以前改變參數的方法怎麼也變不成階躍函數,可是能夠經過兩個RELU函數相疊加獲得。對於$y=wx$和$y=-wx+b(k>0)$,後者相對前者向右移動了$\frac{b}{w}$,因而二者相加獲得了一個分段函數
$$s(x) = \left\{\begin{align*} & 0 \quad if x \leqslant 0 \\ & wx \quad if 0<x\leqslant \frac{b}{w} \\ & b \quad if x > \frac{b}{w} \end{align*}\right.$$
經過增大$w$就能夠減少$\frac{b}{w}$從而讓這個分段函數中間增加的部分變的更窄,使之近似爲階躍函數。
拓展二:
考慮激活函數爲線性函數$s(z)=z$的神經元,證實該函數不知足上述條件,也沒法構造上述神經網絡近似表示任意函數。
答案:
這個函數在$x\rightarrow \infty$和$x \rightarrow -\infty$處的極限都不存在,顯然不知足上面的條件。
線性函數自身不具備這樣的性質,線性函數的線性組合仍是連續的線性函數,依然是沒法知足階躍函數的要求的。
以前已經證實了咱們經過對神經元進行組合獲得近似的階躍函數,但這始終是近似表示,其中還存在一段函數並不是階躍函數的「失敗區域」:
雖然經過增大wegiths,可使得這塊區域愈來愈窄,也就是說與階躍函數的差異愈來愈小。不過還有其餘的處理這個問題的方法的話固然就更好了。
事實上,這個問題並不難解決。設想對於一個一維函數$f(x)$,按照以前的方法,咱們須要隱藏層的輸出能夠表示成:
按照以前的方法,咱們使用一系列的門函數去表示這個函數:
能夠看到,只要門函數足夠多,門的寬度足夠窄就可使得對目標函數的近似表示越好,除了在交界處的「失敗區域」。
此次咱們不用上面的近似,咱們使用目標函數值的一半做爲近似對象,$\sigma ^{-1}(\frac{f(x)}{2})$:
接着使用另一套隱藏層去近似表示這樣的函數:它是上面門函數組成的函數橫向平移半個門寬度獲得的:
當咱們把這兩個函數疊加到一塊兒的時候就會獲得一個$\sigma ^{-1}(f(x))$的近似。這個近似雖然仍是會存在「失敗區域」,可是比以前的近似已經好多了。這是由於,對於一個點在一個近似函數的「失敗區域」時,它將不會出如今另外一個近似函數的「失敗區域」。
經過減少每次移動的步長爲窗口的$\frac{1}{M}$,將M個$\sigma^ {-1}(f(x)/M)$的近似函數疊加,即獲得更好的原始函數的近似表示。
這一章描述了神經網絡擬合函數的廣泛性,可是這固然不是實際中咱們使用神經網絡計算的方式。不過它讓咱們知道之後在面對一個問題的時候,不是去懷疑神經網絡能不能表示這個函數,而是考慮更重要的事,怎麼才能找到一個這個函數的好的近似。
咱們的討論用了兩層神經元,不過一層神經元也能夠完成這樣的工做。那咱們爲何還要去用那些層數更多的深度神經網絡呢?
理論上這是可能的,不過實際上咱們有不少理由相信深度網絡更好。在第一章已經討論過,現實中的問題和知識體系每每是由淺入深的層級關係,而深度網絡的層級結構就很是切合這一點。例如對於圖像識別的問題,只是着眼於單個像素點的理解固然是不夠的,咱們更但願它可以識別出更復雜的模式:從簡單的線條到複雜的幾何形狀等等。在隨後的章節也會看到,深度網絡對於這種層級的問題處理結果的確要好於淺層網絡。
總之就是,單層的神經網絡就已經能夠計算任何函數,可是經驗告訴咱們,在解決現實問題上,深度網絡更加適合。