在前幾天的學習中,我們先認識了資料如何透過前向傳播進入神經網路,
然後再由反向傳播利用梯度來修正模型參數。
到這裡,我們已經知道模型的「學習」過程,
就是不斷地讓參數朝向能降低損失的方向調整。
然而,還有一個關鍵問題需要解答:我們應該「一次走多大步」?
這個「步伐大小」就是學習率 (Learning Rate)。
而這個步伐又是透過一種稱為梯度下降 (Gradient Descent) 的方法逐步實現的。
在今天的主題中,我們就要來理解神經網路是如何一步一步走向最佳化的。
學習率是一個超參數 (Hyperparameter),在訓練過程中控制模型更新的速度。
它的功能很單純:當我們計算出梯度之後,
模型需要依照這個方向修正權重,而修正的「幅度」就由學習率決定。
我自己喜歡把它比喻成「找東西的過程」,
如果一個東西掉在路途中,你可以用跑的對路徑迅速搜索,
但也可能會因為速度過快而 miss 掉東西的實際位置;
同樣的,慢慢走你可能會找的到,但所要花的時間可能就非常長。
學習率太大,就像是每一步跨太大,雖然可能一下子就找到我的耳機,
但也很容易因為步伐過猛而錯過最佳解,甚至在路徑之間反覆穿梭,但就是找不到。
學習率太小,就像是每一步都小心翼翼地移動,雖然方向正確,但速度非常慢,
可能需要花上幾百甚至幾千次迭代才能接近實際位置。
而學習率適中,則能兼顧速度與穩定性,既能有效率地收斂,又不會在最佳解附近失控。
因此,學習率是影響模型能否順利學會的重要因素。
梯度下降是一種最常見的最佳化演算法,用於最小化損失函數 (Loss Function)。
它的核心概念是:每次更新模型參數時,都沿著損失函數下降最快的方向前進。
在數學上,這個「最快下降的方向」就是梯度的負方向。
梯度 (Gradient) 可以理解為一個向量,表示損失函數在某個位置的斜率。
當我們依照這個斜率調整參數,就能逐步讓損失值變小。
用我比喻大師的方式來描述這個概念的話:
我會把損失函數比喻成一個山丘地形,而我們的目標就是要走到山谷的最低點(往下走)。
梯度就是告訴我們當前位置的斜坡往哪裡傾斜的導航,
而根據它給予的指示,只要沿著這個方向走下去
就是最快下降的路徑。
而透過不斷更新,我們最終就能走到山下,也就是損失函數的最小值。
而在實際應用中,梯度下降有三種常見的形式,它們主要差異在於更新時所使用的資料量,
以下我就稍微對這些形式做簡單的介紹:
在每次更新時,批次梯度下降都使用整個訓練資料集來計算梯度。
它的的主要優勢在於它通常會收斂到全域最小值,也就是模型的最優參數集。
然而,剛剛也有講到因為它會搜索整個資料集,也就是整個訓練資料集都儲存在記憶體中,
因此它需要大量內存,並且計算大型資料集的梯度可能會很慢
隨機梯度下降就是一次跑一個樣本,接著算出一次梯度或是小批次梯度的平均後就更新一次,
那又跟隨機有什麼關係呢?
這是因為剛剛講到「一次跑一個樣本」中的樣本是「隨機抽取」的,
所以我們才會稱它為隨機梯度下降法。
隨機梯度下降的優點是更新速度相對快,並且因為有隨機性,
容易跳脫局部最佳解,而可能找到真的最佳解。
缺點是更新過程不穩定,畢竟不是有順序的抽取,因此損失值的變化會顯得很「抖動」。
而「小批次梯度下降」則就是綜合上面兩個方法後的最佳解法。
小批量梯度下降法兼具批量梯度下降法和隨機梯度下降法的優點,
它在每次更新時會使用一小批資料 (例如 32 或 64 筆)。
也因為它只需在內存中存儲一小部分訓練數據,因此所需內存比批量梯度下降法更少。
除此之外,由於它只需處理幾個樣本即可開始更新模型參數,
因此速度也比批量梯度下降法更快。
同時,由於它一次會考慮多個樣本,因此與隨機梯度下降法相比,它也降低了參數更新的變異數。
小批次梯度下降也是目前深度學習中最常用的方法。
參考資料:
https://roger010620.medium.com/%E5%B8%B8%E8%A6%8B%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95gradient-descent-gd-sgd-min-batch-sgd-momentum-adagrad-rmsprop-adam-677121793d12
https://www.reddit.com/r/datascience/comments/11nev6x/batch_vs_stochastic_gradient_descent/?tl=zh-hant
https://medium.com/@SaltDataLabs/mastering-machine-learning-the-differences-between-batch-and-stochastic-gradient-descent-7ac4ece3d5af
學習率與梯度下降的關係非常緊密。
梯度下降告訴我們「該往哪個方向更新」,
而學習率則告訴我們「每一步更新的幅度」。這兩者缺一不可:
沒有梯度,就不知道方向。
而沒有學習率,就不知道該走多少。
這也是為什麼在神經網路訓練的過程中,
調整學習率往往是最敏感、最重要的超參數之一。