一、神經網絡
1.神經網絡
-
定義:人工神經網絡(Artificial Neural Network,ANN)也簡稱為神經網絡(NN),是一種模仿生物神經網絡結構和功能的計算模型。人腦可以看作是一個生物神經網絡,由眾多的神經元連接而成。各個神經元傳遞復雜的電信號,樹突接收到輸入信號,然后對信號進行處理,通過軸突輸出信號。
-
神經網絡中信息只向一個方向移動,即從輸入節點向前移動,通過隱藏節點,再向輸出節點移動。其中基本部分是:
- 輸入層:即輸入x的那一層
- 輸出層:即輸出y的那一層
- 隱藏層:輸入層和輸出層之間都是隱藏層
-
特點:
- 同一層神經網絡之間沒有連接
- 第N層的每個神經元和第N-1層的所有神經元相連,這就是全連接神經網絡(full connected,fc)
- 第N-1層神經元的輸出就是第N層神經元的輸入
- 每個連接都有一個權重值(w系數和b系數)
2.激活函數
- 激活函數用于對每層的輸出數據(加權和數據)進行變換,進而為整個網絡注入了非線性因素。此時,神經網絡就可以擬合各種曲線
- 沒有引入非線性因素的網絡等價于使用一個線性模型來擬合
- 通過給網絡輸出增加激活函數,實現引入非線性因素,使得網絡模型可以逼近任意函數,提升網絡對復雜問題的擬合能力
(1)sigmiod函數
-
公式:f(x)=11+e?xf(x) = \frac{1}{1+e^{-x}}f(x)=1+e?x1?
-
求導公式:KaTeX parse error: {equation} can be used only in display mode.
-
缺點:當神經網絡的激活處于0, 1位置時,其梯度幾乎為0,容易導致梯度消失,此時網絡參數將更新極其緩慢,或者無法更新
-
一般來說,sigmoid網絡在5層之類就會產生梯度消失現象。而且,該激活函數并不是以0為中心,所以在實踐中很少使用這種激活函數,sigmoid函數一般只用于二分類的輸出層
(2)tanh激活函數
- 公式:f(x)=1?e?2x1+e?2xf(x) = \frac{1-e^{-2x}}{1+e^{-2x}}f(x)=1+e?2x1?e?2x?
- 求導公式:KaTeX parse error: {equation} can be used only in display mode.
- 其輸出值域是(-1, 1),值域范圍更大,使之更適合于神經網絡的輸入層和隱藏層
- 與sigmoid相比,它是以0為中心的,且梯度相對于sigmoid大,使得其收斂速度要比sigmoid快,減少迭代次數,但當輸入值較大時,會導致梯度消失的問題
- 使用時:可在隱藏層使用tanh函數,在輸出層使用sigmoid函數
(3)ReLU激活函數
-
是目前使用最多的一種激活函數
-
公式:f(x)=max(0,x)f(x)=max(0, x)f(x)=max(0,x)
-
求導公式:KaTeX parse error: {equation} can be used only in display mode.
-
激活函數將小于0的值映射為0,而大于0的值則保持不變,它更加重視正信號,而忽略負信號,這種激活函數運算更為簡單,能夠提高模型的訓練效率
-
當x<0時,ReLU導數為0,而當x>0時,則不存在飽和問題。所以,ReLU能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。然而,隨著訓練的推進,部分輸入會落入小于0的區域,導致對應權重無法更新,這種現象被稱為“神經元死亡”
-
ReLU是目前最常用的激活函數。與sigmoid相比,ReLU的優勢是:采用sigmoid函數,計算量大(指數運算),反向傳播球誤差梯度時,計算量相對大,而采用ReLU激活函數,整個過程的計算量節省很多。sigmoid函數反向傳播時,很容易出現梯度消失的情況,從而無法完成深度網絡的訓練。ReLU會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性(網絡變得簡單),并且減少了參數的相互依存關系,緩解了過擬合問題的發生
(4)Softmax函數
-
softmax用于多分類過程中,它是二分類函數sigmoid在多分類上的推廣,目的是將多分類的結果以概率形式呈現出來
-
公式:softmax(zi)=ezi∑jejzsoftmax(z_i)=\frac{e^{z_i}}{\sum_je^z_j}softmax(zi?)=∑j?ejz?ezi??
- ziz_izi?:輸出層中每個神經元加權和(logits)
-
Softmax就是將網絡輸出logits通過softmax函數,就映射成為(0,1)的值,而這些值的累和為1,那么我們將它理解成概率,選取概率最大(也就是值對應最大的節點),作為我們的預測目標類別
(5)激活函數的選擇方法
對于隱藏層
- 優先選擇ReLU激活函數
- 如果ReLU效果不好,那么嘗試其他激活,如Leaky ReLU等
- 如果你使用了ReLU,需要注意一下Dead ReLU問題,避免出現大的梯度導致過多的神經元死亡
- 少使用sigmoid激活函數,可以嘗試使用tanh激活函數
對于輸出層
- 二分類問題選擇sigmoid激活函數
- 多分類問題選擇softmax激活函數
- 回歸問題選擇identity激活函數(恒等激活)
3.參數初始化
優先選擇kaiming和xavier初始化方式
(1)初始化www
- 均勻分布初始化:權重參數初始化從區間均勻隨機取值。即在(?1d,1d)(-\frac{1}{\sqrt d}, \frac{1}{\sqrt d})(?d?1?,d?1?)均勻分布中生成當前神經元的權重,其中d為每個神經元的輸入數量
- 正態分布初始化:隨機初始化從均值為0,標準差是1的高斯分布中取樣,使用一些很小的值對參數W進行初始化
(2)初始化bbb
- 全0初始化:將神經網絡中的所有權重參數初始化為0
- 全1初始化:將神經網絡中的所有權重參數初始化為1
- 固定值初始化:將神經網絡中的所有權重參數初始化為某個固定值
(3)初始化方法改進
- kaiming初始化,也叫做HE初始化
- HE初始化分為正態分布的HE初始化,均勻分布的HE初始化
- 正態分布的HE初始化:stddev=2fan_instddev = \sqrt{\frac{2}{fan\_in}}stddev=fan_in2??
- 均勻分布的HE初始化:從[-limit, limit]中的均勻分布中抽取樣本,limit是6fan_in\sqrt{\frac{6}{fan\_in}}fan_in6??
- fan_infan\_infan_in輸入神經元個數
- HE初始化分為正態分布的HE初始化,均勻分布的HE初始化
- xavier初始化,也叫做Glorot初始化
- Glorot初始化分為正態分布的xavier初始化,均勻分布的xavier初始化
- 正態化的xavier初始化:stddev=2fan_in+fan_outstddev=\sqrt{\frac{2}{fan\_in+fan\_out}}stddev=fan_in+fan_out2??
- 均勻分布的Xavier初始化:從[-limit, limit]中的均勻分布中抽取樣本,limit是6fan_in+fan_out\sqrt{\frac{6}{fan\_in+fan\_out}}fan_in+fan_out6??
- fan_infan\_infan_in是輸入神經元個數,fan_outfan\_outfan_out是輸出的神經元個數
- Glorot初始化分為正態分布的xavier初始化,均勻分布的xavier初始化
4.神經網絡搭建和參數計算
(1)模型搭建
- 在pytorch中定義深度神經網絡其實就是層堆疊的過程,繼承自nn.Module,實現兩個方法
- _init\_ 方法中定義網絡中的層結構,主要是全連接層,并進行初始化
- forward方法,在實例化模型的時候,底層會自動調用該函數。該函數中可以定義學習率,為初始化定義的layer傳入數據等。
(2)網絡參數量的統計方法
- 統計每一層中的權重w和偏置b的數量
from torchsummary import summary
……
summary(my_modelll, input_size=(3, ), batch_size = 8)for name, para in my_model.named_parameters():print(name)print(para)
5.神經網絡優缺點
- 優點
- 精度高,性能優于其他機器學習方法,甚至在某些領域超過了人類
- 可以近似任意的非線性函數隨之計算機硬件的發展
- 近年來在學界和業界受到了熱捧,有大量的框架和庫可調
- 缺點
- 黑箱,很難解釋模型是怎么工作的
- 訓練時間長,需要大量的算力
- 網絡結構復雜,需要調整超參數
- 小數據集上表現不佳,容易發生過擬合