umich cv-5-1 神經網路訓練1

dyccyber發表於2023-10-28

這節課中介紹了訓練神經網路的第一部分,包括啟用函式的選擇,權重初始化,資料預處理以及正則化方法

啟用函式

這部分主要討論我們之前提到的幾種啟用函式的利弊:
img
首先我們看sigmoid函式,這種啟用函式有著啟用函式中常見的優點與缺點:
img
優點方面,它可以使資料分佈在0-1之間,可以很好地表示神經元的飽和放電現象
缺點方面
我們考慮使用這個啟用函式進行梯度的反向傳播:
img
我們可以看到在x = 10或者x = -10時,傳播的梯度都會接近於0,導致後面的所有梯度均變為0,這就會導致梯度消失,我們的神經網路無法學習
同時,sigmoid啟用函式的輸出並不是以0為中心:
img
我們知道w梯度的反向傳播的值於x相關,所以當x一直為正時,w梯度將取決於w的正負,所以梯度很可能會在正負之間橫跳,這樣也不利於神經網路的學習,但是在小資料集上還是可以使用,並且小哥指出這一點其實不是特別關鍵
最後,就是exp()這種非線性操作從底層來說很花費時間(相對於線性操作來說)
之後我們再來看看其它啟用函式:
tanh它的優缺點與sigmoid函式大致相同:
img
然後是最常用的relu啟用函式:
img
relu函式有很多優異的性質,比如不會導致飽和殺死梯度,計算開銷低速度快,神經網路收斂的也快
但是還有一個人們一直擔心的問題就是:
img
小於0的資料永遠不會被啟用無法學習
因此人們又想出來了很多relu的變體:
leaky relu在小於0的區域加入一個線性函式,更進一步地,可以把小於0區域函式的係數作為一個可學習的引數加入神經網路,透過反向傳播來更新最佳化
img
elu 相對於leaky relu新增了魯棒性,但是計算開銷增大
img
selu 對深度神經網路的效果很好 甚至可以不用batch normalization就可以訓練深層神經網路 而其中的引數是固定的,是透過91頁的數學推導得出的結果(震驚小哥一萬年)
img
最後再放上不同啟用函式資料的統計以及小哥的建議:
img
img

資料預處理

資料的預處理最常見的就是從均值與標準差入手:
img
當然也有少數使用PCA降維與資料白化:
img
它們的基本思想都是減少模型的敏感性,使其更容易最佳化收斂:
img
舉個例子,Alexnet VGG ResNet都採用了不同的資料預處理方法,Alexnet減去整個影像的均值,VGG減去每個通道的均值,而Resnet減去每個通道的均值再除以每個通道的標準差
img

權重初始化

在訓練神經網路時,我們面臨的問題就是如何進行權重矩陣的初始化
首先一個基礎的想法就是都初始化為0矩陣,但是這樣會導致所有的輸出都是0,梯度都一樣,無法學習
其次我們會想全0不行,那隨機生成一些隨機數應該可以了吧,我們可以使用python中randn函式,利用高斯分佈生成隨機數,但是這樣的方法只使用於小的神經網路,不適用於更深的神經網路,為什麼呢?
img
我們把在不同層的資料分佈圖畫出來,可以看到:
img

img
std係數小的時候,資料在深層會集中在0,std大的時候就會出現之前的過飽和現象,殺死梯度,這兩種情況都會導致神經網路無法學習

針對上述問題,人們想出來了Xavier initialization,把之前的std改為除以輸入維度開根號,這是針對全連線層,卷積層是卷積核的平方乘以輸入維度再開根號,我們可以看到效果很好,基本維持住了資料的形狀
img
這裡的原理主要就是我們想要使輸入方差等於輸出方差,這一點可以利用基本的機率論知識進行推導,建立在相互獨立以及均值為0的假設上:
img
但是上述神經網路中我們採用的是tanh啟用函式,假如我們使用relu啟用函式,那麼均值為0的假設就不成立,這時候人們推匯出針對relu的Kaiming initialization:
img

上面提到了全連線層還有卷積層,還沒有提到殘差網路,針對殘差網路比較特殊,如果我們使用上述初始化,使得輸入與輸出的方差相等的話,由於殘差塊還要加上一個x,所以方差是一定會增大的,這裡我們可以把第一個卷積層採用kaiming initialization初始化,第二個卷積層直接初始化為0,這樣我們殘差塊的輸入與輸出的方差就相等了:
img

正則化

正則化方法最常用的就是我們直接衡量矩陣的L2distance等等:
img

也有我們之前提到的dropout方法:
img
這裡的思想是神經網路中可能有冗餘的特徵,透過dropout我們可以放棄這些冗餘的特徵,降低特徵與特徵之間的關聯,這樣有利於我們提取到更重要更有效的特徵:
img

這裡引入正則化的一般模式,思想是在訓練的時候我們加入隨機性,在測試的時候我們平均這種隨機性防止混亂:
img

dropout的實現也是如此:
img
注意dropout只使用於全連線層,對於放棄了全連線層的網路一般使用batch normalization:
img

既然提到了正則化的思想是增加隨機性,我們可以在輸入資料上做更多的處理,採用不同的資料增強方法:
我們可以旋轉我們的影像:
img
將影像劃分為不同的區域:
img
甚至改變顏色:
img
總之我們可以做任何瘋狂的事情來幫助我們的神經網路學習不同複雜的情況:
img

除了資料增加,我們還有dropconnect,隨機放棄神經元之間的連線:
img
選擇隨機的池化區域:
img
隨機跳過一些殘差塊:
img
隨機將影像的一部分畫素設為0(cutout):
img
將不同的影像混合訓練:
img
最後是小哥的建議!
img

相關文章