天天看點

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

文章導讀:

1. 兩個前提

2. 單輸入單輸出的情況

3. 一般情形:多輸入多輸出情況 

4. 使用sigmoid以外的神經元

5. 修正階躍函數

6.總結

神經網絡最令人激動的一個性質,就是它可以實作任意功能的函數。而且是即使對于隻有一個隐藏層的神經網絡,這個結論依然成立。

大部分神經網絡的使用者都知道這個性質,但是并不了解為什麼神經網絡會有這樣的性質。而其理論證明對于非數學專業的同學來說并不好了解,是以本章旨在用直覺的方式幫助大家了解這個性質。

一. 兩個前提

神經網絡可以計算任意函數其實是有前提的。

首先要明白的是它并不是可以完全準确的計算原函數的值,但是通過增加隐藏層神經元的值我們可以越來越逼近原函數。就是說對于一個需要實作的函數f(x)f(x),要求實作精度為ϵ>0ϵ>0,也就是需要足夠的隐藏層神經元使得神經網絡輸出g(x)g(x)滿足|g(x)−f(x)|<ϵ|g(x)−f(x)|<ϵ對所有輸入xx。

第二個前提是被模拟的函數是連續函數,不過有的時候對于非連續函數,神經網絡得到的連續近似已經足夠滿足要求了。

二. 單輸入單輸出的情況

先考慮最基礎的單輸入單輸出的函數情況。為了了解怎麼利用神經網絡去計算給定函數ff,我們先考慮隻有一個隐藏層的情況,其中含有兩個神經元。

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

考慮隐藏層第一個神經元,其輸出由σ(wx+b)σ(wx+b)決定。改變其參數ww和bb可以發現如下規律:

  • 改變b不會使函數形狀發生改變,隻會使其左右偏移。因為f(x)=11+ewx+b+b0=1ew(x+b0w)+bf(x)=11+ewx+b+b0=1ew(x+b0w)+b,b0>0b0>0時即bb增大時,相當于圖像向左移動,b0<0b0<0時即bb減小時,相當于圖像向右移動。
  • 改變w則會改變函數的形狀,因為f(x)=11+e(w+w0)x+b=11+ewxw+w0w+bf(x)=11+e(w+w0)x+b=11+ewxw+w0w+b,相當于在橫軸上進行了放縮。當|w||w|(w<0w<0的時候,函數會在x軸上反轉,不過不影響我們了解)變的越來越大的時候,函數就會變的越來越陡峭。實際中觀察,當w=100w=100左右時,函數的陡峭程度已經接近于階躍函數了。
【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

繼續增大ww的值使得其輸出更加接近階躍函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

當我們對隐藏層的神經元的輸出進行權重求和的時候,分析階躍函數要比分析sigmoid函數容易。我們很容易可以知道兩個階躍函數的和是什麼形式,但是對于兩個sigmoid函數就沒有這麼容易得到。是以我們先假設這些神經元輸出函數就是階躍函數,當然這也是一種近似,我們随後再看這和真正的情況相比會有什麼影響。

再考慮另外一個問題,我們知道标準的σ(z)σ(z)的中點在z=0z=0處,當它近似為一個階躍函數的時候,階躍點在哪呢?容易知道就是在wx+b=0wx+b=0處,即s=−bws=−bw。于是對于已經近似被認為是階躍函數的神經元就可以隻用一個參數s=−bws=−bw來代替之前的兩個參數ww和bb。

接着再來考慮整個神經網絡的情況。

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

右邊展示的是權重輸出的結果w1a1+w2a2w1a1+w2a2,其中a1a1和a2a2分别是隐藏層兩個神經元的輸出。不過注意到這裡神經網絡最終的輸出為σ(w1a1+w2a2+b)σ(w1a1+w2a2+b)。

通過調節這些參數可以觀察到:

  • 調節s1s1的大小s2s2分别控制上下兩個神經元的激活前後順序。例如s1<s2s1<s2的情況下,右邊函數的第一個階梯由第一個神經元輸出決定,因為它先被激活,第二個階梯才是兩者之和
  • 調節w1w1和w2w2分别控制兩個神經元輸出在輸出神經元的權重,當其中一個為0時,隻剩下一個輸入,右邊的函數也顯示為隻有一個階躍函數。

最後,試着讓w1=0.8,w2=−0.8w1=0.8,w2=−0.8,然後s1=0.4,s2=0.6s1=0.4,s2=0.6就得到一個在(0.4, 0.6)上的門函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

 如果我們固定s1s1和s2s2,然後w1=−w2w1=−w2,這樣就可以将門函數看作是隻有一個參數hh的模型,其中h=w1h=w1,對應着就是門函數的“門梁”的位置。

通過組合神經元我們就可以輕易得到兩個門函數組合的情況:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

同樣的方法,我們可以構造任意數量任意高度的門函數。因為對于[0,1]這個區間的劃分是可以有無限多N個的,隻要使用N對隐藏層神經元就,然後分别配上對應的hh就可以達到要求了。

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

上圖就是一個五個寬度一樣的門函數的情形,高度由各自的參數hh決定。但是僅僅這樣就能說明神經網絡可以計算任意函數嗎?看下面這個例子:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

這個函數來自:

f(x)=0.2+0.4x2+0.3xsin(15x)+0.05cos(50x)(113)f(x)=0.2+0.4x2+0.3xsin(15x)+0.05cos(50x)(113)

看上去這個函數形式和神經網絡完全沒什麼聯系,接下來就來看看神經網絡是怎麼去近似計算它的。

前面提到過w1a1+w2a2+...w1a1+w2a2+...并不是神經網絡最終輸出,最終輸出為σ(∑jwjaj+b)σ(∑jwjaj+b),那麼為了讓最終輸出為需要的函數f(x)f(x),就要求σσ函數的輸入為σ−1(f(x))σ−1(f(x)),即隐藏層輸出的權重和為σ−1(f(x))σ−1(f(x)),其中σ−1σ−1為σσ的反函數。

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

 于是隻要有方法可以讓隐藏層輸出和近似等于上面反函數,就相當于神經網絡的最終輸出近似等于f(x)f(x)了。對于上面五個門函數的情形,通過調節各自的hh得到符号近似要求的結果:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

這雖然隻是一個粗略的近似,結果也不唯一,但是隻要通過增加門函數的個數,即增加隐藏層神經元的個數,就可以讓結果越來越精确。将這個得到的模型轉換到我們的神經網絡參數上,隐藏層的ww取了很大的數w=1000w=1000,由于s=−bw=0.2s=−bw=0.2,得到b=−1000∗0.2=−200b=−1000∗0.2=−200。

輸出層的權重由hh決定,例如第一個h=−1.3h=−1.3,說明它代表的兩個權重分别為-1.3和1.3,以此類推,輸出層的bias這裡被設定為0。

這樣就完成了通過構造一個神經網絡來逼近目标函數的目的了,而且通過增加隐藏層神經元的個數可以使得這個近似結果更加準确。事實上,我們的目标函數f(x)=0.2+0.4x2+0.3sin(15x)+0.05cos(50x)f(x)=0.2+0.4x2+0.3sin(15x)+0.05cos(50x)的形式無關緊要,本質上我們使用一個單層神經網絡建構了一個lookup表,不同區間對應不同的值,區間分的越細小,就越準确。

三. 一般情形:多輸入多輸出情況 

 先考慮兩個輸入的情況:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

我們将xx和yy看作是變量,其權重輸出和為因變量,這樣就将之前的平面圖像轉變為了3d圖像,不妨先設w2=0w2=0,這樣圖像為:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

可以看到平行于x軸的任意截面都是之前看到的平面上的曲線形式。同樣的原理,改變w1w1和bb分别改變曲線的形狀和位置。同樣将w1w1設定為一個很大的數,曲線轉變為階躍函數,位置為sx=−bw1sx=−bw1:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

這裡對應着w1=1000,w2=0w1=1000,w2=0。同樣可以設定w2=1000,w1=0w2=1000,w1=0這樣就成了平行于y軸的曲線:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

接着通過組合,我們得到了對應門函數的一個3d情況:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

注意這裡的y并沒有起到作用,和y相連的權重都被設定成了0。類似也有隻有y的版本,将和x的相連的權重設定為0:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

如果我們将這兩個方向垂直的門函數相加呢:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

改變hh的大小可以改變圖像的高度,很容易可以知道中間最高的地方是邊上的兩倍高。我們于是想到能否用中間的高度作為中間區間上的值,這種方法去将定義域分割成一個個區間呢,然後每個區間對應一個值,區間分的越細就越逼近原函數。類似于之前單輸入的情況,這次是一個二維的lookup表。

但是這就需要我們得到的是一個下圖類似的塔函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

但是我們得到的情況是除了中間是高的(2h2h),邊上并不是平的,也有一定的高度(hh),并不滿足塔函數的條件。怎麼将其轉變為塔函數的形狀呢?注意到,這裡隻是隐藏層的權重輸出和,并不是輸出神經元的輸出,也就是說還有一個σσ函數的作用沒有考慮,就可以嘗試調節輸出神經元的biasbb來進行調節。

考慮門函數的輸出值由hh決定,我們可以得到神經網絡的輸出值(不再是隐藏層的輸出了)中間區域的值近似為fmax=11+e−(2h+b)fmax=11+e−(2h+b),邊上區域的值近似為fmin=11+e−(h+b)fmin=11+e−(h+b)。我們想要fmaxfmax能夠近似等于需要的值gg,這種情況下得到條件一:2h+b=c2h+b=c,其中cc為一個常數。又為了讓fmin≈0fmin≈0,就需要條件二:h+b<<0h+b<<0。這樣就可以通過調節hh與bb的值使得這兩個條件都成立,因為隻要hh足夠大,h+b=c−hh+b=c−h就會足夠小。不妨選擇h=10,b≈−3h2h=10,b≈−3h2,得到:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

注意到這裡的圖像是輸出神經元的輸出,也就是經過σσ函數後的結果。可以看到,這已經得到了一個形式不錯的塔函數了,繼續增加hh的值,調節b=−3h2b=−3h2,效果會更加明顯。

接着我們将兩個類似這樣的神經網絡組合去得到兩個塔函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

每個塔函數對應着第二個隐藏層的每個神經元的輸出,調節兩個ww的值可以分别調節其高度。同樣的方式我們可以得到任意多個自定義高度的塔函數,每個塔函數對應2維平面上的一個區域,通過這樣的2維lookup就可以使得第二個隐藏層的權重輸出可以近似等價于任意關于兩個變量的函數f(x,y)f(x,y)。

但是這畢竟不是輸出層的輸出,于是類似的方法我們使用σσ函數的反函數,讓第二個隐藏層權重輸出等價于σ−1(f(x,y))σ−1(f(x,y))即可。

如果輸入變量個數多餘兩個呢?

先看一下三個變量的情況x1,x2,x3x1,x2,x3。類似于上面的情況,下面這個神經網絡可以得到一個四維空間上的塔函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

這裡x1,x2,x3x1,x2,x3為神經網絡的輸入,s1,t1,s2,t2s1,t1,s2,t2都是控制門函數的位置,其中第一層隐藏層的權重已經足夠大了使得它們各自的輸出為階躍函數,然後各自的偏差由b=−swb=−sw得到。然後第二層隐藏層的權重全部為hh和−h−h,然後不妨令其bias為−5h2−5h2,驗證仍然滿足之前構造塔函數的條件h+b=−3h2<<0h+b=−3h2<<0和3h+b=h2=c3h+b=h2=c(c為一常數)。

随着增大hh到一定程度,這個神經網絡于是就相當于對于3維上一塊區域x1∈(s1,t1),x2∈(s2,t2),x3∈(s3,t3)x1∈(s1,t1),x2∈(s2,t2),x3∈(s3,t3),其值為1,其他任意位置為0的塔函數。

通過組合這樣的神經網絡就可以将多個塔函數相組合就可以近似替代任意三個變量的函數。同樣的想法可以拓展到mm維空間,隻要記得将進行組合處的神經元bias設定為(−m+12)h(−m+12)h使得函數形式為中間凸起,旁邊為0。

 這樣就得到了使用神經網絡逼近任意輸出為一維的函數的方法了。但是神經網絡的輸出經常是多元的f(x1,...,xm)∈Rnf(x1,...,xm)∈Rn,例如前面的MNIST問題時輸出為10維,這種情況怎麼處理呢?

這種情況可以看作是nn個獨立的函數:f1(x1,...,x,m),f2(x1,...,xm)f1(x1,...,x,m),f2(x1,...,xm),我們分别設計神經網絡近似表示f1,f2f1,f2等等,然後簡單的将它們組合即可。

拓展:

上面介紹了如何用兩個隐藏層的神經網絡去近似表示函數,能否證明隻需要一層隐藏層就可以完成這樣的設計?試着在兩個輸入的情況下,依次證明:(a)除了x軸,y軸以外,可以構造任意方向的階躍函數;(b)通過将大量的(a)中的函數疊加,可以得到一個底面形狀不再是長方形而是圓形的塔函數;(c)使用這些圓形的塔函數,可以近似表示任意函數。

(a):

 先看一下之前得到的方向為什麼是x軸,y軸,或者說這些方向是由什麼決定的。11+e−(w1x+w2y+b)11+e−(w1x+w2y+b),之前選擇w_2為0時,得到的階躍函數時x軸方向的,可以發現階躍函數的方向是和直線w1x+w2y+b=0w1x+w2y+b=0垂直的方向。是以說隻要根據需要的方向構造與該方向垂直的直線w1x+w2y+b=0w1x+w2y+b=0中的w1w1和w2w2即可,也就是說現在的階躍函數的構造不僅僅依靠一個輸入神經元,而是兩個都需要。

(b):

兩個長方形垂直相交的重疊部分是方形,如果三個,四個呢?這個也許不好想象,但是換一個思路,對一個長方形繞着其中心旋轉,中間不變的部分就是以中心為圓心的内切圓,是以隻要組合足夠多不同方向的(a)中階躍函數,就可以得到近似圓形底面的塔函數。

(c):

長方形區域很容易可以拼成一塊大的區域,但是圓形卻不行,它們之間總是有縫隙的。可以通過本文後面部分介紹的方法,将這些未覆寫的部分當成是“失敗區域”,使用函數近似表示原函數的1M1M,每次移動1M1M機關個步長,最後疊加就得到覆寫滿所有區域的目标函數。

這裡按照作者給出的提示解答完了這三步,但是我還是不大清楚這和能用一個隐藏層有什麼聯系,因為圓形的塔函數依然面臨之前的一個問題,就是除了中間高的區域外,還存在邊上的不為0的區域,還是要依靠一個神經元将其轉變為真正的塔的形式,中間凸出,邊緣為0。我了解的一個隐藏層可以解決的原因是類似于在進行傅立葉級數展開的時候,我們将函數表示成一組三角函數基函數的線性疊加。其實任意連續函數都可以看作為一組基函數的疊加,然後在一個隐藏層選擇合适的基函數疊加即可。

 四. 使用sigmoid以外的神經元

前面已經證明了以sigmoid神經元為基礎的神經網絡可以計算任意函數。回憶一下sigmoid函數的形式,對于輸入z=∑jwjxj+bz=∑jwjxj+b,σ(z)σ(z)的形式為:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

如果将其換成一個不一樣的激活函數s(z)s(z):

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

會出現什麼情況呢?

同樣得方法,我們用這個函數也可以得到階躍函數。試着增大w=100w=100:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

類似于sigmoid函數的情況,新的激活函數一樣會收縮,随着ww的繼續增大,它最終也會成為一個階躍函數的近似表示。然後通過改變bb的值就能實作對該階躍函數的移動。使用之前一樣的方法就可以構造神經網絡近似表示所需的目标函數。

那麼是不是所有的激活函數s(z)s(z)都滿足這樣的要求可以得到階躍函數呢?事實上隻需要s(z)s(z)在z→−∞z→−∞和z→∞z→∞時極限存在,并且這兩個極限的值不相等即可。相等的話就不是階躍了,而是一個“平”的常量函數了。激活函數滿足這些性質之後,神經網絡就可以逼近任意函數了。

拓展一:

證明之前介紹的RELU神經元不滿足上述的條件,但是RELU函數一樣可以構造上述神經網絡近似表示任意函數。

答案:

RELU在x>0x>0時是一個線性增長的函數,當x→∞x→∞時,RELU(x)→∞RELU(x)→∞,極限值并不存在,是以不滿足要求。

雖然一個RELU函數按照之前改變參數的方法怎麼也變不成階躍函數,但是可以通過兩個RELU函數相疊加得到。對于y=wxy=wx和y=−wx+b(k>0)y=−wx+b(k>0),後者相對前者向右移動了bwbw,于是兩者相加得到了一個分段函數

s(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪0ifx⩽0wxif0<x⩽bwbifx>bws(x)={0ifx⩽0wxif0<x⩽bwbifx>bw

通過增大ww就可以減小bwbw進而讓這個分段函數中間增長的部分變的更窄,使之近似為階躍函數。

拓展二:

考慮激活函數為線性函數s(z)=zs(z)=z的神經元,證明該函數不滿足上述條件,也無法構造上述神經網絡近似表示任意函數。

這個函數在x→∞x→∞和x→−∞x→−∞處的極限都不存在,顯然不滿足上面的條件。

線性函數自身不具有這樣的性質,線性函數的線性組合還是連續的線性函數,依然是無法滿足階躍函數的要求的。

五. 修正階躍函數

之前已經證明了我們通過對神經元進行組合得到近似的階躍函數,但這始終是近似表示,其中還存在一段函數并非階躍函數的“失敗區域”:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

雖然通過增大wegiths,可以使得這塊區域越來越窄,也就是說與階躍函數的差别越來越小。不過還有其他的處理這個問題的方法的話當然就更好了。

事實上,這個問題并不難解決。設想對于一個一維函數f(x)f(x),按照之前的方法,我們需要隐藏層的輸出可以表示成:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

按照之前的方法,我們使用一系列的門函數去表示這個函數:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

可以看到,隻要門函數足夠多,門的寬度足夠窄就可以使得對目标函數的近似表示越好,除了在交界處的“失敗區域”。

這次我們不用上面的近似,我們使用目标函數值的一半作為近似對象,σ−1(f(x)2)σ−1(f(x)2):

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

接着使用另外一套隐藏層去近似表示這樣的函數:它是上面門函數組成的函數橫向平移半個門寬度得到的:

【神經網絡和深度學習】筆記 - 第四章 神經網絡可以實作任意函數的直覺解釋【轉】

當我們把這兩個函數疊加到一起的時候就會得到一個σ−1(f(x))σ−1(f(x))的近似。這個近似雖然還是會存在“失敗區域”,但是比之前的近似已經好多了。這是因為,對于一個點在一個近似函數的“失敗區域”時,它将不會出現在另一個近似函數的“失敗區域”。

通過減小每次移動的步長為視窗的1M1M,将M個σ−1(f(x)/M)σ−1(f(x)/M)的近似函數疊加,即得到更好的原始函數的近似表示。

六.總結

這一章描述了神經網絡拟合函數的普遍性,但是這當然不是實際中我們使用神經網絡計算的方式。不過它讓我們知道以後在面對一個問題的時候,不是去懷疑神經網絡能不能表示這個函數,而是考慮更重要的事,怎麼才能找到一個這個函數的好的近似。

我們的讨論用了兩層神經元,不過一層神經元也可以完成這樣的工作。那我們為什麼還要去用那些層數更多的深度神經網絡呢?

理論上這是可能的,不過實際上我們有很多理由相信深度網絡更好。在第一章已經讨論過,現實中的問題和知識體系往往是由淺入深的層級關系,而深度網絡的層級結構就非常切合這一點。例如對于圖像識别的問題,隻是着眼于單個像素點的了解當然是不夠的,我們更希望它能夠識别出更複雜的模式:從簡單的線條到複雜的幾何形狀等等。在随後的章節也會看到,深度網絡對于這種層級的問題處理結果的确要好于淺層網絡。

總之就是,單層的神經網絡就已經可以計算任何函數,但是經驗告訴我們,在解決現實問題上,深度網絡更加适合。

繼續閱讀