04.5-梯度下降法
梯度下降法(Gradient Descent)#
梯度下降法是一種最優化算法,用於尋找函數的最小值(或最大值)。在機器學習和深度學習中,梯度下降法常用來最小化損失函數,從而訓練模型。其核心思想是沿著函數的梯度方向,逐步調整參數,以達到最小損失。
梯度下降法可以看作是一個在數學空間中“下坡”的過程,每一步都選擇在當前點的梯度方向上走,以求找到最優解。
1. 基本概念#
假設我們有一個可微的損失函數 \(L(\theta)\) ,其中 \(\theta\) 是我們的模型參數。梯度下降法的目標是通過最小化損失函數 \(L(\theta)\) 來找到一組最優的參數。
梯度下降法的步驟:#
- 初始化參數:隨機選擇或基於某些策略初始化模型參數 \(\theta\) 。
- 計算梯度:對損失函數 \(L(\theta)\) 計算其相對於參數 \(\theta\) 的梯度(即一階導數): [ \nabla_{\theta} L(\theta) ]
- 更新參數:根據梯度下降的更新規則,調整參數: [ \theta_{\text{new}} = \theta_{\text{old}} - \eta \nabla_{\theta} L(\theta) ] 其中 \(\eta\) 是學習率,決定了每次更新的步長。
- 重複:重複步驟2和3,直到損失函數的值收斂到最小或達到預設的停止條件(如最大迭代次數或梯度變化小於某個閾值)。
2. 梯度下降的類型#
根據每次更新中使用的數據量,梯度下降法有幾種不同的變體:
- 批量梯度下降(Batch Gradient Descent):
- 每次更新參數時,使用所有的訓練數據來計算梯度。對於每次迭代,計算整個訓練集的梯度,這樣可以確保每步更新都是精確的。
- 優點:每一步更新的方向比較準確。
-
缺點:當訓練集非常大時,每次更新所需的計算量較大,且可能導致計算緩慢。
-
隨機梯度下降(Stochastic Gradient Descent, SGD):
- 每次更新參數時,只使用一個訓練樣本來計算梯度。
- 優點:每次更新的計算量少,更新速度較快,並且每次迭代後都能得到一個新的參數。
-
缺點:由於隨機性強,每次更新的方向較為隨機,可能會導致參數更新不穩定,且需要更多的迭代次數來收斂。
-
小批量梯度下降(Mini-Batch Gradient Descent):
- 每次更新時,使用訓練集的隨機小批量(例如,32個樣本、64個樣本等)來計算梯度。
- 優點:結合了批量梯度下降和隨機梯度下降的優點,減少了計算量,同時保持了更新的穩定性。
- 是深度學習中最常見的選擇。
3. 學習率#
學習率 \(\eta\) 是梯度下降中的一個非常重要的超參數。它決定了每次參數更新的步長。如果學習率過大,可能會使得梯度更新過度,導致在最小值附近震盪或錯過最小值;如果學習率過小,則收斂速度會變得非常慢,可能需要大量的迭代。
為了克服學習率選擇的困難,現在有一些改進的算法,如自適應學習率算法(例如 Adam、Adagrad、RMSprop 等),可以根據歷史梯度信息自動調整學習率。
4. 優化過程中的問題#
- 局部最小值:梯度下降法可能會停留在局部最小值,而不是全局最小值,尤其是對於非凸函數。在深度學習中,由於損失函數往往是非凸的,這是一個常見問題。
- 鞍點(Saddle Point):有時,梯度下降可能會停留在鞍點,這些點的梯度為零,但並不是局部最小值。這會使得算法收斂速度變慢。
- 梯度消失與爆炸:在某些情況下,尤其是深度神經網絡中,梯度可能會非常小(梯度消失)或非常大(梯度爆炸),導致無法有效更新參數。
5. 梯度下降法的應用#
梯度下降法被廣泛應用於機器學習和深度學習中,尤其是用來訓練神經網絡。它是一種通用的最優化工具,可以應用於各種回歸問題、分類問題和其他複雜的優化問題。
6. 梯度下降法的Python實現#
以下是使用Python實現的一個簡單的梯度下降法來最小化二次函數 \(f(x) = (x - 3)^2\) :
import numpy as np
# 定義目標函數
def objective_function(x):
return (x - 3)**2
# 計算目標函數的導數(梯度)
def gradient(x):
return 2 * (x - 3)
# 梯度下降法
def gradient_descent(learning_rate=0.1, max_iterations=100, tolerance=1e-6):
# 隨機初始化
x = np.random.randn()
iteration = 0
while iteration < max_iterations:
grad = gradient(x)
new_x = x - learning_rate * grad # 參數更新
# 如果更新的變化很小,則停止
if abs(new_x - x) < tolerance:
break
x = new_x
iteration += 1
return x
# 執行梯度下降
optimal_x = gradient_descent()
print(f"最優解: {optimal_x}")
解釋:#
- 目標函數:這裡使用的是簡單的二次函數 \(f(x) = (x - 3)^2\) ,其最小值在 \(x = 3\) 。
- 梯度計算:
gradient(x)函數計算目標函數對 \(x\) 的一階導數,即梯度。 - 梯度下降過程:每次根據當前的梯度更新參數 \(x\) ,直到收斂(當參數變化小於某個閾值)。
7. 總結#
梯度下降法是一種常見的最優化方法,廣泛應用於機器學習和深度學習領域。它簡單有效,但在實際應用中,需要選擇適當的學習率和處理一些可能的問題,如局部最小值、鞍點、梯度消失等。