來源:神經網絡的本質——無限擬合函數 - 知乎 (zhihu.com)
如果輸入是一條直線,那么輸出也是一條直線。這才叫“線性變換”。
本文將用一種直觀的方式去理解神經網絡
為了可視化,我們把整個網絡簡化到最簡單的形式,也就是從一次函數
線性變換
線性和非線性說起來有點抽象,但什么是線性變換呢?
這個變換只能:
在豎直方向上拉升,反向,收縮
在豎直方向上上下移動。
注意:這個連橫向移動都做不到!你看到的水平移動是上下移動造成的“幻覺”
你把一次函數變成二次函數就知道了,這個兩個參數是無法控制函數左右移動的!
這個二次函數要和其本身的一次函數做線性運算才能達到平移的效果!
而這個是一層線性變換做不到的
並非很多課程中講述的“扭曲”,因為“扭曲”和“旋轉”這種屬於非線性的行為。
也就是說你原來的輸入有多少個拐點,那么輸出的也依然是有幾個拐點。
如果輸入是一個條直線,那么輸出也是一條直線。這才叫“線性變換”
如果是二次函數,那么經過線性變換也依然是二次函數。
當然線性變換可以有特殊情況就是把縮放系數 a 如果是矩陣就是矩陣A,填上0,這樣就可以把二次函數重新拉平。
激活函數
激活函數的作用只有一個,就是把輸入加入一點非線性。
你會問我們為什么不用平方,立方,開根號,log等方法加入非線性,而要用這么一個特定的函數做非線性?
因為這個函數是幾個能做到只加入“一點”非線性的函數,其他的函數加入的“非線性”太多,導致了函數的非線性不可控。這個函數除了某一個小區域內出現了一點曲線,其他地方依然是平的。
我們希望加一點非線性,但有不能過多,所以經過神經網絡煉丹師的反復摸索,只有幾種函數可以帶有這種“恰到好處的非線性”。
其他的激活函數可以參考下表,雖然結果略有不同,但是本質都是加入一點非線性。
好了,你已經學會神經網絡了
然而你真的懂了么?
你會想,為什么這兩種非常簡單的東西居然可以做到識別圖形,語音,這樣如此復雜的工作?
那么下面就在此基礎上展開,看看兩種函數疊加后的效果。
其中系數a的部分控制着函數的橫向縮放
而偏移bias也就是b,控制着函數的橫向移動
這就解決了上面提到的一個問題,函數無法橫向縮放,橫向移動的問題,於此同時激活函數還給增加了一點非線性。
一層線性變換,包裹一層激活函數,就可以實現原本線性函數所不具備的功能。
那橫向移動可以了,那縱向移動呢?
再加一層線性
d控制着上下的平移
b控制着左右平移
a控制着水平拉升收縮
c控制着豎直方向的拉升收縮
注意:激活函數F有一邊是在0上的,所以不受c的影響。所以這一邊只受到d的影響
而C的作用是先於d的,所以合起來可以理解是d控制住一端的水平位置,而c進行數值方向的縮放。這也是激活函數帶來的好處之一,現在你理解了,為什么激活函數一定要有一端是0了。因為只有這樣,下一層的線性變換用d就可以單獨控制這一條邊,而不會受到c的干擾。
這個函數看上去也很簡單,感覺沒什么用啊
回答:繼續套娃
只不過我們現在要脫離函數的思維,用一個小小的矩陣來思考。
我們把x分別套入兩個不同的激活函數,然后再把輸出作為一個矩陣,來喂給一個線性層,就可以實現比較復雜的效果了。
神經網絡甚至能做除法運算制作出 1/x !
真是太神奇了!神經網絡的運算種完全沒有除號,居然可以算出和除法差不多的結果。
我不知道這個神經網絡是怎么做到的,但是它學會了!
它真的太聰明了!
只不過,如果數字太大或太小,它可能會出現bug,也就是如果數字比較正常,比如>0.1左右這個神經網絡可以得出和除法幾乎一模一樣的結論。但是當數字<0.1 的時候,這個神經網絡會 給你一個 10 並且拒絕運算。它似乎由看起來還不太聰明,因為計算1/0.01 對神經網絡來說太難了!
要精確的計算這種神經網絡不擅長的算法,那么就需要繼續堆疊更深的的層。
理論上只要你堆疊的層數夠多,神經網絡總能學會“除法”。
好吧,這么看來它似乎還是沒有搞懂什么是“除法”,不過用來騙騙人類,尤其是沒學過AI的人類,應該沒有問題。
Deep is Different
所以你知道了,為什么神經網絡越來越大了。因為只要層數夠多,神經網絡可以擬合出幾乎任意的函數。
Deep still not work?
第一種可能是神經網絡的學習資料太少,它還沒學會,正確的騙人技巧。
第二種可能確實是神經網絡的局限所在了。
神經網絡的本質是函數,這個函數可以接受任意數量的變量,可以擁有任意數量的參數。但脫離不了函數的本質。函數能解決的問題,神經網絡理論上就能解決,而函數不能解決的問題,神經網絡理論上就是無解的。
函數不能調整輸出的個數
如果不加入一些trick,神經網絡通常是不支持有可變輸出的任務。需要在神經網絡的各種地方加入一些trick method,把問題轉換到單輸出的任務。然后用單輸出的任務去組合出多輸出的任務。
函數不具備動態緩存
學過計算機編程的應該知道heap的概念,而神經網絡不具備heap,神經網絡一旦運行就會定義固定的stack固定區域作為記憶單元。如果一種任務需要程序去記憶潛在的可能無限多的,動態的信息才能解決,那么很抱歉,神經網絡是做不到的。
神經網絡有if語句,但沒有跳轉
我之前的想法中提到了,神經網絡的激活函數可以理解為一種if條件語句,但神經網絡並沒有跳轉,也就是如果一種任務可能需要跳轉到不同的狀態,那神經網絡也做不到。我們需要用額外的trick在神經網絡的外面套上一些跳轉語句,也就是把神經網絡集成在專家系統中。
這也是行業的一種趨勢,也就是任何單一的神經網絡作用有限,無論這個神經網絡有多Deep,AI未來的趨勢是專家系統配合神經網絡,把能用函數解決的工作外包給神經網絡,而一些本質上的核心的,確定的邏輯,依然要借助專家系統。