最基本的神經網絡非全連接神經網絡莫屬了,在圖中,a是神經元的輸出,l代表層數,i代表第i個神經元。
兩層神經元之間兩兩連接,注意這裡的w代表每條線上的權重,如果是第l-1層連接到l層,w的上标是l,下表ij代表了第l-1層的第j個神經元連接到第l層的第i個神經元,這裡與我們的嘗試似乎不太一樣,不過并無大礙。
所以兩層之間的連接矩陣可以寫為如下的形式:
每一個神經元都有一個偏置項:
第l層的第i個神經元的輸出a是怎麼得到的呢?我們首先會對上一層的所有神經元與該神經元計算一個加權平均,最後不要忘記加上偏置項。這個值記為z,即該神經元的輸入。
如果寫成矩陣形式如下圖:
針對輸入z,我們經過一個激活函數得到輸出a:
常見的激活函數有:
這裡介紹三個:
sigmoid
Sigmoid 是常用的非線性的激活函數,它的數學形式如下:
它能夠把輸入的連續實值“壓縮”到0和1之間。
特别的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1,如下圖所示:
sigmoid 函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因為它的一些 缺點:
**Sigmoids saturate and kill gradients. **(saturate 這個詞怎麼翻譯?飽和?)sigmoid 有一個非常緻命的缺點,當輸入非常大或者非常小的時候(saturation),這些神經元的梯度是接近于0的,從圖中可以看出梯度的趨勢。所以,你需要尤其注意參數的初始值來盡量避免saturation的情況。如果你的初始值很大的話,大部分神經元可能都會處在saturation的狀态而把gradient kill掉,這會導緻網絡變的很難學習。
Sigmoid 的 output 不是0均值. 這是不可取的,因為這會導緻後一層的神經元将得到上一層輸出的非0均值的信号作為輸入。
産生的一個結果就是:如果數據進入神經元的時候是正的(e.g. x>0 elementwise in f=wTx+b),那麼 w 計算出的梯度也會始終都是正的。
當然了,如果你是按batch去訓練,那麼那個batch可能得到不同的信号,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會産生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。
tanh
tanh 跟sigmoid還是很像的,實際上,tanh 是sigmoid的變形:
tanh(x)=2sigmoid(2x)−1
與 sigmoid 不同的是,tanh 是0均值的。因此,實際應用中,tanh 會比 sigmoid 更好(畢竟去粗取精了嘛)。
tanh的函數圖像如下圖所示:
ReLu
近年來,ReLU 變的越來越受歡迎。它的數學表達式如下:
f(x)=max(0,x)
很顯然,從圖左可以看出,輸入信号<0時,輸出都是0,>0 的情況下,輸出等于輸入。w 是二維的情況下,使用ReLU之後的效果如下:
所以,整合一下上面說的:
循環神經網絡常用來處理Sequence類型的數據,比如一句話。
循環神經網絡的結構如下,簡單來說,我們的網絡結構定義在中間的f,它每次接受兩個輸入h和x,輸出y和h':
當然,循環神經網絡也可以有多層,網絡結構如下圖所示:
另外,還有雙向循環神經網絡的結構:
了解了各種RNN的基本結構之後,那麼問題來了,f怎麼定義的呢,對于一般的RNN,中間的f定義如下(下面的定義忽略了偏置項):
在RNN的基礎上,還有一種常用的基本結構是LSTM,如果在RNN中,我們把輸入h看成是記憶的話,LSTM将這種記憶進一步分為了長時記憶和短時記憶:
這裡的c變化非常緩慢,可以認為是長時記憶,h變化非常快,可以認為是短時記憶。可以看到,LSTM的輸入有三項x,h,c,輸出也是三項,那麼對于三項輸入,LSTM内部是怎麼處理的呢?
根據x和h,我們會計算出三個門,分别為輸入門、遺忘門、輸出門。
根據這三個門,我們可以得到LSTM的基本結構如下:
上一時刻輸入的c與遺忘門進行對位相乘,選擇對之前信息的遺忘程度,然後加入這一時刻的輸入信息,作為這一時刻冊長時記憶c輸出。長時記憶經過tanh激活之後再與輸出門對位相乘,作為這一時刻的短時記憶輸出,h再經過一層神經網絡,得到這一時刻的輸出。看到這裡,想清楚過程,我們可以嘗試一下在紙上畫一下LSTM的結構。
還有一種常用的結構,這種結構使用程度漸漸超過了LSTM,稱為GRU,對LSTM網絡進行了壓縮,更容易訓練。下面圖上的公式實際是錯的,右邊第一項上标應該是t-1 .
卷積網絡有兩個重要的特性
稀疏連接 Sparse Connectivity :每個神經元僅與前一層部分神經元相連接
參數共享 Parameter Sharing:同一個feature map的參數是相同的。
假設有100 * 100像素 的 圖片,如果下一層有100個神經元,那麼全連接的神經網絡,将有100 * 100 * 100=100萬的參數,如果采用稀疏連接和參數共享,後一層的一個神經元隻與前一層的100個神經元連接,那麼需要100 * 100 = 1萬個參數,如果與不同神經元連接的這100條線的參數都相同,那麼隻需要100個參數,這叫一個feature map或者說一個field,但是這隻能學到一個特征,我們可以定義多個feature map來學習不同的特征,如果有100個feature map,那麼參數就是100 * 100的量。
如下面的圖中,我們定義了兩個feature map,紅橙黃連線上的參數是共享的,藍綠連線上的參數是共享的。
上面是卷積的概念,在卷積神經網絡中,還有一個重要的概念是池化:Pooling,即将幾個神經元的輸出變為一個輸出,池化的方法有平均法、最大值法和L2法。
視頻中還讨論的一個點是,我們該拿哪些結果進行池化,可以是同一個feature map出來的,也可以組合不同feature map出來的。
有話要說...