前饋神經網絡(feedforward neural network)是一種最簡單的神經網絡,各神經元分層排列。每一個神經元只與前一層的神經元相連。接收前一層的輸出,並輸出給下一層.各層間沒有反饋。是目前應用最普遍、發展最迅速的人工神經網絡之一。研究從20世紀60年代開始,目前理論研究和實際應用達到了很高的水平html
——百度百科python
而深度學習模型,相似的模型統稱是叫 深度前饋網絡(Deep Feedforward Network),其目標是擬合某個函數f,因爲從輸入到輸出的過程當中不存在與模型自身的反饋鏈接,所以被稱爲「前饋」。常見的深度前饋網絡有:多層感知機、自編碼器、限制玻爾茲曼機、卷積神經網絡等等。算法
提及多層感知器(Multi-Later Perceptron),不得不先介紹下單層感知器(Single Layer Perceptron),它是最簡單的神經網絡,包含了輸入層和輸出層,沒有所謂的中間層(隱含層),可看下圖:網絡
也就是說,將輸入向量賦予不一樣的權重向量,整合後加起來,並經過激活函數輸出1或-1,通常單層感知機只能解決線性可分的問題,以下圖:機器學習
我選擇了0個隱含層,也就是咱們介紹的單層感知機,對於能夠線性可分的數據,效果仍是能夠的。若是我換成線性不可分的數據集,以下圖,那麼跑半天都跑不出個什麼結果來。ide
這個時候就引入多層感知器,它相比單層感知器多了一個隱含層的東西,一樣的數據集,我加入兩層 隱含層,瞬間就能夠被分類得很好。函數
對於上面直觀的瞭解,我這裏仍是要深刻介紹一下多層感知機的原理。Multi-Layer Perceptron(咱們後面都叫MLP),MLP並無規定隱含層的數量,所以咱們能夠根據本身的需求選擇合適的層數,也對輸出層神經元沒有個數限制。性能
感知機算法中包含了前向傳播(FP)和反向傳播(BP)算法,但在介紹它們以前,咱們先來了解一下深度神經網絡的激活函數。學習
爲了解決非線性的分類或迴歸問題,咱們的激活函數必須是非線性的函數,另外咱們使用基於梯度的方式來訓練模型,所以激活函數也必須是連續可導的。 @ 磐創 AI優化
經常使用的激活函數主要是:
Sigmoid函數就是Logistic函數,其數學表達式爲:
$$
f(z) = \frac{1}{1+e^{-z}}
$$
對應函數圖像爲:
對應的導函數爲:
$$
f^{'}(z) = f(z)(1-f(z))
$$
能夠看出,Sigmoid激活函數在定義域上是單調遞增的,越靠近兩端變化越平緩,而這會致使咱們在使用BP算法的時候出現梯度消失的問題。
Tanh激活函數中文名叫雙曲正切激活函數,其數學表達式爲:
$$
f(z)=tanh(z)=\frac{\sin hz}{\cos hz}=\frac{e^z-e^{-z}}{e^z+e^{-z}}
$$
對應函數圖像爲:
對應的導函數爲:
$$
f^{'}(z)=1-(f(z))^2
$$
一樣的,tanh激活函數和sigmoid激活函數同樣存在梯度消失的問題,可是tanh激活函數總體效果會優於Sigmoid激活函數。
Q:爲何Sigmoid和Tanh激活函數會出現梯度消失的現象?
A:二者在z很大(正無窮)或者很小(負無窮)的時候,其導函數都會趨近於0,形成梯度消失的現象。
ReLU激活函數又稱爲修正線性單元或整流性單元函數,是目前使用比較多的激活函數,其數學表達式爲:
$$
f(z)=max(0,z)
$$
對應函數圖像爲(a):
對應的導函數爲:
$$
f^{'}=\begin{cases} 1,z>0; \ 0,z \leq0 \end{cases}
$$
ReLU激活函數的收斂速度要比上面兩種要快得多,ReLU激活函數的X軸左側值恆爲0,使得網絡具備必定的稀疏性,從而減小參數之間的依存關係,緩解了過擬合的狀況,並且它的導函數有部分爲常數1,所以不存在梯度消失的問題。但ReLU激活函數也有弊端,那就是會丟失一些特徵信息。
上面能夠看到LReLU激活函數的圖像了,它和ReLU激活函數的區別在於當z<0時,其值不爲0,而是一個斜率爲a的線性函數(通常a會是一個十分小的正數),這樣子即起到了單側抑制,也不徹底丟失負梯度信息,其導函數表達式爲:
$$
f^{'}=\begin{cases} z,z>0; \ az,z \leq0 \end{cases}
$$
損失函數(Loss Function)又被稱爲Cost Function,做用是用來表示預測值與真實值之間的偏差,深度學習模型的訓練是基於梯度的方法最小化Loss Function的過程,下面就介紹幾種常見的損失函數。
均方偏差(Mean Squared Error,MSE)是比較經常使用的損失函數,其數學表達式以下:
$$
MSE=\frac{1}{2N}\sum_{k=1}^n (y_k- \hat{y_k})^2
$$
交叉熵(Crocs Entropy)損失函數使用訓練數據的預測值與真實值之間的交叉熵來做爲損失函數,其數學表達式以下:
$$
H(p,q)=E_p[\frac{1}{log(q)}] = - \sum_xp(x)log(q(x))
$$
通常來講,MSE更適合輸出值爲連續值,而且最後一層不含Sigmoid或Softmax激活函數的神經網絡;而交叉熵則適合二分類或者多分類的場景。
在MLP中,輸入信號經過各個網絡層的隱節點產生輸出的過程,咱們稱之爲「前向傳播「,而前向傳播最終是產生一個標量損失函數。而反向傳播算法(Backpropagation)則是將損失函數的信息沿着網絡層向後傳播用以計算梯度,達到優化網絡參數的目的。
由於這篇文章仍是主要以引導瞭解爲主,關於BP算法原理的講解和推導就不展開,有興趣的能夠參考下面兩篇文章(來自公衆號 @磐創AI):
神經網絡的訓練,經常會遇到的問題就是過擬合,而解決過擬合問題的方法也有不少,簡單羅列下:Data Augmentation(數據增廣)、Regularization(正則化)、Model Ensemble(模型集成)、Dropout等等。此外,訓練深度學習網絡還有學習率、權重衰減係數、Dropout比例的調參等。還有Batch Normalization,BN(批量歸一化)也能夠加速訓練過程的收斂,有效規避複雜參數對網絡訓練效率的影響。
Data Augmentation也就是數據增廣的意思,就是在不改變數據類別的狀況下,這裏主要針對圖像數據來講,主要包括但不限於:
1)角度旋轉
2)隨機裁剪
3)顏色抖動:指的是對顏色的數據加強,包括圖像亮度、飽和度、對比度變化等
4)增長噪聲:主要是高斯噪聲,在圖像中隨機加入
5)水平翻轉
6)豎直翻轉
考慮到全鏈接的深度神經網絡,同一層中的任意神經元都是同構的,因此擁有相同的輸入和輸出,若是參數所有初始化爲同一個值,不管是前向傳播仍是反向傳播的取值都會是同樣的,學習的過程將沒法打破這種狀況。所以,咱們須要隨機地初始化神經網絡的參數值,簡單的通常會在 $$(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})$$ 的均勻分佈中去隨機抽取,其中d是一個神經元接受的輸入維度。
學習率咱們一般設爲0.1,可是若是在實踐中驗證集上的loss或者accuracy不變的時候,能夠考慮增長2~5倍的學習率。
Dropout在深度學習網絡訓練中是十分經常使用的,指的是以必定的機率p隨機丟棄一部分神經元節點,而這個「丟棄」只是臨時的,是針對每一次小批量的訓練數據而言,因爲是隨機丟棄,因此每一次的神經網絡結構都會不同,至關於每次迭代都是在訓練不一樣結構的神經網絡,有點像傳統機器學習中的Bagging方法。
具體實現上,在訓練過程當中,神經元的節點激活值以必定的機率p被「丟棄」,也就是「停工」。所以,對於包含N個神經元節點的網絡,在Dropout的做用下能夠看作是生成 2的N次方個模型的集合,這個過程會減弱全體神經元之間的聯合適應性,減小過擬合的風險,加強泛化能力。
由於神經網絡的訓練過程本質就是對數據分佈的學習,所以訓練前對輸入數據進行歸一化處理顯得很重要。咱們知道,神經網絡有不少層,每通過一個隱含層,訓練數據的分佈會由於參數的變化而發生改變,致使網絡在每次迭代中都須要擬合不一樣的數據分佈,這樣子會增長訓練的複雜度以及過擬合的風險。
所以咱們須要對數據進行歸一化處理(均值爲0,標準差爲1),把數據分佈強制統一再一個數據分佈下,並且這一步不是一開始作的,而是在每次進行下一層以前都須要作的。也就是說,在網路的每一層輸入以前增長一個當前數據歸一化處理,而後再輸入到下一層網路中去訓練。
這個咱們見多了,通常就是L一、L2比較常見,也是用來防止過擬合的。
L1正則化會使得權重向量w在優化期間變得稀疏(例如很是接近零向量)。 帶有L1正則化項結尾的神經網絡僅僅使用它的最重要的而且接近常量的噪聲的輸入的一個稀疏的子集。相比之下,最終的權重向量從L2正則化一般是分散的、小數字。在實踐中,若是你不關心明確的特徵選擇,能夠預計L2正則化在L1的性能優越。
L2正則化也許是最經常使用的正則化的形式。它能夠經過將模型中全部的參數的平方級做爲懲罰項加入到目標函數(objective)中來實現,L2正則化對尖峯向量的懲罰很強,而且傾向於分散權重的向量。
模型集成在現實中很經常使用,通俗來講就是針對一個目標,訓練多個模型,並將各個模型的預測結果進行加權,輸出最後結果。主要有3種方式:
1)相同模型,不一樣的初始化參數;
2)集成幾個在驗證集上表現效果較好的模型;
3)直接採用相關的Boosting和Bagging算法。
終於來到了咱們耳熟能詳的CNN了,也就是卷積神經網絡(Convolutional Neural Network,CNN),它也是屬於前饋神經網絡的一種,其特色是每層的神經元節點只響應前一層局部區域範圍內的神經元(全鏈接網絡中每一個神經元節點則是響應前一層的所有節點)。
一個深度卷積神經網絡模型,通常由若干卷積層疊加若干全鏈接層組成,中間包含各類的非線性操做、池化操做。卷積運算主要用於處理網格結構的數據,所以CNN天生對圖像數據的分析與處理有着優點,簡單地來理解,那就是CNN是利用濾波器(Filter)將相鄰像素之間的輪廓過濾出來。
卷積的濾波器(Filter)咱們能夠看作是一個window,能夠觀察下面的案例,有一個6X6的網絡以及一個3X3的Filter,其中Filter的每一個格子上有權值。拿着FIlter在網絡上去移動,直到全部的小格子都被覆蓋到,每次移動,都將Filter「觀察」到的內容,與之權值相乘做爲結果輸出。最後,咱們能夠獲得一個4X4的網格矩陣。(下面的6張圖來自參考文獻5,侵刪)
卷積後的矩陣大小與一開始的不一致,那麼咱們須要對邊緣進行填充,以保證尺寸一致。
也就是Filter移動的步伐大小,上面的例子爲1,其實能夠由咱們本身來指定,有點像是學習率。
深度指的是圖片的深度,一張6X6X3大小的圖片通過3X3X3的Filter過濾後會獲得一個4X4X1大小的圖片,所以深度爲1。咱們也能夠經過增長Filter的個數來增長深度,以下:
由於濾波器在進行窗口移動的過程當中會有不少冗餘計算,效率很慢,池化操做的目的在於加速卷積操做,最經常使用的有Maxpooling,其原理以下圖所示:
1)Sparse Interaction(稀疏交互)
由於卷積核的尺度會小於輸入的維度,也就是咱們的FIlter會小於網絡大小同樣,這樣子每一個輸出神經元僅僅會與部分特定局部區域內的神經元存在鏈接權重(也就是產生交互),這種操做特性咱們就叫稀疏交互。稀疏交互會把時間複雜度減小好幾個數量級,同時對過擬合的狀況也有必定的改善。
2)Parameter Sharing(參數共享)
指的是在同一個模型的不一樣模塊使用相同的參數,它是卷積運算的固有屬性。和咱們上面說的Filter上的權值大小應用於全部網格同樣。
0)《百面機器學習》(文中未標明出處的圖片均來自此書)
1)Tensorflow系列專題(四):神經網絡篇以前饋神經網絡綜述
https://blog.csdn.net/fendouaini/article/details/83626441
2)深度學習之(神經網絡)單層感知器(python)(一)
https://www.jianshu.com/p/d7189cbd0983?from=groupmessage
3)多層感知機及其BP算法(Multi-Layer Perception)
https://www.cnblogs.com/ooon/p/5577241.html
4)深度神經網絡訓練的必知技巧
https://www.cnblogs.com/mengmengmiaomiao/p/7852948.html
5)AI學習筆記——卷積神經網絡(CNN)
https://www.jianshu.com/p/49b70f6480d1
本文由博客一文多發平臺 OpenWrite 發佈!