動手學深度學習-學習筆記task3
《動手學深度學習》的學習內容鏈接在github上:
Dive-into-DL-PyTorch. 本次學習過程的coding 是用PyTorch實現。
0. 學習任務
過擬合、欠擬合及其解決方案;梯度消失和梯度爆炸;循環神經網絡進階
1. 過擬合、欠擬合及其解決方案
接近欠擬合的方法
解決過擬合的方法有權重衰減(L2正則化)、
1.1 權重衰減
權重衰減等價於 範數正則化(regularization)。正則化通過爲模型損失函數添加懲罰項使學出的模型參數值較小,是應對過擬合的常用手段。
範數正則化(regularization)
範數正則化在模型原損失函數基礎上添加範數懲罰項,從而得到訓練所需要最小化的函數。範數懲罰項指的是模型權重參數每個元素的平方和與一個正的常數的乘積。以線性迴歸中的線性迴歸損失函數爲例
其中是權重參數,是偏差參數,樣本的輸入爲,標籤爲,樣本數爲。將權重參數用向量表示,帶有範數懲罰項的新損失函數爲
其中超參數。當權重參數均爲0時,懲罰項最小。當較大時,懲罰項在損失函數中的比重較大,這通常會使學到的權重參數的元素較接近0。當設爲0時,懲罰項完全不起作用。上式中範數平方展開後得到。
有了範數懲罰項後,在小批量隨機梯度下降中,我們將線性迴歸一節中權重和的迭代方式更改爲
可見,範數正則化令權重和先自乘小於1的數,再減去不含懲罰項的梯度。因此,範數正則化又叫權重衰減。權重衰減通過懲罰絕對值較大的模型參數爲需要學習的模型增加了限制,這可能對過擬合有效。
1.2 丟棄法
多層感知機中神經網絡圖描述了一個單隱藏層的多層感知機。其中輸入個數爲4,隱藏單元個數爲5,且隱藏單元()的計算表達式爲
這裏是激活函數,是輸入,隱藏單元的權重參數爲,偏差參數爲。當對該隱藏層使用丟棄法時,該層的隱藏單元將有一定概率被丟棄掉。設丟棄概率爲,那麼有的概率會被清零,有的概率會除以做拉伸。丟棄概率是丟棄法的超參數。具體來說,設隨機變量爲0和1的概率分別爲和。使用丟棄法時我們計算新的隱藏單元
由於,因此
即丟棄法不改變其輸入的期望值。讓我們對之前多層感知機的神經網絡中的隱藏層使用丟棄法,一種可能的結果如圖所示,其中和被清零。這時輸出值的計算不再依賴和,在反向傳播時,與這兩個隱藏單元相關的權重的梯度均爲0。由於在訓練中隱藏層神經元的丟棄是隨機的,即都有可能被清零,輸出層的計算無法過度依賴中的任一個,從而在訓練模型時起到正則化的作用,並可以用來應對過擬合。在測試模型時,我們爲了拿到更加確定性的結果,一般不使用丟棄法
2. 梯度消失和梯度爆炸
深度模型有關數值穩定性的典型問題是消失(vanishing)和爆炸(explosion)。當神經網絡的層數較多時,模型的數值穩定性容易變差。
2.1 隨機初始化模型參數
在神經網絡中,通常需要隨機初始化模型參數。下面我們來解釋這樣做的原因。
回顧多層感知機一節描述的多層感知機。爲了方便解釋,假設輸出層只保留一個輸出單元(刪去和以及指向它們的箭頭),且隱藏層使用相同的激活函數。如果將每個隱藏單元的參數都初始化爲相等的值,那麼在正向傳播時每個隱藏單元將根據相同的輸入計算出相同的值,並傳遞至輸出層。在反向傳播中,每個隱藏單元的參數梯度值相等。因此,這些參數在使用基於梯度的優化算法迭代後值依然相等。之後的迭代也是如此。在這種情況下,無論隱藏單元有多少,隱藏層本質上只有1個隱藏單元在發揮作用。因此,正如在前面的實驗中所做的那樣,我們通常將神經網絡的模型參數,特別是權重參數,進行隨機初始化。
2.1.1 PyTorch的默認隨機初始化
隨機初始化模型參數的方法有很多。在線性迴歸的簡潔實現中,我們使用torch.nn.init.normal_()
使模型net
的權重參數採用正態分佈的隨機初始化方式。不過,PyTorch中nn.Module
的模塊參數都採取了較爲合理的初始化策略(不同類型的layer具體採樣的哪一種初始化方法的可參考源代碼),因此一般不用我們考慮。
2.1.2 Xavier隨機初始化
還有一種比較常用的隨機初始化方法叫作Xavier隨機初始化。
假設某全連接層的輸入個數爲,輸出個數爲,Xavier隨機初始化將使該層中權重參數的每個元素都隨機採樣於均勻分佈
它的設計主要考慮到, 模型參數初始化後,每層輸出的方差不該受該層輸入個數影響,且每層梯度的方差也不該受該層輸出個數影響。
2.2 考慮環境因素
2.2.1 協變量偏移
這裏我們假設,雖然輸入的分佈可能隨時間而改變,但是標記函數,即條件分佈P(y∣x)不會改變。雖然這個問題容易理解,但在實踐中也容易忽視。
想想區分貓和狗的一個例子。我們的訓練數據使用的是貓和狗的真實的照片,但是在測試時,我們被要求對貓和狗的卡通圖片進行分類。
cat | cat | dog | dog |
---|---|---|---|
測試數據:
cat | cat | dog | dog |
---|---|---|---|
顯然,這不太可能奏效。訓練集由照片組成,而測試集只包含卡通。在一個看起來與測試集有着本質不同的數據集上進行訓練,而不考慮如何適應新的情況,這是不是一個好主意。不幸的是,這是一個非常常見的陷阱。
統計學家稱這種協變量變化是因爲問題的根源在於特徵分佈的變化(即協變量的變化)。數學上,我們可以說P(x)改變了,但P(y∣x)保持不變。儘管它的有用性並不侷限於此,當我們認爲x導致y時,協變量移位通常是正確的假設。
2.2.2 標籤偏移
當我們認爲導致偏移的是標籤P(y)上的邊緣分佈的變化,但類條件分佈是不變的P(x∣y)時,就會出現相反的問題。當我們認爲y導致x時,標籤偏移是一個合理的假設。例如,通常我們希望根據其表現來預測診斷結果。在這種情況下,我們認爲診斷引起的表現,即疾病引起的症狀。有時標籤偏移和協變量移位假設可以同時成立。例如,當真正的標籤函數是確定的和不變的,那麼協變量偏移將始終保持,包括如果標籤偏移也保持。有趣的是,當我們期望標籤偏移和協變量偏移保持時,使用來自標籤偏移假設的方法通常是有利的。這是因爲這些方法傾向於操作看起來像標籤的對象,這(在深度學習中)與處理看起來像輸入的對象(在深度學習中)相比相對容易一些。
病因(要預測的診斷結果)導致 症狀(觀察到的結果)。
訓練數據集,數據很少只包含流感p(y)的樣本。
而測試數據集有流感p(y)和流感q(y),其中不變的是流感症狀p(x|y)。
2.2.3 概念偏移
另一個相關的問題出現在概念轉換中,即標籤本身的定義發生變化的情況。這聽起來很奇怪,畢竟貓就是貓。的確,貓的定義可能不會改變,但我們能不能對軟飲料也這麼說呢?事實證明,如果我們周遊美國,按地理位置轉移數據來源,我們會發現,即使是如圖所示的這個簡單術語的定義也會發生相當大的概念轉變。
如果我們要建立一個機器翻譯系統,分佈P(y∣x)可能因我們的位置而異。這個問題很難發現。另一個可取之處是P(y∣x)通常只是逐漸變化。