Datawhale X 李宏毅蘋果書AI夏令營深度學習進階(三)

W12w發表於2024-09-02

一.批次歸一化
繼續上一篇文章的批次歸一化,如果是固定的學習率,可能很難得到好的結果,所以我們才需要自適應的學習率、Adam等比較進階的最佳化的方法,才能夠得到好的結果。如果我們可以給不同的維度,同樣的數值範圍的話,那我們可能就可以製造比較好的誤差表面,讓訓練變得比較容易一點其實有很多不同的方法,這些不同的方法往往就合起來統稱為特徵歸一化(feature normalization)歸一化有個好處,做完歸一化以後,這個維度上面的數值就會平均是 0,其方差是 1,所以這一排數值的分佈就都會在 0 上下;對每一個維度都做一樣的歸一化,所有特徵不同維度的數值都在 0 上下,可能就可以製造一個比較好的誤差表面。所以像這樣子的特徵歸一化方式往往對訓練有幫助,它可以讓在做梯度下降的時候,損失收斂更快一點,訓練更順利一點。一般而言,特徵歸一化,要放在啟用函式之前,之後都是可以的,在實現上,沒有太大的差別。
GPU 的視訊記憶體無法把它整個資料集的資料都載入進去。因此,在實現的時候,不會讓這一個網路考慮整個訓練資料裡面的所有樣本,而是隻會考慮一個批次裡面的樣本。比如批次設 64,這個網路就是把 64 筆資料讀進去,計算這 64 筆資料的 µ,σ,對這 64 筆資料做歸一化。因為實際實現的時候,只對一個批次裡面的資料做歸一化,所以技巧稱為批次歸一化。一定要有一個夠大的批次,才算得出 µ,σ。所以批次歸一化適用於批次大小比較大的時候,批次大小如果比較大,也許這個批次大小裡面的資料就足以表示整個資料集的分佈。這個時候就不需要對整個資料集做特徵歸一化,而改成只在一個批次上做特徵歸一化作為近似。
下圖是從批次歸一化原始文獻的實驗結果

橫軸代表的是訓練的過程,縱軸代表的是驗證集上的準確率。黑色的虛線是沒有做批次歸一化的結果,它用的是 inception 的網路(一種網路以 CNN 為基礎的網路架構)。如果有做批次歸一化,則是紅色的這一條虛線。紅色虛線的訓練速度顯然比黑色的虛線還要快很多。雖然只要給模型足夠的訓練的時間,最後會收斂都差不多的準確率。但是紅色虛線可以在比較短的時間內跑到一樣的準確率。藍色的菱形代表說幾個點的準確率是一樣的。粉紅色的線是 sigmoid 函式,一般的認知,但一般都會選擇ReLU,而不是用 sigmoid 函式,因為 sigmoid 函式的訓練是比較困難的。但是這邊想要強調的點是,就算是 sigmoid 比較難搞的加批次歸一化,還是可以訓練的,這邊沒有 sigmoid,沒有做批次歸一化的結果。因為在這個實驗上,sigmoid 不加批次歸一化,根本連訓練都訓練不起來。藍色的實線跟這個藍色的虛線呢是把學習率設比較大一點,×5 就是學習率變原來的 5倍;×30 就是學習率變原來的 30 倍。因為如果做批次歸一化,誤差表面會比較平滑,比較容易訓練,所以就可以把學習率設大一點。

二.卷積神經網路
(一)通道的定義
彩色影像的每個畫素都可以描述為紅色(red)、綠色(green)、藍色(blue)的組合,這 3 種顏色就稱為影像的 3 個色彩通道。這種顏色描述方式稱為 RGB 色彩模型,常用於在螢幕上顯示顏色。
一張影像是一個三維的張量,其中一維代表影像的寬,另外一維代表影像的高,還有一維代表影像的通道(channel)的數目。
(二)感受野
卷積神經網路會設定一個區域,即感受野(receptivefield),每個神經元都只關心自己的感受野裡面發生的事情,感受野是由我們自己決定的。

一般在做影像識別的時候,可能不會覺得有些模式只出現在某一個通道里面,所以會看全部的通道。既然會看全部的通道,那麼在描述一個感受野的時候,只要講它的高跟寬,不用講它的深度,因為它的深度就等於通道數,而高跟寬合起來叫做核大小。一般同一個感受野會有一組神經元去守備這個範圍,比如 64 個或者是 128 個神經元去守備一個感受野的範圍。目前為止,講的都是一個感受野,接下來介紹下各個不同感受野之間的關係。我們把左上角的感受野往右移一個步幅,就製造出一個新的守備範圍,即新的感受野。移動的量稱為步幅(stride)。感受野需要有重疊,如果有一個模式正好出現在兩個感受野的交界上面,就沒有任何神經元去檢測它,這個模式可能會丟失,所以希望感受野彼此之間有高度的重疊。如令步幅 = 2,感受野就會重疊。
若感受野超出影像範圍,超出範圍就做填充(padding),填充就是補值,一般使用零填充(zero padding),超出範圍就補 0,如果感受野有一部分超出影像的範圍之外,就當做那個裡面的值都是 0。其實也有別的補值的方法,比如補整張影像裡面所有值的平均值或者把邊界的這些數字拿出來補沒有值的地方。

(三)共享引數
如果放在影像處理上,則可以讓不同感受野的神經元共享引數,也就是做引數共享(parameter sharing),如下圖所示。所謂引數共享就是兩個神經元的權重完全是一樣的。

全連線網路是彈性最大的。全連線網路可以決定它看整張影像還是隻看一個範圍,如果它只想看一個範圍,可以把很多權重設成 0。全連線層(fully-connected layer,)可以自己決定看整張影像還是一個小範圍。但加上感受野的概念以後,只能看一個小範圍,網路的彈性是變小的。引數共享又進一步限制了網路的彈性。本來在學習的時候,每個神經元可以各自有不同的引數,它們可以學出相同的引數,也可以有不一樣的引數。但是加入引數共享以後,某一些神經元無論如何引數都要一模一樣的,這又增加了對神經元的限制。而感受野加上引數共享就是卷積層(convolutional layer),用到卷積層的網路就叫卷積神經網路。卷積神經網路的偏差比較大。但模型偏差大不一定是壞事,因為當模型偏差大,模型的靈活性較低時,比較不容易過擬合。全連線層可以做各式各樣的事情,它可以有各式各樣的變化,但它可能沒有辦法在任何特定的任務上做好。而卷積層是專門為影像設計的,感受野、引數共享都是為影像設計的。雖然卷積神經網路模型偏差很大,但用在影像上不是問題。如果把它用在影像之外的任務,就要仔細想想這些任務有沒有影像用的特性。
(四)濾波器
濾波器就是一個一個的張量,這些張量裡面的數值就是模型裡面的引數。這些濾波器裡面的數值其實是未知的,它是可以透過學習找出來的。
不同的神經元可以共享權重,去守備不同的範圍。而共享權重其實就是用濾波器掃過一張影像,這個過程就是卷積。這就是卷積層名字的由來。把濾波器掃過影像就相當於不同的感受野神經元可以共用引數,這組共用的引數就叫做一個濾波器。
(五)匯聚
匯聚沒有引數,所以它不是一個層,它裡面沒有權重,它沒有要學習的東西,匯聚比較像 Sigmoid、ReLU 等啟用函式。因為它裡面是沒有要學習的引數的,它就是一個運算子(operator),其行為都是固定好的,不需要根據資料學任何東西。每個濾波器都產生一組數字,要做匯聚的時候,把這些數字分組,可以 2 × 2 個一組,3 × 3、4 × 4 也可以,這個是我們自己決定的。不過匯聚對於模型的效能(performance)可能會帶來一點傷害。假設要檢測的是非常微細的東西,隨便做下采樣,效能可能會稍微差一點。所以近年來影像的網路的設計往往也開始把匯聚丟掉,它會做這種全卷積的神經網路,整個網路裡面都是卷積,完全都不用匯聚。匯聚最主要的作用是減少運算量,透過下采樣把影像變小,從而減少運算量。隨著近年來運算能力越來越強,如果運算資源足夠支撐不做匯聚,很多網路的架構的設計往往就不做匯聚,而是使用全卷積,卷積從頭到尾,看看做不做得起來,看看能不能做得更好。
(六)扁平化
扁平化就是把影像裡面本來排成矩陣樣子的東西“拉直”,即把所有的數值“拉直”變成一個向量。

相關文章