李宏毅深度學習筆記
局部極小值與鞍點
鞍點其實就是梯度是零且區別于局部極小值和局部極大值的點。
鞍點的叫法是因為其形狀像馬鞍。鞍點的梯度為零,但它不是局部極小值。我們把梯度為零的點統稱為臨界點(critical point)。損失沒有辦法再下降,也許是因為收斂在了臨界點,但不一定收斂在局部極小值,因為鞍點也是梯度為零的點。
判斷臨界值種類的方法
走到臨界點的時候,這個臨界點到底是局部極小值還是鞍點,是一個值得去探討的問題。因為如果損失收斂在局部極小值,我們所在的位置已經是損失最低的點了,往四周走損失都會比較高,就沒有路可以走了。但鞍點沒有這個問題,旁邊還是有路可以讓損失更低的。只要逃離鞍點,就有可能讓損失更低。
主要是通過計算海森矩陣來判斷是哪種臨界點(太復雜了看不懂)
但實際上,我們幾乎不會真的把海森矩陣算出來,因為海森矩陣需要算二次微分,計算這個矩陣的運算量非常大,還要把它的特征值跟特征向量找出來,所以幾乎沒有人用這個方法來逃離鞍點。還有一些其他逃離鞍點的方法的運算量都比要算海森矩陣小很多。
從經驗上看起來,局部極小值并沒有那么常見。多數的時候,我們訓練到一個梯度很小的地方,參數不再更新,往往只是遇到了鞍點。
批量(批量梯度下降法和隨機梯度下降法)
實際上在計算梯度的時候,并不是對所有數據的損失 L 計算梯度,而是把所有的數據分成一個一個的批量(batch),每個批量的大小是 B ,即帶有 B 筆數據。每次在更新參數的時候,會去取出 B 筆數據用來計算出損失和梯度更新參數。遍歷所有批量的過程稱為一個回合(epoch)。
在把數據分為批量的時候,我們還會進行隨機打亂。隨機打亂有很多不同的做法,一個常見的做法是在每一個回合開始之前重新劃分批量,也就是說,每個回合的批量的數據都不一樣。
不同批量大小之間對比
- 批量大小為訓練數據的大小,這種使用全批量(full batch)的數據來更新參數的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此時模型必須把 20 筆訓練數據都看完,才能夠計算損失和梯度,參數才能夠更新一次。
- 批量大小等于 1,此時使用的方法即隨機梯度下降法(Stochastic Gradient Descent,SGD),也稱為增量梯度下降法。批量大小等于 1 意味著只要取出一筆數據即可計算損失、更新一次參數。如果總共有 20 筆數據,那么在每一個回合里面,參數會更新 20 次。用一筆數據算出來的損失相對帶有更多噪聲,因此其更新的方向是曲曲折折的 。
批量梯度下降并沒有“劃分批量”:要把所有的數據都看過一遍,才能夠更新一次
參數,因此其每次迭代的計算量大。但相比隨機梯度下降,批量梯度下降每次更新更穩定、更準確。
隨機梯度下降的梯度上引入了隨機噪聲,因此在非凸優化問題中,其相比批量梯度下降更容易逃離局部最小值。
考慮并行運算,批量梯度下降花費的時間不一定更長;對于比較大的批量,計算
損失和梯度花費的時間不一定比使用小批量的計算時間長 。批量大小從 1 到 1000,需要耗費的時間幾乎是一樣的,因為在實際上 GPU 可以做并行運算,這 1000 筆數據是并行處理的,所以 1000筆數據所花的時間并不是一筆數據的 1000 倍。當然 GPU 并行計算的能力還是存在極限的,當批量大小很大的時候,時間還是會增加的。
因為有并行計算的能力,因此實際上當批量大小小的時候,要“跑”完一個回合,花的時間是比較大的
大的批量更新比較穩定,小的批量的梯度的方向是比較有噪聲的。但實際上有噪聲的的梯度反而可以幫助訓練
批量梯度下降在更新參數的時候,沿著一個損失函數來更新參數,走到一個局部最小值或鞍點顯然就停下來了。梯度是零,如果不看海森矩陣,梯度降就無法再更新參數了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一
個批量計算損失,所以每一次更新參數的時候所使用的損失函數是有差異的。選到第一個批量的時候,用 L1 計算梯度;選到第二個批量的時候,用 L2 計算梯度。假設用 L1 算梯度的時候,梯度是零,就會卡住。但 L2 的函數跟 L1 又不一樣,L2 不一定會卡住,可以換下個批量的損失 L2 計算梯度,模型還是可以訓練,還是有辦法讓損失變小,所以這種有噪聲的更新方式反而對訓練其實是有幫助的。
總結:
在有并行計算的情況下,小的批量跟大的批量運算的時間并沒有太大的差距。除非大的批量非常大,才會顯示出差距。但是一個回合需要的時間,小的批量比較長,大的批量反而是比較快的,所以從一個回合需要的時間來看,大的批量是較有優勢的。 而小的批量更新的方向比較有噪聲的,大的批量更新的方向比較穩定。但是有噪聲的更新方向反而在優化的時候有優勢,而且在測試的時候也會有優勢。所以大的批量跟小的批量各有優缺點,批量大小是需要去調整的超參數。
動量
動量法(momentum method)是另外一個可以對抗鞍點或局部最小值的方法
引入動量后,每次在移動參數的時候,不是只往梯度的反方向來移動參數,而是根據梯度的反方向加上前一步移動的方向決定移動方向。
η 是學習率,λ 是前一個方向的權重參數,也是需要調的
自適應學習率
要走到一個臨界點其實是比較困難的,多數時候訓練在還沒有走到臨界點的時候就已經停止了。
情景:梯度并沒有真的變得很小,但是損失不再下降了,如下圖的情況
學習率決定了更新參數的時候的步伐,學習率設太大,步伐太大就無法慢慢地滑到山谷里面,可以試著把學習率設小一點。
在梯度下降里面,所有的參數都是設同樣的學習率,這顯然是不夠的,應該要為每一個參數定制化學習率,即引入自適應學習率(adaptive learning rate)的方法,給每一個參數不同的學習率。如果在某一個方向上,梯度的值很小,非常平坦,我們會希望學習率調大一點;如果在某一個方向上非常陡峭,坡度很大,我們會希望學習率可以設得小一點。
AdaGrad(Adaptive Gradient)是典型的自適應學習率方法,其能夠根據梯度大小自動調整學習率。AdaGrad 可以做到梯度比較大的時候,學習率就減小,梯度比較小的時候,學習率就放大
RMSprop(Root Mean Squared propagation),同一個參數的同個方向,學習率也是需要動態調整的
Adam (Adaptive moment estimation),是最常用的優化的策略或者優化器(optimizer)。Adam 可以看作 RMSprop 加上動量,其使用動量作為參數更新方向,并且能夠自適應調整學習率。PyTorch 里面已經寫好了 Adam 優化器,這個優化器里面有一些超參數需要人為決定,但是往往用 PyTorch 預設的參數就足夠好了
學習率調度
加上自適應學習率以后,使用AdaGrad 方法優化的結果如圖所示。一開始優化的時候很順利,在左轉的時候,有 AdaGrad 以后,可以再繼續走下去,走到非常接近終點的位置。走到 BC 段時,因為橫軸方向的梯度很小,所以學習率會自動變大,步伐就可以變大,從而不斷前進。接下來的問題走到圖 中紅圈的地方,快走到終點的時候突然“爆炸”了
通過學習率調度(learning rate scheduling)可以解決這個問題。之前的學習率調整方法中 η 是一個固定的值,而在學習率調度中 η 跟時間有關。
學習率調度中最常見的策略是學習率衰減(learning rate decay),也稱為學習率退火(learning rate annealing)。隨著參數的不斷更新,讓 η 越來越小。
預熱,是讓學習率先變大后變小,至于變到多大、變大的速度、變小的速度是超參數。殘差網絡里面是有預熱的,在殘差網絡里面,學習率先設置成 0.01,再設置成 0.1,并且其論文還特別說明,一開始用 0.1 反而訓練不好。除了殘差網絡,BERT 和 Transformer 的訓練也都使用了預熱。
分類問題
引入獨熱向量來表示類
如果有三個類,標簽 y 就是一個三維的向量,比如類 1 是 [1, 0, 0]T,類 2 是 [0, 1, 0]T,類3 是 [0, 0, 1]T。如果每個類都用一個獨熱向量來表示,就沒有類 1 跟類 2 比較接近,類 1 跟類 3 比較遠的問題。如果用獨熱向量計算距離的話,類兩兩之間的距離都是一樣的
帶有 softmax 的分類
y 是獨熱向量,所以其里面的值只有 0 跟 1,但是 ?y 里面有任何值。既然目標只有 0 跟 1,但 ?y 有任何值,可以先把它歸一化到 0 到 1 之間,這樣才能跟標簽的計算相似度。
一般有兩個類的時候,我們不套 softmax,而是直接取 sigmoid。當只有兩個類的時候,sigmoid 和 softmax 是等價的。
分類問題損失函數
常用交叉熵,相較于均方誤差,交叉熵是被更常用在分類上
做分類時,選均方誤差的時候,如果沒有好的優化器,有非常大的可能性會訓練不起來。改變損失函數可以改變優化的難度。
批量歸一化
https://blog.csdn.net/grizzly_whisper/article/details/134250154
批量歸一化(Batch Normalization,通常簡稱為BatchNorm或BN)是一種用于深度神經網絡的正則化技術,旨在加速訓練并提高模型的穩定性和性能。它的主要思想是對每個批量的輸入進行歸一化,以使神經網絡的每一層保持穩定的統計分布。
批量歸一化的主要步驟包括:
1、對每個批量輸入進行均值和方差的計算:對于每個批量中的數據,計算其均值和方差,通常是在每個通道上進行的。
2、對輸入數據進行標準化:將輸入數據減去均值,并除以標準差,以使數據的分布接近標準正態分布。
3、縮放和平移:對標準化后的數據進行線性變換,將其縮放(乘以一個尺度參數)并平移(加上一個偏移參數),以允許模型學習適當的平移和縮放。
4、反向傳播:在訓練過程中,通過反向傳播來更新批量歸一化層的參數,以便網絡適應數據的分布。
批量歸一化的主要優點包括:
1、提高訓練速度:通過標準化輸入數據,批量歸一化有助于加速訓練,因為它減少了梯度下降的收斂時間,允許使用更大的學習率。
2、增強模型穩定性:批量歸一化可以減少訓練過程中的內部協變量偏移,從而提高模型的穩定性和魯棒性。
3、減少過擬合:批量歸一化作為正則化技術之一,可以減少模型的過擬合風險,因為它降低了網絡對訓練數據中微小變化的敏感性。
4、可以使模型更深:批量歸一化使得更深的神經網絡更容易訓練,因為它減少了梯度消失和梯度爆炸問題。