大白話解釋
基本原理
-
初始化參數:首先,我們隨機初始化模型的參數,就像開始時我們不知道任何關于貓和狗的信息。
-
選擇一個樣本:然后,從我們的數據集中隨機選擇一個樣本(一張貓或狗的圖片)。
-
計算梯度:用選定的樣本來計算模型的梯度,這告訴我們如何調整參數以減小預測誤差。
-
更新參數:接下來,我們使用梯度信息來微調參數,以使模型更好地預測選定的樣本。
-
重復:然后,我們重復這個過程,不斷選擇不同的樣本并更新參數,直到我們認為模型已經足夠好地理解了數據。
詳細的公式解釋
-
θ是模型的參數。 -
α是學習率,它決定了參數更新的步長。 -
∇J(θ, xi, yi)是損失函數關于參數θ的梯度,它告訴我們如何調整參數以減小損失函數J(θ, xi, yi)。xi和yi是選定的訓練樣本。
利用Python/ target=_blank class=infotextkey>Python繪制示意圖
import numpy as np
# 模擬一個簡單的損失函數
def loss_function(theta):
return theta**2 + 2*theta + 1
# 損失函數的梯度
def gradient(theta):
return 2*theta + 2
# 初始化參數和學習率
theta = 3.0
learning_rate = 0.1
iterations = 10
# 繪制損失函數和參數更新過程
losses = []
for i in range(iterations):
loss = loss_function(theta)
losses.Append(loss)
plt.plot(theta, loss, 'ro') # 繪制當前參數和損失值
gradient_value = gradient(theta)
theta -= learning_rate * gradient_value # 更新參數
# 繪制損失函數曲線
theta_values = np.linspace(-2, 4, 100)
loss_values = loss_function(theta_values)
plt.plot(theta_values, loss_values, label='Loss Function')
plt.xlabel('Parameter (theta)')
plt.ylabel('Loss')
plt.legend()
plt.show()

再舉一個案例
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 模擬損失函數
def loss_function(x, y):
return x**2 + y**2
# 模擬梯度計算
def gradient(x, y):
dx = 2 * x
dy = 2 * y
return dx, dy
# 隨機梯度下降
def stochastic_gradient_descent(learning_rate, num_iterations):
history = []
# 隨機初始值
x, y = np.random.rand(2) * 10
for _ in range(num_iterations):
grad_x, grad_y = gradient(x, y)
x -= learning_rate * grad_x
y -= learning_rate * grad_y
history.append((x, y))
return np.array(history)
# 設置學習率和迭代次數
learning_rate = 0.1
num_iterations = 100
# 運行隨機梯度下降
sgd_history = stochastic_gradient_descent(learning_rate, num_iterations)
# 可視化損失函數
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = loss_function(X, Y)
# 創建3D圖形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 繪制損失函數表面
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
# 繪制隨機梯度下降路徑
sgd_x, sgd_y = zip(*sgd_history)
sgd_z = loss_function(np.array(sgd_x), np.array(sgd_y))
ax.plot(sgd_x, sgd_y, sgd_z, marker='o', color='r', linestyle='-')
# 設置圖形屬性
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Loss')
ax.set_title('Stochastic Gradient Descent')
plt.show()
