1. 梯度下降法
1.1 梯度下降法的算法思路
算法目的:找到(損失)函數的最小值以及相應的參數值。從而找到最小的損失函數。
梯度下降法:通過模擬小球滾動的方法來得到函數的最小值點。

小球會根據函數形狀找到一個下降方向不停的滾動,它的高度一直是下降的。隨着時間的推移,小球會滾到底,從而找到最小值點。
但是梯度下降法不能保證到達最小值點,也有可能到達 鞍點 (這一點的梯度為0)或者 極小值點。
1.2 梯度下降法的數學細節(泰勒級數)
損失函數等於每一點的損失之和,就如之前所將的 線性回歸 和 邏輯回歸(交叉熵)。

損失函數在模型訓練的時候, Yi 和 Xi 都是給定的,所以損失函數是一個以 模型參數β 為變量的函數。我們要找的也是 模型參數β 的估計值。在此基礎上,進一步假設損失函數對於模型參數都是可微的。在現實生活中,有的時候有的模型對於模型參數不是可微的。但是我們總可以通過一些數學上的近似方法,使其變成模型參數是可微的。這樣才能在數學上比較好處理。
泰勒展開式描述了函數在某一點的值跟它附近的值之間的關系。具體來說,我們想計算函數在 β1 到 βn 的值。那么可以在附近找一點 a1 到 an ,所以 β1 到 βn 這一點的損失函數的值就約等於 a1 到 an 這一點的值再加上損失函數的梯度(一階偏導)乘以兩點之間的距離。

公式中的損失函數的梯度(一階偏導)可以展開為 每一點的一階偏導的和再乘 1/n 。

從這里可以看出計算量是很大的,至少要做 n 次加法才能得到這個值。所以后面才會引入 隨機梯度下降法 來簡化計算。
舉一個具體的例子來推導梯度下降法。
假設一個線性回歸模型,它的損失函數為

首先隨機選取損失函數上的點作為起點(a0, b0),希望看(a0, b0)的附近,我們如何能找到一個點,這個點相對於(a0, b0)來說是它的函數值下降的。假設我們找到的點是(a1, b1),這兩個函數值相減就是 ΔL 。如果我們希望(a1, b1)相對於(a0, b0)來說是它的函數值下降的。那么 ΔL 小於 0。
![]()
借助泰勒展開式,將右面移到左面可以得到 ΔL。

所以 ΔL 等於:

如果令:

那么將 Δa 和 Δb 帶回 ΔL:

所以,就可以定義 a , b 的迭代公式。

通過繼續分析迭代公式,我們可以知道 γ 是學習速率,決定每次迭代參數值移動的步伐大小。它必定是大於0的值。否則就不滿足 ΔL 小於 0。

為什么說它決定了移動的方向呢,如 1 點,它在一個遞減函數上,所以按照迭代公式,γ 后面的一堆是小於 0 的。又由於 γ 大於0,所以 ak 減去負數,相當於加一個正數,所以 1點 下一步要向右移動。2 點同理。

而且在數學上可以證明,沿着梯度下降,是函數值下降最快的方向。
1.3 梯度下降法的注意事項
1.3.1 學習速率不能過大
依然如點1為例,如果學習速率過大(步長過大),那么它就會跨過最小值點到達2點。2點也會跨過最小值到3點。3點也會跨過最小值到4點。這樣會遇到參數值左右搖擺,但就是不下降的情況。
從數學上來說,梯度下降法依賴的是 泰勒展開式,泰勒展開式 中的約等於是在函數的局部成立的。如果局部被擴的比較大,那么偏差也就比較大。所以學習速率不能過大,這樣泰勒展開式的精度更高,梯度下降法效果更好。

1.3.2 局部最優和全局最優
以 1點 為例,梯度下降法只能經過 點2 然后到達 點3。點3 的梯度是為0的。所以就停止了迭代。這樣只能找到局部最優。
為了解決這個問題,我們可以選擇 點4 為起點進行梯度下降法。

在實際運用中,如果我們使用梯度下降法,通常會隨機選取若干起點,同時運用梯度下降法進行下降,每一個起點都會得到一個它認為的全局最低點。然后再比較這些 “全局最低點”,從中選出最低的點,那么這個點就作為最終的結果。
1.3.3 鞍點和山谷
鞍點和山谷是梯度下降法很怕遇到的。
鞍點:在這點的梯度等於0,但並不是極小值點。所以梯度下降法將會停止迭代。不會得到極小值點。

山谷:在一個狹長的區域內,梯度幾乎等於0,但兩邊的梯度絕對值很大。下圖深藍色的一環就是這種情況。

這兩點到目前為止沒有特別好的解決方法,但是后面會講針對這種情況的優化改良算法。
2. 隨機梯度下降法
2.1 隨機梯度下降法
正如 1.2 部分所說,梯度下降法面對大量的數據,速度會變得很慢。下面是梯度下降法的回顧。

總結一下,由於損失函數的梯度等於各點梯度的平均值,這導致了:
1. 計算開銷大。2. 面對大量的訓練數據時,幾乎不可用梯度下降法。
所以,現實生活中,一般都使用隨機梯度下降法。為了提高效率,在隨機梯度下降法中,使用小批量的數據的梯度平均值代替損失函數的梯度。

在這里和統計學的應用類似,比如說我們要統計所有中國人的平均年齡。由於中國人太多了,所以隨機抽樣100萬人,然后求這100萬人的平均年齡。這樣近似代替中國人的平均年齡。雖然是有誤差的,但是這個誤差也是很小的,效率的提升是極大的。
所以根據這個思路,我們得到了隨機梯度下降法的迭代公式:

在實現隨機梯度下降法時,會引入兩個超參數。batch_size(公式中的 m ),epoch(所有數據循環的上限)。同時,需要注意的是,在極限的情況下,可以使用一個數據點的梯度代替損失函數的梯度,也就是說m可以是等於1的。當 m = 1 的時候,稱為 Mini-Batch Gradient Descent。
2.2 隨機梯度下降法的缺陷和改進
2.2.1 隨機梯度下降法的缺陷
隨機梯度下降法面對的主要困難在於,它的梯度估計並不穩定,下降路徑時常“彎彎曲曲”。
隨機梯度下降法的梯度是近似值,與真實值是有誤差的,雖然我們認為這個誤差是比較小的,但是在特定條件下可能會引起整個算法的下降效率變差。
梯度下降法(GD)可以准確地計算每一點的梯度,所以它的下降是比較直接的(紅色)。但是對於隨機梯度下降法(SGD),因為它的梯度估計有誤差,所以真實的下降路線是彎彎曲曲的。它需要的迭代次數也會比梯度下降法更高,雖然它每一次迭代比梯度下降法需要的時間更短。
總結一下,隨機梯度下降法中,函數梯度的估計值並不穩定,遇到 鞍點 和 山谷 時,隨機梯度下降法的效果很差。
2.2.2 隨機梯度下降法的改進(動量方法)
在隨機梯度下降法中,根據遞推公式,它每次的迭代都只與這次迭代的起點的梯度相關,跟上次是無關的。這並不是很合理。
動量方法模擬了物理中的慣性作用:
1. 上一次迭代的改變量視為速度。2. 這次迭代的梯度視為加速度。
它的公式及參數說明如下:

使用這樣的方法去迭代,從實踐上證明,它通常會比梯度下降法和隨機梯度下降法的下降效率高很多。
2.2.3 隨機梯度下降法的改進(Adam方法)
它不僅僅保留了 2.2.2章節中動量方法的“慣性作用”,並在此基礎上,增加了如下作用:
對於歷史梯度較小的模型參數,放大當前的更新步伐(步長);反之,則變小。

我們可以認為 mk 代表了速度。vk 與 mk 的差別在於 gk 的平方,這里的平方在於,我們想衡量歷史上梯度的絕對值的大小。當 vk 特別大的時候,就需要減少 mk 的值。否則,將放大 mk 的值。結合這兩點就得到了模型參數的估計公式 ak+1 。這里的 ε 就是工程上的處理,主要為了處理 vk = 0的情況,這種情況下會變得無法計算。
另外,遞推公式里用的 mk帽子 和 vk帽子 是 mk 和 vk 處理之后得到的。

做這種處理的目的在於,我們希望 mk帽子 的期望是等於 gk 的期望,vk帽子 的期望是等於 gk平方 的期望。如果我們將 mk 和 vk 展開之后可以得到
![]()
因此,我們做了上面的帽子修正。就使得期望成立。從數學上來說公式更加完美,從實踐上來說梯度的下降效率和下降精度都會有所提高。
