第三章_深度學習基礎

文章目錄

第三章 深度學習基礎

3.1 基本概念

3.1.1 神經網絡組成?

爲了描述神經網絡,我們先從最簡單的神經網絡說起。

感知機

簡單的感知機如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-24FhxCu7-1575791287815)(./img/ch3/3-1.png)]

其輸出爲:

output={0,ifiwixithreshold1,ifiwixi>threshold output = \left\{ \begin{aligned} 0, \quad if \sum_i w_i x_i \le threshold \\ 1, \quad if \sum_i w_i x_i > threshold \end{aligned} \right.

假如把感知機想象成一個加權投票機制,比如 3 位評委給一個歌手打分,打分分別爲 4 分、1 分、-3 分,這 3 位評分的權重分別是 1、3、2,則該歌手最終得分爲 $ 4 * 1 + 1 * 3 + (-3) * 2 = 1 $。按照比賽規則,選取的 threshold 爲 3,說明只有歌手的綜合評分大於 3 時,纔可順利晉級。對照感知機,該選手被淘汰,因爲

iwixi<threshold=3,output=0 \sum_i w_i x_i < threshold=3, output = 0

用 $ -b $ 代替 threshold。輸出變爲:

output={0,ifwx+bthreshold1,ifwx+b>threshold output = \left\{ \begin{aligned} 0, \quad if w \cdot x + b \le threshold \\ 1, \quad if w \cdot x + b > threshold \end{aligned} \right.

設置合適的 $ x $ 和 $ b $,一個簡單的感知機單元的與非門表示如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6qLzfILz-1575791287817)(./img/ch3/3-2.png)]

當輸入爲 $ 0,1 $ 時,感知機輸出爲 $ 0 * (-2) + 1 * (-2) + 3 = 1 $。

複雜一些的感知機由簡單的感知機單元組合而成:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-djANsdj6-1575791287818)(./img/ch3/3-3.png)]

Sigmoid單元

感知機單元的輸出只有 0 和 1,實際情況中,更多的輸出類別不止 0 和 1,而是 $ [0, 1] $ 上的概率值,這時候就需要 sigmoid 函數把任意實數映射到 $ [0, 1] $ 上。

神經元的輸入

z=iwixi+b z = \sum_i w_i x_i + b

假設神經元的輸出採用 sigmoid 激活函數

σ(z)=11+ez \sigma(z) = \frac{1}{1+e^{-z}}

sigmoid 激活函數圖像如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-52gp3SdH-1575791287818)(./img/ch3/3-4.png)]

全連接神經網絡
即第 $ i $ 層的每個神經元和第 $ i-1 $ 層的每個神經元都有連接。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-v5iHPgUL-1575791287819)(./img/ch3/3-5.png)]

輸出層可以不止有 1 個神經元。隱藏層可以只有 1 層,也可以有多層。輸出層爲多個神經元的神經網絡例如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7feqVLFL-1575791287820)(./img/ch3/3-6.png)]

3.1.2神經網絡有哪些常用模型結構?

答案來源:25張圖讓你讀懂神經網絡架構

下圖包含了大部分常用的模型:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q44hmpDT-1575791287821)(./img/ch3/3-7.jpg)]

3.1.3如何選擇深度學習開發平臺?

現有的深度學習開源平臺主要有 Caffe, Torch, MXNet, CNTK, Theano, TensorFlow, Keras 等。那如何選擇一個適合自己的平臺呢,下面列出一些衡量做參考。

參考1:與現有編程平臺、技能整合的難易程度

主要是前期積累的開發經驗和資源,比如編程語言,前期數據集存儲格式等。

參考2: 與相關機器學習、數據處理生態整合的緊密程度

深度學習研究離不開各種數據處理、可視化、統計推斷等軟件包。考慮建模之前,是否具有方便的數據預處理工具?建模之後,是否具有方便的工具進行可視化、統計推斷、數據分析?

參考3:對數據量及硬件的要求和支持

深度學習在不同應用場景的數據量是不一樣的,這也就導致我們可能需要考慮分佈式計算、多 GPU 計算的問題。例如,對計算機圖像處理研究的人員往往需要將圖像文件和計算任務分部到多臺計算機節點上進行執行。當下每個深度學習平臺都在快速發展,每個平臺對分佈式計算等場景的支持也在不斷演進。

參考4:深度學習平臺的成熟程度

成熟程度的考量是一個比較主觀的考量因素,這些因素可包括:社區的活躍程度;是否容易和開發人員進行交流;當前應用的勢頭。

參考5:平臺利用是否多樣性?

有些平臺是專門爲深度學習研究和應用進行開發的,有些平臺對分佈式計算、GPU 等構架都有強大的優化,能否用這些平臺/軟件做其他事情?比如有些深度學習軟件是可以用來求解二次型優化;有些深度學習平臺很容易被擴展,被運用在強化學習的應用中。

3.1.4爲什麼使用深層表示?

  1. 深度神經網絡的多層隱藏層中,前幾層能學習一些低層次的簡單特徵,後幾層能把前面簡單的特徵結合起來,去學習更加複雜的東西。比如剛開始檢測到的是邊緣信息,而後檢測更爲細節的信息。

  2. 深層的網絡隱藏單元數量相對較少,隱藏層數目較多,如果淺層的網絡想要達到同樣的計算結果則需要指數級增長的單元數量才能達到。

3.1.5爲什麼深層神經網絡難以訓練?

答案來源:

爲什麼深層神經網絡難以訓練

爲什麼很難訓練深度神經網絡

  1. 梯度消失
    梯度消失是指通過隱藏層從後向前看,梯度會變的越來越小,說明前面層的學習會顯著慢於後面層的學習,所以學習會卡住,除非梯度變大。下圖是不同隱含層的學習速率;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mq9wzc28-1575791287822)(./img/ch3/3-8.png)]

  1. 梯度爆炸
    又稱exploding gradient problem,在深度網絡或循環神經網絡(RNN)等網絡結構中,梯度可在網絡更新的過程中不斷累積,變成非常大的梯度,導致網絡權重值的大幅更新,使得網絡不穩定;在極端情況下,權重值甚至會溢出,變爲NaN值,再也無法更新。 具體可參考文獻:A Gentle Introduction to Exploding Gradients in Neural Networks

  2. 權重矩陣的退化導致模型的有效自由度減少。參數空間中學習的退化速度減慢,導致減少了模型的有效維數,網絡的可用自由度對學習中梯度範數的貢獻不均衡,隨着相乘矩陣的數量(即網絡深度)的增加,矩陣的乘積變得越來越退化;

在有硬飽和邊界的非線性網絡中(例如 ReLU 網絡),隨着深度增加,退化過程會變得越來越快。Duvenaud 等人 2014 年的論文裏展示了關於該退化過程的可視化:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xtFsCvMG-1575791287822)(./img/ch3/3-9.jpg)]

隨着深度的增加,輸入空間(左上角所示)會在輸入空間中的每個點處被扭曲成越來越細的單絲,只有一個與細絲正交的方向影響網絡的響應。沿着這個方向,網絡實際上對變化變得非常敏感。

3.1.6 深度學習和機器學習有什麼不同?

機器學習:利用計算機、概率論、統計學等知識,輸入數據,讓計算機學會新知識。機器學習的過程,就是通過訓練數據尋找目標函數。

深度學習是機器學習的一種,現在深度學習比較火爆。在傳統機器學習中,手工設計特徵對學習效果很重要,但是特徵工程非常繁瑣。而深度學習能夠從大數據中自動學習特徵,這也是深度學習在大數據時代受歡迎的一大原因。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kUoLSjH5-1575791287823)(./img/ch3/3-10.jpg)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dg39pT3X-1575791287824)(./img/ch3/3-11.jpg)]

3.2 網絡操作與計算

3.2.1前向傳播與反向傳播?

答案來源:神經網絡中前向傳播和反向傳播解析

在神經網絡的計算中,主要由前向傳播(foward propagation,FP)和反向傳播(backward propagation,BP)。

前向傳播

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-95zOK0wv-1575791287825)(./img/ch3/3-12.png)]

假設上一層結點 $ i,j,k,… $ 等一些結點與本層的結點 $ w $ 有連接,那麼結點 $ w $ 的值怎麼算呢?就是通過上一層的 $ i,j,k,… $ 等結點以及對應的連接權值進行加權和運算,最終結果再加上一個偏置項(圖中爲了簡單省略了),最後在通過一個非線性函數(即激活函數),如 ReLu,sigmoid 等函數,最後得到的結果就是本層結點 $ w $ 的輸出。

最終不斷的通過這種方法一層層的運算,得到輸出層結果。

反向傳播

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4LHxQuGw-1575791287826)(./img/ch3/3-13.png)]

由於我們前向傳播最終得到的結果,以分類爲例,最終總是有誤差的,那麼怎麼減少誤差呢,當前應用廣泛的一個算法就是梯度下降算法,但是求梯度就要求偏導數,下面以圖中字母爲例講解一下:

設最終中誤差爲 $ E $,對於輸出那麼 $ E $ 對於輸出節點 $ y_l $ 的偏導數是 $ y_l - t_l $,其中 $ t_l $ 是真實值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函數,$ z_l $ 是上面提到的加權和,那麼這一層的 $ E $ 對於 $ z_l $ 的偏導數爲 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一層也是這麼計算,只不過 $ \frac{\partial E}{\partial y_k} $ 計算方法變了,一直反向傳播到輸入層,最後有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j $。然後調整這些過程中的權值,再不斷進行前向傳播和反向傳播的過程,最終得到一個比較好的結果;

3.2.2如何計算神經網絡的輸出?

答案來源:零基礎入門深度學習(3) - 神經網絡和反向傳播算法

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0BxcrbPs-1575791287827)(./img/ch3/3-14.png)]

如上圖,輸入層有三個節點,我們將其依次編號爲 1、2、3;隱藏層的 4 個節點,編號依次爲 4、5、6、7;最後輸出層的兩個節點編號爲 8、9。比如,隱藏層的節點 4,它和輸入層的三個節點 1、2、3 之間都有連接,其連接上的權重分別爲是 $ w_{41}, w_{42}, w_{43} $。

爲了計算節點 4 的輸出值,我們必須先得到其所有上游節點(也就是節點 1、2、3)的輸出值。節點 1、2、3 是輸入層的節點,所以,他們的輸出值就是輸入向量本身。按照上圖畫出的對應關係,可以看到節點 1、2、3 的輸出值分別是 $ x_1, x_2, x_3 $。

a4=σ(wTa)=σ(w41x4+w42x2+w43a3+w4b) a_4 = \sigma(w^T \cdot a) = \sigma(w_{41}x_4 + w_{42}x_2 + w_{43}a_3 + w_{4b})

其中 $ w_{4b} $ 是節點 4 的偏置項

同樣,我們可以繼續計算出節點 5、6、7 的輸出值 $ a_5, a_6, a_7 $。

計算輸出層的節點 8 的輸出值 $ y_1 $:

y1=σ(wTa)=σ(w84a4+w85a5+w86a6+w87a7+w8b) y_1 = \sigma(w^T \cdot a) = \sigma(w_{84}a_4 + w_{85}a_5 + w_{86}a_6 + w_{87}a_7 + w_{8b})

其中 $ w_{8b} $ 是節點 8 的偏置項。

同理,我們還可以計算出 $ y_2 $。這樣輸出層所有節點的輸出值計算完畢,我們就得到了在輸入向量 $ x_1, x_2, x_3, x_4 $ 時,神經網絡的輸出向量 $ y_1, y_2 $, 。這裏我們也看到,輸出向量的維度和輸出層神經元個數相同。

3.2.3如何計算卷積神經網絡輸出值?

答案來源:零基礎入門深度學習(4) - 卷積神經網絡

假設有一個 5*5 的圖像,使用一個 3*3 的 filter 進行卷積,想得到一個 3*3 的 Feature Map,如下所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RSvTdxZM-1575791287827)(./img/ch3/3-15.png)]

$ x_{i,j} $ 表示圖像第 $ i $ 行第 $ j $ 列元素。$ w_{m,n} $ 表示 filter 第 $ m $ 行第 $ n $ 列權重。 $ w_b $ 表示 filter 的偏置項。 表示 feature map 第 $ i $ 行第 $ j $ 列元素。 $ f $ 表示激活函數,這裏以 relu 函數爲例。

卷積計算公式如下:

ai,j=f(m=02n=02wm,nxi+m,j+n+wb) a_{i,j} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{i+m, j+n} + w_b )

當步長爲 1 時,計算 feature map 元素 $ a_{0,0} $ 如下:

$$
a_{0,0} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{0+m, 0+n} + w_b )

= relu(w_{0,0} x_{0,0} + w_{0,1} x_{0,1} + w_{0,2} x_{0,2} + w_{1,0} x_{1,0} + w_{1,1} x_{1,1} + w_{1,2} x_{1,2} + w_{2,0} x_{2,0} + w_{2,1} x_{2,1} + w_{2,2} x_{2,2}) \

= 1 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 1 \

= 4
$$

結果如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pmIKJvIF-1575791287828)(./img/ch3/3-16.png)]

其計算過程圖示如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xVq8quZC-1575791287829)(./img/ch3/3-17.gif)]

以此類推,計算出全部的Feature Map。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eko37jtx-1575791287830)(./img/ch3/3-18.png)]

當步幅爲 2 時,Feature Map計算如下

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q8O0vsI6-1575791287830)(./img/ch3/3-19.png)]

注:圖像大小、步幅和卷積後的Feature Map大小是有關係的。它們滿足下面的關係:

W2=(W1F+2P)/S+1H2=(H1F+2P)/S+1 W_2 = (W_1 - F + 2P)/S + 1 H_2 = (H_1 - F + 2P)/S + 1

其中 $ W_2 FeatureMap, 是卷積後 Feature Map 的寬度; W_1 $ 是卷積前圖像的寬度;$ F $ 是 filter 的寬度;$ P $ 是 Zero Padding 數量,Zero Padding 是指在原始圖像周圍補幾圈 0,如果 P 的值是 1,那麼就補 1 圈 0;S 是步幅;$ H_2 $ 卷積後 Feature Map 的高度;$ H_1 $ 是卷積前圖像的寬度。

舉例:假設圖像寬度 $ W_1 = 5 $,filter 寬度 $ F=3 $,Zero Padding $ P=0 $,步幅 $ S=2 Z $ 則

$$
W_2 = (W_1 - F + 2P)/S + 1

= (5-3+0)/2 + 1

= 2
$$

說明 Feature Map 寬度是2。同樣,我們也可以計算出 Feature Map 高度也是 2。

如果卷積前的圖像深度爲 $ D $,那麼相應的 filter 的深度也必須爲 $ D $。深度大於 1 的卷積計算公式:

ai,j=f(d=0D1m=0F1n=0F1wd,m,nxd,i+m,j+n+wb) a_{i,j} = f(\sum_{d=0}^{D-1} \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} w_{d,m,n} x_{d,i+m,j+n} + w_b)

其中,$ D $ 是深度;$ F $ 是 filter 的大小;$ w_{d,m,n} $ 表示 filter 的第 $ d $ 層第 $ m $ 行第 $ n $ 列權重;$ a_{d,i,j} $ 表示 feature map 的第 $ d $ 層第 $ i $ 行第 $ j $ 列像素;其它的符號含義前面相同,不再贅述。

每個卷積層可以有多個 filter。每個 filter 和原始圖像進行卷積後,都可以得到一個 Feature Map。卷積後 Feature Map 的深度(個數)和卷積層的 filter 個數是相同的。下面的圖示顯示了包含兩個 filter 的卷積層的計算。7*7*3 輸入,經過兩個 3*3*3 filter 的卷積(步幅爲 2),得到了 3*3*2 的輸出。圖中的 Zero padding 是 1,也就是在輸入元素的周圍補了一圈 0。Zero padding 對於圖像邊緣部分的特徵提取是很有幫助的。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ILHJHKyn-1575791287831)(./img/ch3/3-20.gif)]

以上就是卷積層的計算方法。這裏面體現了局部連接和權值共享:每層神經元只和上一層部分神經元相連(卷積計算規則),且 filter 的權值對於上一層所有神經元都是一樣的。對於包含兩個 $ 3 * 3 * 3 $ 的 fitler 的卷積層來說,其參數數量僅有 $ (3 * 3 * 3+1) * 2 = 56 $ 個,且參數數量與上一層神經元個數無關。與全連接神經網絡相比,其參數數量大大減少了。

3.2.4 如何計算 Pooling 層輸出值輸出值?

Pooling 層主要的作用是下采樣,通過去掉 Feature Map 中不重要的樣本,進一步減少參數數量。Pooling 的方法很多,最常用的是 Max Pooling。Max Pooling 實際上就是在 n*n 的樣本中取最大值,作爲採樣後的樣本值。下圖是 2*2 max pooling:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D8OuPeaH-1575791287832)(./img/ch3/3-21.png)]

除了 Max Pooing 之外,常用的還有 Mean Pooling ——取各樣本的平均值。
對於深度爲 $ D $ 的 Feature Map,各層獨立做 Pooling,因此 Pooling 後的深度仍然爲 $ D $。

3.2.5 實例理解反向傳播

答案來源:一文弄懂神經網絡中的反向傳播法——BackPropagation

一個典型的三層神經網絡如下所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oBW4LxB3-1575791287832)(./img/ch3/3-22.png)]

其中 Layer $ L_1 $ 是輸入層,Layer $ L_2 $ 是隱含層,Layer $ L_3 $ 是輸出層。

假設輸入數據集爲 $ D={x_1, x_2, …, x_n} $,輸出數據集爲 $ y_1, y_2, …, y_n $。

如果輸入和輸出是一樣,即爲自編碼模型。如果原始數據經過映射,會得到不同與輸入的輸出。

假設有如下的網絡層:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FKbbrZTY-1575791287833)(./img/ch3/3-23.png)]

輸入層包含神經元 $ i_1, i_2 $,偏置 $ b_1 $;隱含層包含神經元 $ h_1, h_2 $,偏置 $ b_2 $,輸出層爲 $ o_1, o_2 w_i $ 爲層與層之間連接的權重,激活函數爲 sigmoid 函數。對以上參數取初始值,如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wtiPR8C1-1575791287834)(./img/ch3/3-24.png)]

其中:

  • 輸入數據 $ i1=0.05, i2 = 0.10 $
  • 輸出數據 $ o1=0.01, o2=0.99 $;
  • 初始權重 $ w1=0.15, w2=0.20, w3=0.25,w4=0.30, w5=0.40, w6=0.45, w7=0.50, w8=0.55 $
  • 目標:給出輸入數據 $ i1,i2 $ (0.05和0.10),使輸出儘可能與原始輸出 $ o1,o2 $,(0.01和0.99)接近。

前向傳播

  1. 輸入層 --> 輸出層

計算神經元 $ h1 $ 的輸入加權和:

$$
net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1

net_{h1} = 0.15 * 0.05 + 0.2 * 0.1 + 0.35 * 1 = 0.3775
$$

神經元 $ h1 $ 的輸出 $ o1 $ :(此處用到激活函數爲 sigmoid 函數):

outh1=11+eneth1=11+e0.3775=0.593269992 out_{h1} = \frac{1}{1 + e^{-net_{h1}}} = \frac{1}{1 + e^{-0.3775}} = 0.593269992

同理,可計算出神經元 $ h2 $ 的輸出 $ o1 $:

outh2=0.596884378 out_{h2} = 0.596884378

  1. 隱含層–>輸出層:

計算輸出層神經元 $ o1 $ 和 $ o2 $ 的值:

$$
net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1

net_{o1} = 0.4 * 0.593269992 + 0.45 * 0.596884378 + 0.6 * 1 = 1.105905967

out_{o1} = \frac{1}{1 + e^{-net_{o1}}} = \frac{1}{1 + e^{1.105905967}} = 0.75136079
$$

這樣前向傳播的過程就結束了,我們得到輸出值爲 $ [0.75136079 , 0.772928465] $,與實際值 $ [0.01 , 0.99] $ 相差還很遠,現在我們對誤差進行反向傳播,更新權值,重新計算輸出。

**反向傳播 **

  1. 計算總誤差

總誤差:(square error)

Etotal=12(targetoutput)2 E_{total} = \sum \frac{1}{2}(target - output)^2

但是有兩個輸出,所以分別計算 $ o1 $ 和 $ o2 $ 的誤差,總誤差爲兩者之和:

Eo1=12(targeto1outo1)2=12(0.010.75136507)2=0.274811083E_{o1} = \frac{1}{2}(target_{o1} - out_{o1})^2 = \frac{1}{2}(0.01 - 0.75136507)^2 = 0.274811083

Eo2=0.023560026E_{o2} = 0.023560026

Etotal=Eo1+Eo2=0.274811083+0.023560026=0.298371109E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109

  1. 隱含層 --> 輸出層的權值更新:

以權重參數 $ w5 $ 爲例,如果我們想知道 $ w5 $ 對整體誤差產生了多少影響,可以用整體誤差對 $ w5 $ 求偏導求出:(鏈式法則)

Etotalw5=Etotalouto1outo1neto1neto1w5 \frac{\partial E_{total}}{\partial w5} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w5}

下面的圖可以更直觀的看清楚誤差是怎樣反向傳播的:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3tt1ZOoy-1575791287835)(./img/ch3/3-25.png)]

3.2.6 神經網絡更“深”有什麼意義?

前提:在一定範圍內。

  • 在神經元數量相同的情況下,深層網絡結構具有更大容量,分層組合帶來的是指數級的表達空間,能夠組合成更多不同類型的子結構,這樣可以更容易地學習和表示各種特徵。
  • 隱藏層增加則意味着由激活函數帶來的非線性變換的嵌套層數更多,就能構造更復雜的映射關係。

3.3 超參數

3.3.1 什麼是超參數?

超參數:比如算法中的 learning rate (學習率)、iterations (梯度下降法循環的數量)、(隱藏層數目)、(隱藏層單元數目)、choice of activation function(激活函數的選擇)都需要根據實際情況來設置,這些數字實際上控制了最後的參數和的值,所以它們被稱作超參數。

3.3.2 如何尋找超參數的最優值?

在使用機器學習算法時,總有一些難搞的超參數。例如權重衰減大小,高斯核寬度等等。算法不會設置這些參數,而是需要你去設置它們的值。設置的值對結果產生較大影響。常見設置超參數的做法有:

  1. 猜測和檢查:根據經驗或直覺,選擇參數,一直迭代。
  2. 網格搜索:讓計算機嘗試在一定範圍內均勻分佈的一組值。
  3. 隨機搜索:讓計算機隨機挑選一組值。
  4. 貝葉斯優化:使用貝葉斯優化超參數,會遇到貝葉斯優化算法本身就需要很多的參數的困難。
  5. 在良好初始猜測的前提下進行局部優化:這就是 MITIE 的方法,它使用 BOBYQA 算法,並有一個精心選擇的起始點。由於 BOBYQA 只尋找最近的局部最優解,所以這個方法是否成功很大程度上取決於是否有一個好的起點。在 MITIE 的情況下,我們知道一個好的起點,但這不是一個普遍的解決方案,因爲通常你不會知道好的起點在哪裏。從好的方面來說,這種方法非常適合尋找局部最優解。稍後我會再討論這一點。
  6. 最新提出的 LIPO 的全局優化方法。這個方法沒有參數,而且經驗證比隨機搜索方法好。

3.3.3 超參數搜索一般過程?

超參數搜索一般過程:

  1. 將數據集劃分成訓練集、驗證集及測試集。
  2. 在訓練集上根據模型的性能指標對模型參數進行優化。
  3. 在驗證集上根據模型的性能指標對模型的超參數進行搜索。
  4. 步驟 2 和步驟 3 交替迭代,最終確定模型的參數和超參數,在測試集中驗證評價模型的優劣。

其中,搜索過程需要搜索算法,一般有:網格搜索、隨機搜過、啓發式智能搜索、貝葉斯搜索。

3.4 激活函數

3.4.1 爲什麼需要非線性激活函數?

爲什麼需要激活函數?

  1. 激活函數對模型學習、理解非常複雜和非線性的函數具有重要作用。
  2. 激活函數可以引入非線性因素。如果不使用激活函數,則輸出信號僅是一個簡單的線性函數。線性函數一個一級多項式,線性方程的複雜度有限,從數據中學習複雜函數映射的能力很小。沒有激活函數,神經網絡將無法學習和模擬其他複雜類型的數據,例如圖像、視頻、音頻、語音等。
  3. 激活函數可以把當前特徵空間通過一定的線性映射轉換到另一個空間,讓數據能夠更好的被分類。

爲什麼激活函數需要非線性函數?

  1. 假若網絡中全部是線性部件,那麼線性的組合還是線性,與單獨一個線性分類器無異。這樣就做不到用非線性來逼近任意函數。
  2. 使用非線性激活函數 ,以便使網絡更加強大,增加它的能力,使它可以學習複雜的事物,複雜的表單數據,以及表示輸入輸出之間非線性的複雜的任意函數映射。使用非線性激活函數,能夠從輸入輸出之間生成非線性映射。

3.4.2 常見的激活函數及圖像

  1. sigmoid 激活函數

    函數的定義爲:$ f(x) = \frac{1}{1 + e^{-x}} $,其值域爲 $ (0,1) $。

    函數圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-foAJChci-1575791287835)(./img/ch3/3-26.png)]

  1. tanh激活函數

    函數的定義爲:$ f(x) = tanh(x) = \frac{e^x - e{-x}}{ex + e^{-x}} $,值域爲 $ (-1,1) $。

    函數圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xl3rKt1T-1575791287836)(./img/ch3/3-27.png)]

  1. Relu激活函數

    函數的定義爲:$ f(x) = max(0, x) $ ,值域爲 $ [0,+∞) $;

    函數圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4Y3TNGIT-1575791287837)(./img/ch3/3-28.png)]

  1. Leak Relu 激活函數

    函數定義爲: $ f(x) = \left{
    \begin{aligned}
    ax, \quad x<0 \
    x, \quad x>0
    \end{aligned}
    \right. $,值域爲 $ (-∞,+∞) $。

    圖像如下($ a = 0.5 $):

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-J23TWJMw-1575791287837)(./img/ch3/3-29.png)]

  1. SoftPlus 激活函數

    函數的定義爲:$ f(x) = ln( 1 + e^x) $,值域爲 $ (0,+∞) $。

    函數圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3kGxnSV3-1575791287838)(./img/ch3/3-30.png)]

  1. softmax 函數

    函數定義爲: $ \sigma(z)_j = \frac{e{z_j}}{\sum_{k=1}K e^{z_k}} $。

    Softmax 多用於多分類神經網絡輸出。

3.4.3 常見激活函數的導數計算?

對常見激活函數,導數計算如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Kq57cvWk-1575791287839)(./img/ch3/3-31.png)]

3.4.4 激活函數有哪些性質?

  1. 非線性: 當激活函數是線性的,一個兩層的神經網絡就可以基本上逼近所有的函數。但如果激活函數是恆等激活函數的時候,即 $ f(x)=x $,就不滿足這個性質,而且如果 MLP 使用的是恆等激活函數,那麼其實整個網絡跟單層神經網絡是等價的;
  2. 可微性: 當優化方法是基於梯度的時候,就體現了該性質;
  3. 單調性: 當激活函數是單調的時候,單層網絡能夠保證是凸函數;
  4. $ f(x)≈x $: 當激活函數滿足這個性質的時候,如果參數的初始化是隨機的較小值,那麼神經網絡的訓練將會很高效;如果不滿足這個性質,那麼就需要詳細地去設置初始值;
  5. 輸出值的範圍: 當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,因爲特徵的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的 Learning Rate。

3.4.5 如何選擇激活函數?

選擇一個適合的激活函數並不容易,需要考慮很多因素,通常的做法是,如果不確定哪一個激活函數效果更好,可以把它們都試試,然後在驗證集或者測試集上進行評價。然後看哪一種表現的更好,就去使用它。

以下是常見的選擇情況:

  1. 如果輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,然後其它的所有單元都選擇 Relu 函數。
  2. 如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用 Relu 激活函數。有時,也會使用 tanh 激活函數,但 Relu 的一個優點是:當是負值的時候,導數等於 0。
  3. sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。
  4. tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。
  5. ReLu 激活函數:最常用的默認函數,如果不確定用哪個激活函數,就使用 ReLu 或者 Leaky ReLu,再去嘗試其他的激活函數。
  6. 如果遇到了一些死的神經元,我們可以使用 Leaky ReLU 函數。

3.4.6 使用 ReLu 激活函數的優點?

  1. 在區間變動很大的情況下,ReLu 激活函數的導數或者激活函數的斜率都會遠大於 0,在程序實現就是一個 if-else 語句,而 sigmoid 函數需要進行浮點四則運算,在實踐中,使用 ReLu 激活函數神經網絡通常會比使用 sigmoid 或者 tanh 激活函數學習的更快。
  2. sigmoid 和 tanh 函數的導數在正負飽和區的梯度都會接近於 0,這會造成梯度彌散,而 Relu 和Leaky ReLu 函數大於 0 部分都爲常數,不會產生梯度彌散現象。
  3. 需注意,Relu 進入負半區的時候,梯度爲 0,神經元此時不會訓練,產生所謂的稀疏性,而 Leaky ReLu 不會產生這個問題。

3.4.7什麼時候可以用線性激活函數?

  1. 輸出層,大多使用線性激活函數。
  2. 在隱含層可能會使用一些線性激活函數。
  3. 一般用到的線性激活函數很少。

3.4.8 怎樣理解 Relu(< 0 時)是非線性激活函數?

Relu 激活函數圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-F31ErOGo-1575791287840)(./img/ch3/3-32.png)]

根據圖像可看出具有如下特點:

  1. 單側抑制;
  2. 相對寬闊的興奮邊界;
  3. 稀疏激活性;

ReLU 函數從圖像上看,是一個分段線性函數,把所有的負值都變爲 0,而正值不變,這樣就成爲單側抑制。

因爲有了這單側抑制,才使得神經網絡中的神經元也具有了稀疏激活性。

稀疏激活性:從信號方面來看,即神經元同時只對輸入信號的少部分選擇性響應,大量信號被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特徵。當 $ x<0 $ 時,ReLU 硬飽和,而當 $ x>0 $ 時,則不存在飽和問題。ReLU 能夠在 $ x>0 $ 時保持梯度不衰減,從而緩解梯度消失問題。

3.4.9 Softmax 函數如何應用於多分類?

​ softmax 用於多分類過程中,它將多個神經元的輸出,映射到 $ (0,1) $ 區間內,可以看成概率來理解,從而來進行多分類!

​ 假設我們有一個數組,$ V_i $ 表示 $ V $ 中的第 $ i $ 個元素,那麼這個元素的 softmax 值就是

Si=eVijeVj S_i = \frac{e^{V_i}}{\sum_j e^{V_j}}

​ 從下圖看,神經網絡中包含了輸入層,然後通過兩個特徵層處理,最後通過 softmax 分析器就能得到不同條件下的概率,這裏需要分成三個類別,最終會得到 $ y=0, y=1, y=2 $ 的概率值。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RJ8YXhRB-1575791287841)(./img/ch3/3-33.png)]

繼續看下面的圖,三個輸入通過 softmax 後得到一個數組 $ [0.05 , 0.10 , 0.85] $,這就是 soft 的功能。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MNoaZ7xs-1575791287841)(./img/ch3/3-34.png)]

更形象的映射過程如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hHc9oRie-1575791287842)(./img/ch3/3-35.jpg)]

​ softmax 直白來說就是將原來輸出是 $ 3,1,-3 $ 通過 softmax 函數一作用,就映射成爲 $ (0,1) $ 的值,而這些值的累和爲 $ 1 $(滿足概率的性質),那麼我們就可以將它理解成概率,在最後選取輸出結點的時候,我們就可以選取概率最大(也就是值對應最大的)結點,作爲我們的預測目標!

3.4.10 交叉熵代價函數定義及其求導推導。(貢獻者:黃欽建-華南理工大學)

​ 神經元的輸出就是 a = σ(z),其中z=wjij+bz=\sum w_{j}i_{j}+b是輸⼊的帶權和。

C=1n[ylna+(1y)ln(1a)]C=-\frac{1}{n}\sum[ylna+(1-y)ln(1-a)]

​ 其中 n 是訓練數據的總數,求和是在所有的訓練輸⼊ x 上進⾏的, y 是對應的⽬標輸出。

​ 表達式是否解決學習緩慢的問題並不明顯。實際上,甚⾄將這個定義看做是代價函數也不是顯⽽易⻅的!在解決學習緩慢前,我們來看看交叉熵爲何能夠解釋成⼀個代價函數。

​ 將交叉熵看做是代價函數有兩點原因。

​ 第⼀,它是⾮負的, C > 0。可以看出:式子中的求和中的所有獨⽴的項都是負數的,因爲對數函數的定義域是 (0,1),並且求和前⾯有⼀個負號,所以結果是非負。

​ 第⼆,如果對於所有的訓練輸⼊ x,神經元實際的輸出接近⽬標值,那麼交叉熵將接近 0。

​ 假設在這個例⼦中, y = 0 ⽽ a ≈ 0。這是我們想到得到的結果。我們看到公式中第⼀個項就消去了,因爲 y = 0,⽽第⼆項實際上就是 − ln(1 − a) ≈ 0。反之, y = 1 ⽽ a ≈ 1。所以在實際輸出和⽬標輸出之間的差距越⼩,最終的交叉熵的值就越低了。(這裏假設輸出結果不是0,就是1,實際分類也是這樣的)

​ 綜上所述,交叉熵是⾮負的,在神經元達到很好的正確率的時候會接近 0。這些其實就是我們想要的代價函數的特性。其實這些特性也是⼆次代價函數具備的。所以,交叉熵就是很好的選擇了。但是交叉熵代價函數有⼀個⽐⼆次代價函數更好的特性就是它避免了學習速度下降的問題。爲了弄清楚這個情況,我們來算算交叉熵函數關於權重的偏導數。我們將a=ς(z)a={\varsigma}(z)代⼊到 公式中應⽤兩次鏈式法則,得到:

KaTeX parse error: No such environment: eqnarray at position 7: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲\frac{\partial …

​ 根據ς(z)=11+ez\varsigma(z)=\frac{1}{1+e^{-z}} 的定義,和⼀些運算,我們可以得到 ς(z)=ς(z)(1ς(z)){\varsigma}'(z)=\varsigma(z)(1-\varsigma(z))。化簡後可得:

Cwj=1nxj(ς(z)y)\frac{\partial C}{\partial w_{j}}=\frac{1}{n}\sum x_{j}({\varsigma}(z)-y)

​ 這是⼀個優美的公式。它告訴我們權重學習的速度受到ς(z)y\varsigma(z)-y,也就是輸出中的誤差的控制。更⼤的誤差,更快的學習速度。這是我們直覺上期待的結果。特別地,這個代價函數還避免了像在⼆次代價函數中類似⽅程中ς(z){\varsigma}'(z)導致的學習緩慢。當我們使⽤交叉熵的時候,ς(z){\varsigma}'(z)被約掉了,所以我們不再需要關⼼它是不是變得很⼩。這種約除就是交叉熵帶來的特效。實際上,這也並不是⾮常奇蹟的事情。我們在後⾯可以看到,交叉熵其實只是滿⾜這種特性的⼀種選擇罷了。

​ 根據類似的⽅法,我們可以計算出關於偏置的偏導數。我這⾥不再給出詳細的過程,你可以輕易驗證得到:

Cb=1n(ς(z)y)\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)

​ 再⼀次, 這避免了⼆次代價函數中類似ς(z){\varsigma}'(z)項導致的學習緩慢。

3.4.11 爲什麼Tanh收斂速度比Sigmoid快?(貢獻者:黃欽建-華南理工大學)

tanh,(x)=1tanh(x)2(0,1)tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)

s,(x)=s(x)(1s(x))(0,14]s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]

由上面兩個公式可知tanh(x)梯度消失的問題比sigmoid輕,所以Tanh收斂速度比Sigmoid快。

3.5 Batch_Size

3.5.1 爲什麼需要 Batch_Size?

Batch的選擇,首先決定的是下降的方向。

如果數據集比較小,可採用全數據集的形式,好處是:

  1. 由全數據集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。
  2. 由於不同權重的梯度值差別巨大,因此選取一個全局的學習率很困難。 Full Batch Learning 可以使用 Rprop 只基於梯度符號並且針對性單獨更新各權值。

對於更大的數據集,假如採用全數據集的形式,壞處是:

  1. 隨着數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
  2. 以 Rprop 的方式迭代,會由於各個 Batch 之間的採樣差異性,各次梯度修正值相互抵消,無法修正。這纔有了後來 RMSProp 的妥協方案。

3.5.2 Batch_Size 值的選擇

假如每次只訓練一個樣本,即 Batch_Size = 1。線性神經元在均方誤差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網絡,在局部依然近似是拋物面。此時,每次修正方向以各自樣本的梯度方向修正,橫衝直撞各自爲政,難以達到收斂。

既然 Batch_Size 爲全數據集或者Batch_Size = 1都有各自缺點,可不可以選擇一個適中的Batch_Size值呢?

此時,可採用批梯度下降法(Mini-batches Learning)。因爲如果數據集足夠充分,那麼用一半(甚至少得多)的數據訓練算出來的梯度與用全部數據訓練出來的梯度是幾乎一樣的。

3.5.3 在合理範圍內,增大Batch_Size有何好處?

  1. 內存利用率提高了,大矩陣乘法的並行化效率提高。
  2. 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
  3. 在一定範圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震盪越小。

3.5.4 盲目增大 Batch_Size 有何壞處?

  1. 內存利用率提高了,但是內存容量可能撐不住了。
  2. 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
  3. Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

3.5.5 調節 Batch_Size 對訓練效果影響到底如何?

  1. Batch_Size 太小,模型表現效果極其糟糕(error飆升)。
  2. 隨着 Batch_Size 增大,處理相同數據量的速度越快。
  3. 隨着 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
  4. 由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
  5. 由於最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。

3.5.6 受限於客觀條件無法給足夠的Batch Size怎麼辦?

在極小的情況下(低於十),建議使用Group Norm

3.6 歸一化

3.6.1 歸一化含義?

歸一化的具體作用是歸納統一樣本的統計分佈性。歸一化在 $ 0-1$ 之間是統計的概率分佈,歸一化在$ -1–+1$ 之間是統計的座標分佈。歸一化有同一、統一和合一的意思。無論是爲了建模還是爲了計算,首先基本度量單位要同一,神經網絡是以樣本在事件中的統計分別機率來進行訓練(概率計算)和預測的,且 sigmoid 函數的取值是 0 到 1 之間的,網絡最後一個節點的輸出也是如此,所以經常要對樣本的輸出歸一化處理。歸一化是統一在 $ 0-1 $ 之間的統計概率分佈,當所有樣本的輸入信號都爲正值時,與第一隱含層神經元相連的權值只能同時增加或減小,從而導致學習速度很慢。另外在數據中常存在奇異樣本數據,奇異樣本數據存在所引起的網絡訓練時間增加,並可能引起網絡無法收斂。爲了避免出現這種情況及後面數據處理的方便,加快網絡學習速度,可以對輸入信號進行歸一化,使得所有樣本的輸入信號其均值接近於 0 或與其均方差相比很小。

3.6.2 爲什麼要歸一化?

  1. 爲了後面數據處理的方便,歸一化的確可以避免一些不必要的數值問題。
  2. 爲了程序運行時收斂加快。 下面圖解。
  3. 同一量綱。樣本數據的評價標準不一樣,需要對其量綱化,統一評價標準。這算是應用層面的需求。
  4. 避免神經元飽和。啥意思?就是當神經元的激活在接近 0 或者 1 時會飽和,在這些區域,梯度幾乎爲 0,這樣,在反向傳播過程中,局部梯度就會接近 0,這會有效地“殺死”梯度。
  5. 保證輸出數據中數值小的不被吞食。

3.6.3 爲什麼歸一化能提高求解最優解速度?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VkL8IhAb-1575791287843)(./img/ch3/3-36.png)]

上圖是代表數據是否均一化的最優解尋解過程(圓圈可以理解爲等高線)。左圖表示未經歸一化操作的尋解過程,右圖表示經過歸一化後的尋解過程。

當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;而右圖對兩個原始特徵進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。

因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。

3.6.4 3D 圖解未歸一化

例子:

假設 $ w1 $ 的範圍在 $ [-10, 10] $,而 $ w2 $ 的範圍在 $ [-100, 100] $,梯度每次都前進 1 單位,那麼在 $ w1 $ 方向上每次相當於前進了 $ 1/20 $,而在 $ w2 $ 上只相當於 $ 1/200 $!某種意義上來說,在 $ w2 $ 上前進的步長更小一些,而 $ w1 $ 在搜索過程中會比 $ w2 $ “走”得更快。

這樣會導致,在搜索過程中更偏向於 $ w1 $ 的方向。走出了“L”形狀,或者成爲“之”字形。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OjwdXMLA-1575791287844)(./img/ch3/3-37.png)]

3.6.5 歸一化有哪些類型?

  1. 線性歸一化

x=xmin(x)max(x)min(x) x^{\prime} = \frac{x-min(x)}{max(x) - min(x)}

適用範圍:比較適用在數值比較集中的情況。

缺點:如果 max 和 min 不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。

  1. 標準差標準化

x=xμσ x^{\prime} = \frac{x-\mu}{\sigma}

含義:經過處理的數據符合標準正態分佈,即均值爲 0,標準差爲 1 其中 $ \mu $ 爲所有樣本數據的均值,$ \sigma $ 爲所有樣本數據的標準差。

  1. 非線性歸一化

適用範圍:經常用在數據分化比較大的場景,有些數值很大,有些很小。通過一些數學函數,將原始值進行映射。該方法包括 $ log $、指數,正切等。

3.6.6 局部響應歸一化作用

LRN 是一種提高深度學習準確度的技術方法。LRN 一般是在激活、池化函數後的一種方法。

在 ALexNet 中,提出了 LRN 層,對局部神經元的活動創建競爭機制,使其中響應比較大對值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

3.6.7理解局部響應歸一化公式

答案來源:深度學習的局部響應歸一化LRN(Local Response Normalization)理解

局部響應歸一化原理是仿造生物學上活躍的神經元對相鄰神經元的抑制現象(側抑制),根據論文其公式如下:

bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)β b_{x,y}^i = a_{x,y}^i / (k + \alpha \sum_{j=max(0, i-n/2)}^{min(N-1, i+n/2)}(a_{x,y}^j)^2 )^\beta

其中,

  1. $ a $:表示卷積層(包括卷積操作和池化操作)後的輸出結果,是一個四維數組[batch,height,width,channel]。
  • batch:批次數(每一批爲一張圖片)。
  • height:圖片高度。
  • width:圖片寬度。
  • channel:通道數。可以理解成一批圖片中的某一個圖片經過卷積操作後輸出的神經元個數,或理解爲處理後的圖片深度。
  1. $ a_{x,y}^i $ 表示在這個輸出結構中的一個位置 $ [a,b,c,d] $,可以理解成在某一張圖中的某一個通道下的某個高度和某個寬度位置的點,即第 $ a $ 張圖的第 $ d $ 個通道下的高度爲b寬度爲c的點。

  2. $ N $:論文公式中的 $ N $ 表示通道數 (channel)。

  3. $ a n/2 $, $ k $ 分別表示函數中的 input,depth_radius,bias。參數 $ k, n, \alpha, \beta $ 都是超參數,一般設置 $ k=2, n=5, \alpha=1*e-4, \beta=0.75 $

  4. $ \sum \sum $ 疊加的方向是沿着通道方向的,即每個點值的平方和是沿着 $ a $ 中的第 3 維 channel 方向的,也就是一個點同方向的前面 $ n/2 $ 個通道(最小爲第 $ 0 $ 個通道)和後 $ n/2 $ 個通道(最大爲第 $ d-1 $ 個通道)的點的平方和(共 $ n+1 $ 個點)。而函數的英文註解中也說明了把 input 當成是 $ d $ 個 3 維的矩陣,說白了就是把 input 的通道數當作 3 維矩陣的個數,疊加的方向也是在通道方向。

簡單的示意圖如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vAFF4OYU-1575791287845)(./img/ch3/3-38.png)]

3.6.8 什麼是批歸一化(Batch Normalization)

以前在神經網絡訓練中,只是對輸入層數據進行歸一化處理,卻沒有在中間層進行歸一化處理。要知道,雖然我們對輸入數據進行了歸一化處理,但是輸入數據經過 $ \sigma(WX+b) $ 這樣的矩陣乘法以及非線性運算之後,其數據分佈很可能被改變,而隨着深度網絡的多層運算之後,數據分佈的變化將越來越大。如果我們能在網絡的中間也進行歸一化處理,是否對網絡的訓練起到改進作用呢?答案是肯定的。

這種在神經網絡中間層也進行歸一化處理,使訓練效果更好的方法,就是批歸一化Batch Normalization(BN)。

3.6.9 批歸一化(BN)算法的優點

下面我們來說一下BN算法的優點:

  1. 減少了人爲選擇參數。在某些情況下可以取消 dropout 和 L2 正則項參數,或者採取更小的 L2 正則項約束參數;
  2. 減少了對學習率的要求。現在我們可以使用初始很大的學習率或者選擇了較小的學習率,算法也能夠快速訓練收斂;
  3. 可以不再使用局部響應歸一化。BN 本身就是歸一化網絡(局部響應歸一化在 AlexNet 網絡中存在)
  4. 破壞原來的數據分佈,一定程度上緩解過擬合(防止每批訓練中某一個樣本經常被挑選到,文獻說這個可以提高 1% 的精度)。
  5. 減少梯度消失,加快收斂速度,提高訓練精度。

3.6.10 批歸一化(BN)算法流程

下面給出 BN 算法在訓練時的過程

輸入:上一層輸出結果 $ X = {x_1, x_2, …, x_m} $,學習參數 $ \gamma, \beta $

算法流程:

  1. 計算上一層輸出數據的均值

μβ=1mi=1m(xi) \mu_{\beta} = \frac{1}{m} \sum_{i=1}^m(x_i)

其中,$ m $ 是此次訓練樣本 batch 的大小。

  1. 計算上一層輸出數據的標準差

σβ2=1mi=1m(xiμβ)2 \sigma_{\beta}^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_{\beta})^2

  1. 歸一化處理,得到

x^i=xi+μβσβ2+ϵ \hat x_i = \frac{x_i + \mu_{\beta}}{\sqrt{\sigma_{\beta}^2} + \epsilon}

其中 $ \epsilon $ 是爲了避免分母爲 0 而加進去的接近於 0 的很小值

  1. 重構,對經過上面歸一化處理得到的數據進行重構,得到

yi=γx^i+β y_i = \gamma \hat x_i + \beta

其中,$ \gamma, \beta $ 爲可學習參數。

注:上述是 BN 訓練時的過程,但是當在投入使用時,往往只是輸入一個樣本,沒有所謂的均值 $ \mu_{\beta} $ 和標準差 $ \sigma_{\beta}^2 $。此時,均值 $ \mu_{\beta} $ 是計算所有 batch $ \mu_{\beta} $ 值的平均值得到,標準差 $ \sigma_{\beta}^2 $ 採用每個batch $ \sigma_{\beta}^2 $ 的無偏估計得到。

3.6.11 批歸一化和羣組歸一化

批量歸一化(Batch Normalization,以下簡稱 BN)是深度學習發展中的一項里程碑式技術,可讓各種網絡並行訓練。但是,批量維度進行歸一化會帶來一些問題——批量統計估算不準確導致批量變小時,BN 的誤差會迅速增加。在訓練大型網絡和將特徵轉移到計算機視覺任務中(包括檢測、分割和視頻),內存消耗限制了只能使用小批量的 BN。

何愷明團隊在羣組歸一化(Group Normalization) 中提出羣組歸一化 Group Normalization (簡稱 GN) 作爲 BN 的替代方案。

GN 將通道分成組,並在每組內計算歸一化的均值和方差。GN 的計算與批量大小無關,並且其準確度在各種批量大小下都很穩定。在 ImageNet 上訓練的 ResNet-50上,GN 使用批量大小爲 2 時的錯誤率比 BN 的錯誤率低 10.6% ;當使用典型的批量時,GN 與 BN 相當,並且優於其他標歸一化變體。而且,GN 可以自然地從預訓練遷移到微調。在進行 COCO 中的目標檢測和分割以及 Kinetics 中的視頻分類比賽中,GN 可以勝過其競爭對手,表明 GN 可以在各種任務中有效地取代強大的 BN。

3.6.12 Weight Normalization和Batch Normalization

答案來源:Weight Normalization 相比batch Normalization 有什麼優點呢?

Weight Normalization 和 Batch Normalization 都屬於參數重寫(Reparameterization)的方法,只是採用的方式不同,Weight Normalization 是對網絡權值$ W $ 進行 normalization,因此也稱爲 Weight Normalization;Batch Normalization 是對網絡某一層輸入數據進行 normalization。Weight Normalization相比Batch Normalization有以下三點優勢:

  1. Weight Normalization 通過重寫深度學習網絡的權重W的方式來加速深度學習網絡參數收斂,沒有引入 minbatch 的依賴,適用於 RNN(LSTM)網絡(Batch Normalization 不能直接用於RNN,進行 normalization 操作,原因在於:1) RNN 處理的 Sequence 是變長的;2) RNN 是基於 time step 計算,如果直接使用 Batch Normalization 處理,需要保存每個 time step 下,mini btach 的均值和方差,效率低且佔內存)。

  2. Batch Normalization 基於一個 mini batch 的數據計算均值和方差,而不是基於整個 Training set 來做,相當於進行梯度計算式引入噪聲。因此,Batch Normalization 不適用於對噪聲敏感的強化學習、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization 對通過標量 $ g $ 和向量 $ v $ 對權重 $ W $ 進行重寫,重寫向量 $ v $ 是固定的,因此,基於 Weight Normalization 的 Normalization 可以看做比 Batch Normalization 引入更少的噪聲。

  3. 不需要額外的存儲空間來保存 mini batch 的均值和方差,同時實現 Weight Normalization 時,對深度學習網絡進行正向信號傳播和反向梯度計算帶來的額外計算開銷也很小。因此,要比採用 Batch Normalization 進行 normalization 操作時,速度快。 但是 Weight Normalization 不具備 Batch Normalization 把網絡每一層的輸出 Y 固定在一個變化範圍的作用。因此,採用 Weight Normalization 進行 Normalization 時需要特別注意參數初始值的選擇。

3.6.13 Batch Normalization在什麼時候用比較合適?(貢獻者:黃欽建-華南理工大學)

在CNN中,BN應作用在非線性映射前。在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等無法訓練的狀況時可以嘗試BN來解決。另外,在一般使用情況下也可以加入BN來加快訓練速度,提高模型精度。

BN比較適用的場景是:每個mini-batch比較大,數據分佈比較接近。在進行訓練之前,要做好充分的shuffle,否則效果會差很多。另外,由於BN需要在運行過程中統計每個mini-batch的一階統計量和二階統計量,因此不適用於動態的網絡結構和RNN網絡。

3.7 預訓練與微調(fine tuning)

3.7.1 爲什麼無監督預訓練可以幫助深度學習?

答案來源:爲什麼無監督的預訓練可以幫助深度學習

深度網絡存在問題:

  1. 網絡越深,需要的訓練樣本數越多。若用監督則需大量標註樣本,不然小規模樣本容易造成過擬合。深層網絡特徵比較多,會出現的多特徵問題主要有多樣本問題、規則化問題、特徵選擇問題。

  2. 多層神經網絡參數優化是個高階非凸優化問題,經常得到收斂較差的局部解;

  3. 梯度擴散問題,BP算法計算出的梯度隨着深度向前而顯著下降,導致前面網絡參數貢獻很小,更新速度慢。

解決方法:

逐層貪婪訓練,無監督預訓練(unsupervised pre-training)即訓練網絡的第一個隱藏層,再訓練第二個…最後用這些訓練好的網絡參數值作爲整體網絡參數的初始值。

經過預訓練最終能得到比較好的局部最優解。

3.7.2 什麼是模型微調fine tuning

用別人的參數、修改後的網絡和自己的數據進行訓練,使得參數適應自己的數據,這樣一個過程,通常稱之爲微調(fine tuning).

模型的微調舉例說明:

我們知道,CNN 在圖像識別這一領域取得了巨大的進步。如果想將 CNN 應用到我們自己的數據集上,這時通常就會面臨一個問題:通常我們的 dataset 都不會特別大,一般不會超過 1 萬張,甚至更少,每一類圖片只有幾十或者十幾張。這時候,直接應用這些數據訓練一個網絡的想法就不可行了,因爲深度學習成功的一個關鍵性因素就是大量帶標籤數據組成的訓練集。如果只利用手頭上這點數據,即使我們利用非常好的網絡結構,也達不到很高的 performance。這時候,fine-tuning 的思想就可以很好解決我們的問題:我們通過對 ImageNet 上訓練出來的模型(如CaffeNet,VGGNet,ResNet) 進行微調,然後應用到我們自己的數據集上。

3.7.3 微調時候網絡參數是否更新?

會更新。

  1. finetune 的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候。
  2. 直接訓練是按照網絡定義指定的方式初始化。
  3. finetune是用你已經有的參數文件來初始化。

3.7.4 fine-tuning 模型的三種狀態

  1. 狀態一:只預測,不訓練。
    特點:相對快、簡單,針對那些已經訓練好,現在要實際對未知數據進行標註的項目,非常高效;

  2. 狀態二:訓練,但只訓練最後分類層。
    特點:fine-tuning的模型最終的分類以及符合要求,現在只是在他們的基礎上進行類別降維。

  3. 狀態三:完全訓練,分類層+之前卷積層都訓練
    特點:跟狀態二的差異很小,當然狀態三比較耗時和需要訓練GPU資源,不過非常適合fine-tuning到自己想要的模型裏面,預測精度相比狀態二也提高不少。

3.8 權重偏差初始化

3.8.1 全都初始化爲 0

偏差初始化陷阱: 都初始化爲 0。

產生陷阱原因:因爲並不知道在訓練神經網絡中每一個權重最後的值,但是如果進行了恰當的數據歸一化後,我們可以有理由認爲有一半的權重是正的,另一半是負的。令所有權重都初始化爲 0,如果神經網絡計算出來的輸出值是一樣的,神經網絡在進行反向傳播算法計算出來的梯度值也一樣,並且參數更新值也一樣。更一般地說,如果權重初始化爲同一個值,網絡就是對稱的。

形象化理解:在神經網絡中考慮梯度下降的時候,設想你在爬山,但身處直線形的山谷中,兩邊是對稱的山峯。由於對稱性,你所在之處的梯度只能沿着山谷的方向,不會指向山峯;你走了一步之後,情況依然不變。結果就是你只能收斂到山谷中的一個極大值,而走不到山峯上去。

3.8.2 全都初始化爲同樣的值

偏差初始化陷阱: 都初始化爲一樣的值。
以一個三層網絡爲例:
首先看下結構

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VI8rVq4M-1575791287846)(./img/ch3/3-39.jpg)]

它的表達式爲:

$$
a_1^{(2)} = f(W_{11}^{(1)} x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)})

a_2^{(2)} = f(W_{21}^{(1)} x_1 + W_{22}^{(1)} x_2 + W_{23}^{(1)} x_3 + b_2^{(1)})

a_3^{(2)} = f(W_{31}^{(1)} x_1 + W_{32}^{(1)} x_2 + W_{33}^{(1)} x_3 + b_3^{(1)})

h_{W,b}(x) = a_1^{(3)} = f(W_{11}^{(2)} a_1^{(2)} + W_{12}^{(2)} a_2^{(2)} + W_{13}^{(2)} a_3^{(2)} + b_1^{(2)})
$$

如果每個權重都一樣,那麼在多層網絡中,從第二層開始,每一層的輸入值都是相同的了也就是$ a1=a2=a3=… $,既然都一樣,就相當於一個輸入了,爲啥呢??

如果是反向傳遞算法(如果這裏不明白請看上面的連接),其中的偏置項和權重項的迭代的偏導數計算公式如下

$$
\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b;x,y) = a_j^{(l)} \delta_i^{(l+1)}

\frac{\partial}{\partial b_{i}^{(l)}} J(W,b;x,y) = \delta_i^{(l+1)}
$$

$ \delta $ 的計算公式

δi(l)=(j=1st+1Wji(l)δj(l+1))f(zi(l)) \delta_i^{(l)} = (\sum_{j=1}^{s_{t+1}} W_{ji}^{(l)} \delta_j^{(l+1)} ) f^{\prime}(z_i^{(l)})

如果用的是 sigmoid 函數

f(zi(l))=ai(l)(1ai(l)) f^{\prime}(z_i^{(l)}) = a_i^{(l)}(1-a_i^{(l)})

把後兩個公式代入,可以看出所得到的梯度下降法的偏導相同,不停的迭代,不停的相同,不停的迭代,不停的相同…,最後就得到了相同的值(權重和截距)。

3.8.3 初始化爲小的隨機數

將權重初始化爲很小的數字是一個普遍的打破網絡對稱性的解決辦法。這個想法是,神經元在一開始都是隨機的、獨一無二的,所以它們會計算出不同的更新,並將自己整合到整個網絡的各個部分。一個權重矩陣的實現可能看起來像 $ W=0.01∗np.random.randn(D,H) $,其中 randn 是從均值爲 0 的單位標準高斯分佈進行取樣。通過這個公式(函數),每個神經元的權重向量初始化爲一個從多維高斯分佈取樣的隨機向量,所以神經元在輸入空間中指向隨機的方向(so the neurons point in random direction in the input space). 應該是指輸入空間對於隨機方向有影響)。其實也可以從均勻分佈中來隨機選取小數,但是在實際操作中看起來似乎對最後的表現並沒有太大的影響。

備註:警告:並不是數字越小就會表現的越好。比如,如果一個神經網絡層的權重非常小,那麼在反向傳播算法就會計算出很小的梯度(因爲梯度 gradient 是與權重成正比的)。在網絡不斷的反向傳播過程中將極大地減少“梯度信號”,並可能成爲深層網絡的一個需要注意的問題。

3.8.4 用 $ 1/\sqrt n $ 校準方差

上述建議的一個問題是,隨機初始化神經元的輸出的分佈有一個隨輸入量增加而變化的方差。結果證明,我們可以通過將其權重向量按其輸入的平方根(即輸入的數量)進行縮放,從而將每個神經元的輸出的方差標準化到 1。也就是說推薦的啓發式方法 (heuristic) 是將每個神經元的權重向量按下面的方法進行初始化: $ w=np.random.randn(n)/\sqrt n $,其中 n 表示輸入的數量。這保證了網絡中所有的神經元最初的輸出分佈大致相同,並在經驗上提高了收斂速度。

3.8.5 稀疏初始化(Sparse Initialazation)

另一種解決未校準方差問題的方法是把所有的權重矩陣都設爲零,但是爲了打破對稱性,每個神經元都是隨機連接地(從如上面所介紹的一個小的高斯分佈中抽取權重)到它下面的一個固定數量的神經元。一個典型的神經元連接的數目可能是小到 10 個。

3.8.6 初始化偏差

將偏差初始化爲零是可能的,也是很常見的,因爲非對稱性破壞是由權重的小隨機數導致的。因爲 ReLU 具有非線性特點,所以有些人喜歡使用將所有的偏差設定爲小的常數值如 0.01,因爲這樣可以確保所有的 ReLU 單元在最開始就激活觸發(fire)並因此能夠獲得和傳播一些梯度值。然而,這是否能夠提供持續的改善還不太清楚(實際上一些結果表明這樣做反而使得性能更加糟糕),所以更通常的做法是簡單地將偏差初始化爲 0.

3.9 Softmax

3.9.1 Softmax 定義及作用

Softmax 是一種形如下式的函數:

P(i)=exp(θiTx)k=1Kexp(θiTx) P(i) = \frac{exp(\theta_i^T x)}{\sum_{k=1}^{K} exp(\theta_i^T x)}

其中,$ \theta_i $ 和 $ x $ 是列向量,$ \theta_i^T x $ 可能被換成函數關於 $ x $ 的函數 $ f_i(x) $

通過 softmax 函數,可以使得 $ P(i) $ 的範圍在 $ [0,1] $ 之間。在迴歸和分類問題中,通常 $ \theta $ 是待求參數,通過尋找使得 $ P(i) $ 最大的 $ \theta_i $ 作爲最佳參數。

但是,使得範圍在 $ [0,1] $ 之間的方法有很多,爲啥要在前面加上以 $ e $ 的冪函數的形式呢?參考 logistic 函數:

P(i)=11+exp(θiTx) P(i) = \frac{1}{1+exp(-\theta_i^T x)}

這個函數的作用就是使得 $ P(i) $ 在負無窮到 0 的區間趨向於 0, 在 0 到正無窮的區間趨向 1,。同樣 softmax 函數加入了 $ e $ 的冪函數正是爲了兩極化:正樣本的結果將趨近於 1,而負樣本的結果趨近於 0。這樣爲多類別提供了方便(可以把 $ P(i) $ 看做是樣本屬於類別的概率)。可以說,Softmax 函數是 logistic 函數的一種泛化。

softmax 函數可以把它的輸入,通常被稱爲 logits 或者 logit scores,處理成 0 到 1 之間,並且能夠把輸出歸一化到和爲 1。這意味着 softmax 函數與分類的概率分佈等價。它是一個網絡預測多酚類問題的最佳輸出激活函數。

3.9.2 Softmax 推導

3.10 理解 One Hot Encodeing 原理及作用?

問題由來

在很多機器學習任務中,特徵並不總是連續值,而有可能是分類值。

例如,考慮一下的三個特徵:

["male", "female"] ["from Europe", "from US", "from Asia"]
["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]

如果將上述特徵用數字表示,效率會高很多。例如:

["male", "from US", "uses Internet Explorer"] 表示爲 [0, 1, 3]
["female", "from Asia", "uses Chrome"] 表示爲 [1, 2, 1]

但是,即使轉化爲數字表示後,上述數據也不能直接用在我們的分類器中。因爲,分類器往往默認數據數據是連續的(可以計算距離?),並且是有序的(而上面這個 0 並不是說比 1 要高級)。但是,按照我們上述的表示,數字並不是有序的,而是隨機分配的。

獨熱編碼

爲了解決上述問題,其中一種可能的解決方法是採用獨熱編碼(One-Hot Encoding)。獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對 N 個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效。

例如:

自然狀態碼爲:000,001,010,011,100,101
獨熱編碼爲:000001,000010,000100,001000,010000,100000

可以這樣理解,對於每一個特徵,如果它有 m 個可能值,那麼經過獨熱編碼後,就變成了 m 個二元特徵(如成績這個特徵有好,中,差變成 one-hot 就是 100, 010, 001)。並且,這些特徵互斥,每次只有一個激活。因此,數據會變成稀疏的。

這樣做的好處主要有:

  1. 解決了分類器不好處理屬性數據的問題;
  2. 在一定程度上也起到了擴充特徵的作用。

3.11 常用的優化器有哪些

分別列舉

Optimizer:
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer

3.12 Dropout 系列問題

3.12.1 爲什麼要正則化?

  1. 深度學習可能存在過擬合問題——高方差,有兩個解決方法,一個是正則化,另一個是準備更多的數據,這是非常可靠的方法,但你可能無法時時刻刻準備足夠多的訓練數據或者獲取更多數據的成本很高,但正則化通常有助於避免過擬合或減少你的網絡誤差。
  2. 如果你懷疑神經網絡過度擬合了數據,即存在高方差問題,那麼最先想到的方法可能是正則化,另一個解決高方差的方法就是準備更多數據,這也是非常可靠的辦法,但你可能無法時時準備足夠多的訓練數據,或者,獲取更多數據的成本很高,但正則化有助於避免過度擬合,或者減少網絡誤差。

3.12.2 爲什麼正則化有利於預防過擬合?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-btkxQBcV-1575791287847)(./img/ch3/3-40.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-viaMTJSt-1575791287847)(./img/ch3/3-41.png)]

左圖是高偏差,右圖是高方差,中間是Just Right,這幾張圖我們在前面課程中看到過。

3.12.3 理解dropout正則化

Dropout可以隨機刪除網絡中的神經單元,它爲什麼可以通過正則化發揮如此大的作用呢?

直觀上理解:不要依賴於任何一個特徵,因爲該單元的輸入可能隨時被清除,因此該單元通過這種方式傳播下去,併爲單元的四個輸入增加一點權重,通過傳播所有權重,dropout將產生收縮權重的平方範數的效果,和之前講的L2正則化類似;實施dropout的結果實它會壓縮權重,並完成一些預防過擬合的外層正則化;L2對不同權重的衰減是不同的,它取決於激活函數倍增的大小。

3.12.4 dropout率的選擇

  1. 經過交叉驗證,隱含節點 dropout 率等於 0.5 的時候效果最好,原因是 0.5 的時候 dropout 隨機生成的網絡結構最多。
  2. dropout 也可以被用作一種添加噪聲的方法,直接對 input 進行操作。輸入層設爲更接近 1 的數。使得輸入變化不會太大(0.8)
  3. 對參數 $ w $ 的訓練進行球形限制 (max-normalization),對 dropout 的訓練非常有用。
  4. 球形半徑 $ c $ 是一個需要調整的參數,可以使用驗證集進行參數調優。
  5. dropout 自己雖然也很牛,但是 dropout、max-normalization、large decaying learning rates and high momentum 組合起來效果更好,比如 max-norm regularization 就可以防止大的learning rate 導致的參數 blow up。
  6. 使用 pretraining 方法也可以幫助 dropout 訓練參數,在使用 dropout 時,要將所有參數都乘以 $ 1/p $。

3.12.5 dropout有什麼缺點?

dropout一大缺點就是代價函數J不再被明確定義,每次迭代,都會隨機移除一些節點,如果再三檢查梯度下降的性能,實際上是很難進行復查的。定義明確的代價函數J每次迭代後都會下降,因爲我們所優化的代價函數J實際上並沒有明確定義,或者說在某種程度上很難計算,所以我們失去了調試工具來繪製這樣的圖片。我通常會關閉dropout函數,將keep-prob的值設爲1,運行代碼,確保J函數單調遞減。然後打開dropout函數,希望在dropout過程中,代碼並未引入bug。我覺得你也可以嘗試其它方法,雖然我們並沒有關於這些方法性能的數據統計,但你可以把它們與dropout方法一起使用。

3.13 深度學習中常用的數據增強方法(Data Augmentation)?(貢獻者:黃欽建-華南理工大學)

  • Color Jittering:對顏色的數據增強:圖像亮度、飽和度、對比度變化(此處對色彩抖動的理解不知是否得當);

  • PCA Jittering:首先按照RGB三個顏色通道計算均值和標準差,再在整個訓練集上計算協方差矩陣,進行特徵分解,得到特徵向量和特徵值,用來做PCA Jittering;

  • Random Scale:尺度變換;

  • Random Crop:採用隨機圖像差值方式,對圖像進行裁剪、縮放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和長寬比增強變換;

  • Horizontal/Vertical Flip:水平/垂直翻轉;

  • Shift:平移變換;

  • Rotation/Reflection:旋轉/仿射變換;

  • Noise:高斯噪聲、模糊處理;

  • Label Shuffle:類別不平衡數據的增廣;

3.14 如何理解 Internal Covariate Shift?(貢獻者:黃欽建-華南理工大學)

深度神經網絡模型的訓練爲什麼會很困難?其中一個重要的原因是,深度神經網絡涉及到很多層的疊加,而每一層的參數更新會導致上層的輸入數據分佈發生變化,通過層層疊加,高層的輸入分佈變化會非常劇烈,這就使得高層需要不斷去重新適應底層的參數更新。爲了訓好模型,我們需要非常謹慎地去設定學習率、初始化權重、以及儘可能細緻的參數更新策略。

Google 將這一現象總結爲 Internal Covariate Shift,簡稱 ICS。 什麼是 ICS 呢?

大家都知道在統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分佈(distribution)是一致的”。如果不一致,那麼就出現了新的機器學習問題,如 transfer learning / domain adaptation 等。而 covariate shift 就是分佈不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同。

大家細想便會發現,的確,對於神經網絡的各層輸出,由於它們經過了層內操作作用,其分佈顯然與各層對應的輸入信號分佈不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。由於是對層間信號的分析,也即是“internal”的來由。

那麼ICS會導致什麼問題?

簡而言之,每個神經元的輸入數據不再是“獨立同分布”。

其一,上層參數需要不斷適應新的輸入數據分佈,降低學習速度。

其二,下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。

其三,每層的更新都會影響到其它層,因此每層的參數更新策略需要儘可能的謹慎。

3.15 什麼時候用local-conv?什麼時候用全卷積?(貢獻者:樑志成-魅族科技)

1.當數據集具有全局的局部特徵分佈時,也就是說局部特徵之間有較強的相關性,適合用全卷積。

2.在不同的區域有不同的特徵分佈時,適合用local-Conv。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章