接下來聊一聊現(xiàn)在大熱的神經網絡。最近這幾年深度學習發(fā)展十分迅速,感覺已經占據了整個機器學習的“半壁江山”。各大會議也是被深度學習占據,引領了一波潮流。深度學習中目前最火熱的兩大類是卷積神經網絡(CNN)和遞歸神經網絡(RNN),就從這兩個模型開始聊起。 當然,這兩個模型所涉及到概念內容實在太多,要寫的東西也比較多,所以為了能把事情講得更清楚,這里從一些基本概念聊起,大神們不要覺得無聊啊…… 今天扯的是全連接層,也是神經網絡中的重要組成部分。關于神經網絡是怎么發(fā)明出來的這里就不說了。全連接層一般由兩個部分組成,為了后面的公式能夠更加清楚的表述,以下的變量名中上標表示所在的層,下標表示一個向量或矩陣內的行列號: 線性部分:主要做線性轉換,輸入用X表示,輸出用Z表示 非線性部分:那當然是做非線性變換了,輸入用線性部分的輸出Z表示,輸出用X表示。 線性部分 線性部分做了什么事情呢?簡單來說就是對輸入數(shù)據做不同角度的分析,得出該角度下對整體輸入數(shù)據的判斷。 這么說有點抽象,舉一個實際點的例子,就拿CNN的入門case——MNIST舉例。MNIST的例子在此不多說了,它是一個手寫數(shù)字的識別項目,輸入是一張28*28的二值圖,輸出是0-9這是個數(shù)字,這里假設我們采用完全全連接的模型,那么我們的輸入就是28*28=784個像素點。數(shù)據顯示到屏幕上大概是這個樣子: 1)在第一組權重中給第一個像素一個正數(shù),第二個也是正數(shù), 2)在第二組權重中給第一個像素負數(shù),而第二個還是正數(shù)…… 這樣,我們相當于從多個角度對輸入數(shù)據進行分析匯總,得到了多個輸出結果,也就是對數(shù)據的多種評價。 非線性部分 非線性部分有一些“套路”函數(shù),這里只說下其中的一個經典函數(shù)——sigmoid。它的函數(shù)形式如下所示: 這個函數(shù)的輸入正是我們上一步線性部分的輸出z,此時z取值范圍在,經過了這個函數(shù)就變成了。 那非線性部分為什么要做這個函數(shù)轉換呢?以我的粗淺理解,其中的一個作用就是作數(shù)據的歸一化。不管前面的線性部分做了怎樣的工作,到了非線性這里,所有的數(shù)值將被限制在一個范圍內,這樣后面的網絡層如果要基于前面層的數(shù)據繼續(xù)計算,這個數(shù)值就相對可控了。不然如果每一層的數(shù)值大小都不一樣,有的范圍在(0,1),有的在(0,10000),做優(yōu)化的時候優(yōu)化步長的設定就會有麻煩。 另外一個作用,就是打破之前的線性映射關系。如果全連接層沒有非線性部分,只有線性部分,我們在模型中疊加多層神經網絡是沒有意義的,我們假設有一個2層全連接神經網絡,其中沒有非線性層,那么對于第一層有: 這個長得很復雜的函數(shù)的范圍是(-1,1)??梢钥闯?,它的函數(shù)范圍和前面的sigmoid不同,它是有正有負的,而sigmoid是全為正的。 神經網絡的模樣 實際上對于只有一層且只有一個輸出的神經網絡,如果它的非線性部分還使用sigmoid函數(shù),那么它的形式和邏輯斯特回歸(logistic regression)是一樣的。所以可以想象神經網絡模型從概念上來看比邏輯斯特回歸要復雜。那么它的復雜的樣子是什么樣呢?下面給出一段全連接層的代碼,開始做實驗: class FC: 從代碼上看東西并不多嘛,注意到我們會對參數(shù)中的w進行隨機初始化,有時我們會讓老天隨機一個神經網絡給我們,我們也可以看看隨機大帝的旨意。 為了方便可視化,這里只做輸入為2,輸出為1的數(shù)據。好了,先來看1號選手: x = np.linspace(-10,10,100) 定睛一看這其實就是一個標準的Logistic Regression。他的圖像如下所示: 經過多次隨機測試,基本上它都是這個形狀,只不過隨著權重隨機的數(shù)值變化,這個“臺階”對旋轉到不同的方向,但歸根結底還是一個臺階。 這也說明1層神經網絡是沒有出路的,它本質上還是個線性分類器的實力,那么小伙伴還給它加一層吧: fc = FC(2, 3) 這次我們暫時不用隨機權重,而是自己設置了幾個數(shù)值,可以看出,參數(shù)設置得很用心。兩層全都是正數(shù)……,那么圖像呢? 看上去比之前的臺階“柔軟”了一些,但歸根結底還是很像一個臺階……好吧,那我們加點負權重,讓我們從兩個方面分析輸入數(shù)據: fc = FC(2, 3) 趕緊上圖: 加了負權重后,看上去終于不那么像臺階了,這時候2層神經網絡的非線性能力開始顯現(xiàn)出來了。下面把權重交給隨機大帝: fc = FC(2, 100) 上圖: 這時候的非線性已經非常明顯了,我們不妨繼續(xù)加幾層看看DNN的厲害: fc = FC(2, 10) 這個圖看上去又復雜了許多…… 從上面的實驗中可以看出,層數(shù)越高,非線性的“能力”確實越強,腦洞開得也越大。 知道了他的厲害,下回我們將詳細聊下它的求解方法——反向傳播(Back Propagation)。 文章代碼可以在hsmyy/zhihuzhuanlan (http://link.zhihu.com/?target=https%3A//github.com/hsmyy/zhihuzhuanlan/blob/master/FCLayer.ipynb)找到
|
|