6.1 最優(yōu)化理論和深度學(xué)習(xí)
最優(yōu)化理論是計算機科學(xué)中一個重要的概念,它用于幫助我們找到最優(yōu)解(即最小或最大值)的算法。在深度學(xué)習(xí)中,最優(yōu)化理論用于幫助深度學(xué)習(xí)模型找到最優(yōu)解。深度學(xué)習(xí)模型常常有數(shù)百萬甚至上億個參數(shù),如果使用暴力枚舉的方法來尋找最優(yōu)解,時間成本將非常高。最優(yōu)化理論提供了一系列的最優(yōu)化算法,如隨機梯度下降(SGD)、動量法、RMSProp 和 Adam,用于幫助我們快速找到最優(yōu)解。
盡管密切聯(lián)系,但二者畢竟不是一回事,因此,先讓我們來看看它們之間的不同。
6.1.1 最優(yōu)化和深度學(xué)習(xí)的差異
最優(yōu)化和深度學(xué)習(xí)之間的不同點在于:
目標(biāo)不同:最優(yōu)化的目標(biāo)是找到使得某個目標(biāo)函數(shù)取得最優(yōu)解的參數(shù),而深度學(xué)習(xí)的目標(biāo)則是通過調(diào)整模型的參數(shù)來最小化損失函數(shù),使模型在新數(shù)據(jù)上的表現(xiàn)盡可能地好。換句話說,前者關(guān)注的訓(xùn)練誤差最小,而后者關(guān)注的是泛化誤差最小。
應(yīng)用領(lǐng)域不同:最優(yōu)化是一種通用的工具,可以應(yīng)用于各種領(lǐng)域。而深度學(xué)習(xí)是一種特定的機器學(xué)習(xí)技術(shù),常常用于解決圖像識別、語音識別、自然語言處理等問題。
實現(xiàn)方式不同:最優(yōu)化是一種算法,通常用數(shù)學(xué)形式來表示。而深度學(xué)習(xí)則是一種機器學(xué)習(xí)框架,常常使用深度學(xué)習(xí)框架如 PyTorch、TensorFlow 等來實現(xiàn)。
研究內(nèi)容不同:最優(yōu)化研究的是如何找到最優(yōu)解的算法,而深度學(xué)習(xí)研究的是如何使用多層神經(jīng)網(wǎng)絡(luò)來解決特定問題的方法。
6.1.2 訓(xùn)練誤差和泛化誤差
剛才我們提到關(guān)注訓(xùn)練誤差和泛化誤差是最優(yōu)化和深度學(xué)習(xí)之間一個比較大的差異。這其實還涉及到機器學(xué)習(xí)中“風(fēng)險”的概念,有必要區(qū)分一下。
在機器學(xué)習(xí)中,訓(xùn)練誤差、泛化誤差、經(jīng)驗風(fēng)險、風(fēng)險這幾個概念之間有著密切的關(guān)系。它們之間的區(qū)別如下:
訓(xùn)練誤差(Training Error):指模型在訓(xùn)練數(shù)據(jù)上的誤差,即使用訓(xùn)練數(shù)據(jù)計算的損失函數(shù)的值。
泛化誤差(Generalization Error):指模型在新數(shù)據(jù)上的誤差,即使用測試數(shù)據(jù)計算的損失函數(shù)的值。
經(jīng)驗風(fēng)險(Empirical Risk):指使用訓(xùn)練數(shù)據(jù)計算的損失函數(shù)的值,你可以簡單認(rèn)為這就是訓(xùn)練誤差的不同說法而已。
風(fēng)險(Risk):指使用真實數(shù)據(jù)計算的損失函數(shù)的期望值。
通常,深度學(xué)習(xí)中希望模型的泛化誤差盡可能小,但由于我們無法直接計算真實的風(fēng)險,因此只能通過訓(xùn)練數(shù)據(jù)估計經(jīng)驗風(fēng)險,并希望通過優(yōu)化經(jīng)驗風(fēng)險來最小化泛化誤差。在訓(xùn)練過程中,如果訓(xùn)練誤差很小而泛化誤差很大,則說明模型存在過擬合的問題,即模型過于復(fù)雜,無法很好地泛化到新的數(shù)據(jù)。因此,我們需要使用正則化技術(shù)來減小過擬合的風(fēng)險。
6.1.3 最優(yōu)化算法的主要問題及對策
本章咱們關(guān)注的是深度學(xué)習(xí)中的最優(yōu)化算法,而不是如何解決深度學(xué)習(xí)中的泛化誤差問題。這方面的內(nèi)容我們在上一章已經(jīng)講過一些,比如過擬合、欠擬合問題等,可以用正則化技術(shù),增加訓(xùn)練數(shù)據(jù)、減小模型復(fù)雜度等辦法解決。
在機器學(xué)習(xí)中,優(yōu)化算法的主要問題包括:
1. 局部最小值(Local Minimum)
如下圖所示,局部最小值指在某個局部區(qū)域內(nèi),目標(biāo)函數(shù)的值小于周圍所有點的值。局部最小值可能是全局最小值,也可能不是。局部最小值是機器學(xué)習(xí)模型訓(xùn)練中常見的問題。

舉例來說,在梯度下降算法中,我們需要不斷迭代調(diào)整模型參數(shù)來使損失函數(shù)的值不斷減小。然而,如果我們的模型存在局部最小值,則損失函數(shù)的值可能在某個點處停止減小,即使我們繼續(xù)迭代也不會得到更優(yōu)的結(jié)果。
為了解決這個問題,我們可以使用不同的優(yōu)化算法,例如隨機梯度下降算法或 Adam 算法。這些算法在每次迭代時使用隨機的梯度來調(diào)整模型參數(shù),從而避免局部最小值的出現(xiàn)。
另外,我們也可以使用訓(xùn)練數(shù)據(jù)的不同子集來訓(xùn)練模型,從而避免局部最小值的出現(xiàn)。
2. 鞍點(Saddle Point)

From wikipedia
如圖所示,鞍點(saddle point)是指在機器學(xué)習(xí)模型訓(xùn)練過程中,損失函數(shù)在某一點取得最小值或最大值,但是這個點不是全局最優(yōu)解。
鞍點是一種特殊的局部最小值,它在機器學(xué)習(xí)模型訓(xùn)練過程中也是常見的問題。當(dāng)模型遇到鞍點時,損失函數(shù)的值可能不再減小或不再增大,即使繼續(xù)訓(xùn)練模型也不會得到更優(yōu)的結(jié)果。
鞍點常常是由于模型的復(fù)雜度過高或者訓(xùn)練樣本數(shù)量過少造成的。例如,如果模型的復(fù)雜度過高,則模型可能會在訓(xùn)練數(shù)據(jù)集上表現(xiàn)得非常優(yōu)秀,但是在測試數(shù)據(jù)集上表現(xiàn)得很差,因為模型過度擬合訓(xùn)練數(shù)據(jù)。
為了解決鞍點問題,我們可以使用不同的優(yōu)化算法,例如隨機梯度下降算法或 Adam 算法。這些算法在每次迭代時使用隨機的梯度來調(diào)整模型參數(shù),從而避免鞍點的出現(xiàn)。解決鞍點問題的其他方法還包括:
減少模型的復(fù)雜度:通過減少模型中參數(shù)的數(shù)量或者使用正則化技術(shù)來降低模型的復(fù)雜度。這可以減少模型對訓(xùn)練數(shù)據(jù)的依賴,從而避免鞍點的出現(xiàn)。
使用更多的訓(xùn)練數(shù)據(jù):通過增加訓(xùn)練數(shù)據(jù)的數(shù)量來降低模型對訓(xùn)練數(shù)據(jù)的依賴,從而避免鞍點的出現(xiàn)。
使用隨機初始化:在訓(xùn)練模型之前,我們可以使用隨機初始化技術(shù)來隨機初始化模型參數(shù)。這可以避免模型被限制在某一個區(qū)域,從而避免鞍點的出現(xiàn)。
使用更多的超參數(shù)搜索:超參數(shù)是指在訓(xùn)練模型之前需要人為設(shè)定的參數(shù)。我們可以使用超參數(shù)搜索技術(shù)來自動調(diào)整超參數(shù)的值,從而找到最優(yōu)的模型設(shè)置。超參數(shù)搜索可以幫助我們找到較優(yōu)的模型設(shè)置,從而避免鞍點的出現(xiàn)。
使用分類器集成:分類器集成是指將多個分類器結(jié)合起來,通過投票或加權(quán)平均等方式得到最終的預(yù)測結(jié)果。分類器集成可以幫助我們減少單個分類器的偏差,從而避免鞍點的出現(xiàn)。
3. 梯度消失(Gradient Vanishing)
梯度消失是指在機器學(xué)習(xí)模型訓(xùn)練過程中,由于梯度太小而無法有效地更新模型參數(shù)的現(xiàn)象。這通常出現(xiàn)在使用深度神經(jīng)網(wǎng)絡(luò)時。它出現(xiàn)的原因是,在深度神經(jīng)網(wǎng)絡(luò)中,每一層的輸出都會傳遞到下一層,而這些輸出通常都是小于1的數(shù)。因此,當(dāng)輸入在多層神經(jīng)網(wǎng)絡(luò)中經(jīng)過多次計算后,其輸出會越來越小,從而導(dǎo)致梯度變得越來越小。如圖所示,sigmoid函數(shù)和它的導(dǎo)數(shù),可以看到x>4時,梯度就基本上為零了。

梯度消失會導(dǎo)致模型訓(xùn)練效果差,甚至無法訓(xùn)練。因此,我們需要采取一些措施來避免梯度消失的出現(xiàn)。解決梯度消失的方法包括:
更小的學(xué)習(xí)率:減小學(xué)習(xí)率可以減少梯度變化的幅度,從而避免梯度消失的出現(xiàn)。
激活函數(shù):使用激活函數(shù),如 ReLU 函數(shù),可以有效地緩解梯度消失問題。
殘差網(wǎng)絡(luò):殘差網(wǎng)絡(luò)可以通過跳過一些層來緩解梯度消失的問題。
批標(biāo)準(zhǔn)化:批標(biāo)準(zhǔn)化可以通過在每一層之前對輸入數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化來緩解梯度消失的問題。
梯度彌散:梯度彌散是指在每一層之前將輸入數(shù)據(jù)乘上一個小于 1 的數(shù),從而緩解梯度消失的問題。
4. 梯度爆炸(Gradient Explosion)
梯度爆炸是指在機器學(xué)習(xí)模型訓(xùn)練過程中,由于梯度過大而導(dǎo)致模型參數(shù)更新過快,使得模型訓(xùn)練效果變差的現(xiàn)象。這通常出現(xiàn)在使用深度神經(jīng)網(wǎng)絡(luò)時。
梯度爆炸的原因是,在深度神經(jīng)網(wǎng)絡(luò)中,每一層的輸出都會傳遞到下一層,而這些輸出通常都是小于 1 的數(shù)。因此,當(dāng)輸入在多層神經(jīng)網(wǎng)絡(luò)中經(jīng)過多次計算后,其輸出會越來越小,從而導(dǎo)致梯度變得越來越小。但是,如果使用的激活函數(shù)對輸入的影響過大,則梯度可能會變得越來越大,從而導(dǎo)致梯度爆炸的出現(xiàn)。例如,使用 sigmoid 函數(shù)作為激活函數(shù)時,當(dāng)輸入接近 0 或 1 時,梯度會變得非常小。但是,當(dāng)輸入接近 0 或 1 時,sigmoid 函數(shù)的導(dǎo)數(shù)會變得非常大,從而導(dǎo)致梯度爆炸的出現(xiàn)。
梯度爆炸會導(dǎo)致模型訓(xùn)練效果差,甚至無法訓(xùn)練。因此,我們需要采取一些措施來避免梯度爆炸的出現(xiàn)。例如:
更大的學(xué)習(xí)率:增大學(xué)習(xí)率可以增加梯度變化的幅度,從而避免梯度爆炸的出現(xiàn)。但是,過大的學(xué)習(xí)率也會導(dǎo)致模型訓(xùn)練效果變差,因此需要調(diào)整學(xué)習(xí)率的大小。
更多的數(shù)據(jù):使用更多的訓(xùn)練數(shù)據(jù)可以減少模型的泛化誤差,從而避免梯度爆炸的出現(xiàn)。但是,使用更多的數(shù)據(jù)也會增加訓(xùn)練時間,因此需要考慮數(shù)據(jù)的數(shù)量和訓(xùn)練時間的平衡。
更小的隱藏單元數(shù):使用更少的隱藏單元可以減少模型的復(fù)雜度,從而避免梯度爆炸的出現(xiàn)。但是,使用更少的隱藏單元也會導(dǎo)致模型的泛化能力下降,因此需要考慮隱藏單元數(shù)量和模型泛化能力的平衡。
使用正則化:使用正則化可以限制模型的復(fù)雜度,從而避免梯度爆炸的出現(xiàn)。正則化有多種方式,例如 L1 正則化、L2 正則化和 Dropout 等。
使用殘差網(wǎng)絡(luò):殘差網(wǎng)絡(luò)可以通過在每一層之間加入殘差連接來減少梯度消失和梯度爆炸的問題。殘差連接可以使每一層的輸出與輸入之間相加,從而減少梯度消失和梯度爆炸的問題。
解決辦法
這四個問題都會導(dǎo)致優(yōu)化算法無法找到最優(yōu)解。因此,需要使用一些技術(shù)來解決這些問題,例如使用 Adam 優(yōu)化算法、使用 Batch Normalization 等。這就是本章各種梯度下降算法及其變體研究的內(nèi)容了。咱們一個個來討論。
梗直哥提示:本章介紹的內(nèi)容主要是最優(yōu)化算法的問題及其解決方案,這和深度學(xué)習(xí)算法既密切聯(lián)系,又有所區(qū)別,要注意體會其中的異同,知道哪些問題是屬于哪個范疇的,要不特別容易弄混亂了。
