作者:DennisShaw
Task03:
過擬合、欠擬合及其解決方案
-
訓練誤差(training error):模型在訓練數據集上表現出的誤差
-
泛化誤差(generalization error):模型在任意一個測試數據樣本上表現出的誤差的期望
計算誤差使用模型中的損失函數來計算,例如之前的線性迴歸的平方損失函數和softmax迴歸的交叉熵損失函數
機器學習模型應關注降低泛化誤差
模型的選擇:在選擇模型中,不應只依賴訓練數據選擇模型。
解決方法:
- 可設置預留在訓練集與測試集之外的驗證集,或給定訓練集中隨機選取一小部分作爲驗證集來從訓練誤差中估計泛化誤差。
- 使用K折交叉驗證,把原始訓練數據集分割成K個不重合的子數據集,做K次模型訓練和驗證,用一個子數據集驗證模型,並使用其他K-1個子數據集來訓練模型。
過擬合與欠擬合:
- 欠擬合:模型無法得到較低的訓練誤差
- 過擬合:模型的訓練誤差遠小於它在測試數據集上的誤差
兩種影響擬合問題的因素:
- 模型複雜度:模型複雜度與誤差的關係
- 訓練數據集大小:訓練數據集中樣本數過少,特別是比模型參數數量(按元素計)更少時,過擬合更容易發生。泛化誤差不會隨訓練數據集裏樣本數量增加而增大。
權重衰減:等價於範數正則化,正則化通過爲模型損失函數添加懲罰項使學出的模型參數值較小,可應對過擬合。
在模型原損失函數基礎上添加範數懲罰項,從而得到訓練所需要最小化的函數。範數懲罰項指的是模型權重參數每個元素的平方和與一個正的常數的乘積。
丟棄法:當對隱藏層使用丟棄法時,該層的隱藏單元將有一定概率被丟棄掉。在訓練模型時起到正則化的作用,並可以用來應對過擬合。
總結:
解決方法:
欠擬合:1、加大模型複雜程度 2、增加更多的特徵,使輸入數據具有更強的表達能力 3、調整參數和超參數 4、降低正則化約束
過擬合:1、增加訓練數據 2、使用正則化約束(權重衰減) 3、減少特徵數 4、減小模型複雜程度 5、調整參數和超參數
6、神經網絡中Dropout(丟棄法) 7、提前結束訓練
課後練習:(錯題分析)
無
梯度消失、梯度爆炸
在深度模型中,有關數值穩定性就是梯度消失問題與梯度爆炸問題。
當神經網絡的層數較多時,模型的數值穩定性容易變差
隨機初始化模型參數:
若將每個隱藏單元的參數都初始化爲相等的值,無論隱藏單元有多少,隱藏層本質上只有1個隱藏單元在發揮作用。所以通常將神經網絡的模型參數,特別是權重參數,進行隨機初始化。
PyTorch中nn.Module的模塊參數都採取了較爲合理的初始化策略,一般情況無需我們考慮。
Xavier隨機初始化:Xavier隨機初始化將使該層中權重參數的每個元素都隨機採樣於均勻分佈,主要考慮到,模型參數初始化後,每層輸出的方差不該受該層輸入個數影響,且每層梯度的方差也不該受該層輸出個數影響。
環境因素:
協變量偏移:輸入的分佈可能隨時間而改變,但是標記函數,即條件分佈P(y∣x)不會改變,這種協變量變化是因爲問題的根源在於特徵分佈的變化(即協變量的變化)。
標籤偏移:當我們認爲導致偏移的是標籤P(y)上的邊緣分佈的變化,但類條件分佈是不變的P(x∣y)時,就會出現相反的問題。當我們期望標籤偏移和協變量偏移保持時,使用來自標籤偏移假設的方法通常是有利的。
概念偏移:即標籤本身的定義發生變化的情況。
Kaggle 房價預測實戰:
課後練習:(錯題分析)
如果數據量足夠的情況下,確保訓練數據集和測試集中的數據取自同一個數據集,可以防止協變量偏移和標籤偏移是正確的。如果數據量很少,少到測試集中存在訓練集中未包含的標籤,就會發生標籤偏移。
循環神經網絡進階
RNN存在的問題:梯度較容易出現衰減或爆炸(BPTT)
解決方法:採用門控循環神經網絡,捕捉時間序列中時間步距離較大的依賴關係,如GRU、LSTM。
GRU當中的重置門主要捕捉短期依賴、更新門主要捕捉長期依賴。
LSTM中:
遺忘門:控制上一時間步的記憶細胞
輸入門:控制當前時間步的輸入
輸出門:控制從記憶細胞到隱藏狀態
記憶細胞:⼀種特殊的隱藏狀態的信息的流動
深度循環神經網絡
雙向循環神經網絡:有效捕捉上下文信息,前向的隱藏層參數與後向的隱藏層參數用concat進行連結
課後練習:(錯題分析)
無
Task04
機器翻譯及相關技術
數據預處理:
- 讀取數據,數據預處理,處理編碼問題與無效字符串
- 分詞
- 建立詞典
- 對數據進行padding操作。
- 製作數據生成器
Seq2seq模型搭建:
一般使用Encoder-Decoder結構,先轉化爲中間語義表示再進行輸出
課後練習:(錯題分析)
訓練時decoder每個單元的輸入單詞爲序列中的第n個單詞,輸出爲第n+1個單詞。
每個batch訓練時encoder和decoder都有固定長度的輸入。
注意力機制與Seq2seq模型
在seq2seq模型中,解碼器只能隱式地從編碼器的最終狀態中選擇相應的信息。然而,注意力機制可以將這種選擇過程顯式地建模。
Attention 是一種通用的帶權池化方法,輸入由兩部分構成:詢問(query) 和 鍵值對(key-value pairs)
Attention layer得到輸出與value的維度一致
對於一個query來說,attention layer 會與每一個key計算注意力分數並進行權重的歸一化,輸出的向量則是value的加權求和,而每個key計算的權重與value一一對應。
爲了計算輸出,我們首先假設有一個函數用於計算query和key的相似性,然後可以計算所有的 attention scores
使用 softmax函數 獲得注意力權重
最終的輸出就是value的加權求和
不同的attetion layer的區別在於Score函數的選擇,在本節的其餘部分,我們將討論兩個常用的注意層 Dot-product Attention 和 Multilayer Perceptron Attention:
點積注意力 Dot-product Attention:假設query和keys有相同的維度,通過計算query和key轉置的乘積來計算attention score,通常還會除去減少計算出來的score對維度𝑑的依賴性。
多層感知機注意力 Multilayer Perceptron Attention:在多層感知器中,我們首先將 query and keys 投影到.我們將可以學習的參數做如下映射, , 。 將score函數定義
然後將key 和 value 在特徵的維度上合併(concatenate),然後送至 a single hidden layer perceptron 這層中 hidden layer 爲 ℎ 且輸出的size爲 1 .隱層激活函數爲tanh,無偏置。
儘管MLPAttention包含一個額外的MLP模型,但如果給定相同的輸入和相同的鍵,我們將獲得與DotProductAttention相同的輸出
總結
- 注意力層顯式地選擇相關的信息。
- 注意層的內存由鍵-值對組成,因此它的輸出接近於鍵類似於查詢的值。
引入注意力機制的Seq2seq模型:
下圖展示encoding 和decoding的模型結構,在時間步爲t的時候。此刻attention layer保存着encodering看到的所有信息——即encoding的每一步輸出。在decoding階段,解碼器的時刻的隱藏狀態被當作query,encoder的每個時間步的hidden states作爲key和value進行attention聚合. Attetion model的輸出當作成上下文信息context vector,並與解碼器輸入拼接起來一起送到解碼器:
具有注意機制的seq2seq模型中層結構:
課後練習:(錯題分析)
在Dot-product Attention中,key與query維度需要一致,在MLP Attention中則不需要,在MLP Attention中key與query維度可以不等。
注意力掩碼可以用來解決一組變長序列的編碼問題。
seq2seq模型的預測需人爲設定終止條件,設定最長序列長度或者輸出[EOS]結束符號,若不加以限制則可能生成無窮長度序列。
解碼器RNN仍由編碼器最後一個時間步的隱藏狀態初始化。
注意力機制本身有高效的並行性,但引入注意力並不能改變seq2seq內部RNN的迭代機制,因此無法加速。
有效長度不同的輸入會導致 Attention Mask 不同,屏蔽掉無效位置後進行attention,會導致不同的輸出。參考代碼Dot-Product Attention的測試部分。
Transformer
- CNNs 易於並行化,卻不適合捕捉變長序列內的依賴關係。
- RNNs 適合捕捉長距離變長序列的依賴,但是卻難以實現並行化處理序列。
使用注意力機制設計的Transformer模型結合了CNN與RNN的優勢。
利用attention機制實現了並行化捕捉序列依賴,並且同時處理序列的每個位置的tokens,上述優勢使得Transformer模型在性能優異的同時大大減少了訓練時間。
Transformer與Encoder-Decoder結構的不同之處在於:
- Transformer blocks:將seq2seq模型重的循環網絡替換爲了Transformer Blocks,該模塊包含一個多頭注意力層(Multi-head Attention Layers)以及兩個position-wise feed-forward networks(FFN)。對於解碼器來說,另一個多頭注意力層被用於接受編碼器的隱藏狀態。
- Add and norm:多頭注意力層和前饋網絡的輸出被送到兩個“add and norm”層進行處理,該層包含殘差結構以及層歸一化。
- Position encoding:由於自注意力層並沒有區分元素的順序,所以一個位置編碼層被用於向序列元素裏添加位置信息。
基於位置的前饋網絡:
Transformer 模塊另一個非常重要的部分就是基於位置的前饋網絡(FFN),它接受一個形狀爲(batch_size,seq_length, feature_size)的三維張量。Position-wise FFN由兩個全連接層組成,他們作用在最後一維上。因爲序列的每個位置的狀態都會被單獨地更新,所以我們稱他爲position-wise,這等效於一個1x1的卷積。
課後練習:(錯題分析)
解碼器部分均只需進行的前向傳播在訓練過程1次,預測過程要進行句子長度次。
自注意力模塊理論上可以捕捉任意距離的依賴關係。
解碼器部分在預測過程中不需要使用 Attention Mask。
在MultiHeadAttention模塊中:
個注意力頭中,每個的參數量爲
,最後的輸出層形狀爲,所以參數量共爲
層歸一化有利於加快收斂,減少訓練時間成本。
層歸一化對一箇中間層的所有神經元進行歸一化。
層歸一化的效果不會受到batch大小的影響。
批歸一化(Batch Normalization)纔是對每個神經元的輸入數據以mini-batch爲單位進行彙總
Task05
卷積神經網絡基礎
二維卷積層:二維互相關(cross-correlation)運算的輸入是一個二維輸入數組和一個二維核(kernel)數組,輸出也是一個二維數組,其中核數組通常稱爲卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入數組,卷積核在輸入數組上滑動,在每個位置上,卷積核與該位置處的輸入子數組按元素相乘並求和,得到輸出數組中相應位置的元素。圖1展示了一個互相關運算的例子,陰影部分分別是輸入的第一個計算區域、核數組以及對應的輸出。
二維卷積層將輸入和卷積核做互相關運算,並加上一個標量偏置來得到輸出。卷積層的模型參數包括卷積核和標量偏置。
二維卷積層輸出的二維數組可以看作是輸入在空間維度(寬和高)上某一級的表徵,也叫特徵圖(feature map)。影響元素 x 的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫做 x 的感受野(receptive field)。
填充和步幅:填充(padding)是指在輸入高和寬的兩側填充元素(通常是0元素),圖2裏我們在原輸入高和寬的兩側分別添加了值爲0的元素。
如果原輸入的高和寬是 和 ,卷積核的高和寬是 和 ,在高的兩側一共填充 行,在寬的兩側一共填充 列,則輸出形狀爲
在互相關運算中,卷積核在輸入數組上滑動,每次滑動的行數與列數即是步幅(stride)。此前我們使用的步幅都是1,圖3展示了在高上步幅爲3、在寬上步幅爲2的二維互相關運算。
一般來說,當高上步幅爲 ,寬上步幅爲 時,輸出形狀爲:
課後練習:(錯題分析)
leNet
使用全連接層的侷限性:
- 圖像在同一列鄰近的像素在這個向量中可能相距較遠。它們構成的模式可能難以被模型識別。
- 對於大尺寸的輸入圖像,使用全連接層容易導致模型過大。
使用卷積層的優勢:
- 卷積層保留輸入形狀。
- 卷積層通過滑動窗口將同一卷積核與不同位置的輸入重複計算,從而避免參數尺寸過大。
卷積層塊裏的基本單位是卷積層後接平均池化層:卷積層用來識別圖像裏的空間模式,如線條和物體局部,之後的平均池化層則用來降低卷積層對位置的敏感性。
卷積層塊由兩個這樣的基本單位重複堆疊構成。在卷積層塊中,每個卷積層都使用的窗口,並在輸出上使用sigmoid激活函數。第一個卷積層輸出通道數爲6,第二個卷積層輸出通道數則增加到16。
全連接層塊含3個全連接層。它們的輸出個數分別是120、84和10,其中10爲輸出的類別個數。
卷積神經網絡就是含卷積層的網絡。 LeNet交替使用卷積層和最大池化層後接全連接層來進行圖像分類。
課後練習:(錯題分析)
卷積神經網絡進階
Alexnet:
首次證明了學習到的特徵可以超越⼿⼯設計的特徵,從而⼀舉打破計算機視覺研究的前狀。
特徵:
- 8層變換,其中有5層卷積和2層全連接隱藏層,以及1個全連接輸出層。
- 將sigmoid激活函數改成了更加簡單的ReLU激活函數。
- 用Dropout來控制全連接層的模型複雜度。
- 引入數據增強,如翻轉、裁剪和顏色變化,從而進一步擴大數據集來緩解過擬合。
VGG:通過重複使⽤簡單的基礎塊來構建深度模型。
Block:數個相同的填充爲1、窗口形狀爲3x3的卷積層,接上一個步幅爲2、窗口形狀爲2x2的最大池化層。
卷積層保持輸入的高和寬不變,而池化層則對其減半。
NiN:串聯多個由卷積層和“全連接”層構成的小⽹絡來構建⼀個深層⽹絡。
⽤了輸出通道數等於標籤類別數的NiN塊,然後使⽤全局平均池化層對每個通道中所有元素求平均並直接⽤於分類。
GoogLeNet:
- 由Inception基礎塊組成。
- Inception塊相當於⼀個有4條線路的⼦⽹絡。它通過不同窗口形狀的卷積層和最⼤池化層來並⾏抽取信息,並使⽤1×1卷積層減少通道數從而降低模型複雜度。
- 可以⾃定義的超參數是每個層的輸出通道數,我們以此來控制模型複雜度。