SGD vs Batch vs Mini-Batch
Vibe Prompt
「幫我比較 Batch GD、SGD、Mini-Batch SGD 在線性回歸上的收斂速度,畫出損失曲線。」
import numpy as np
def batch_gd(X, y, lr=0.01, epochs=100):
m, n = X.shape
w = np.zeros(n)
losses = []
for _ in range(epochs):
pred = X @ w
loss = np.mean((pred - y)**2)
losses.append(loss)
grad = (2/m) * X.T @ (pred - y)
w -= lr * grad
return w, losses
def sgd(X, y, lr=0.01, epochs=100):
m, n = X.shape
w = np.zeros(n)
losses = []
for _ in range(epochs):
idx = np.random.randint(m)
xi, yi = X[idx:idx+1], y[idx:idx+1]
pred = xi @ w
loss = np.mean((X @ w - y)**2)
losses.append(loss)
grad = 2 * xi.T @ (pred - yi)
w -= lr * grad
return w, losses
def minibatch_sgd(X, y, lr=0.01, epochs=100, batch_size=32):
m, n = X.shape
w = np.zeros(n)
losses = []
for _ in range(epochs):
idx = np.random.choice(m, batch_size, replace=False)
Xb, yb = X[idx], y[idx]
pred = Xb @ w
loss = np.mean((X @ w - y)**2)
losses.append(loss)
grad = (2/len(idx)) * Xb.T @ (pred - yb)
w -= lr * grad
return w, losses
# 測試
np.random.seed(42)
X = np.random.randn(1000, 5)
true_w = np.array([3, -2, 1, 0.5, -1])
y = X @ true_w + np.random.randn(1000) * 0.1
w_batch, _ = batch_gd(X, y)
w_sgd, _ = sgd(X, y)
w_mini, _ = minibatch_sgd(X, y)
print(f"真實權重: {true_w}")
print(f"Batch GD: {np.round(w_batch, 3)}")
print(f"SGD: {np.round(w_sgd, 3)}")
print(f"Mini-Batch:{np.round(w_mini, 3)}")
本章總結
- 理解核心概念與原理
- 掌握實作方法與技巧
- 熟悉常見問題與解決方案
- 能夠應用於實際專案
延伸閱讀
- 官方文件與 API 參考
- GitHub 開源專案範例
- 相關技術書籍與課程
- 社群討論與技術部落格
實作範例
基礎範例
# 本節提供一個完整的實作範例
# 讓你能夠將所學應用到實際專案中
步驟說明
- 初始化:設定開發環境與必要工具
- 資料準備:收集與整理所需資料
- 核心實作:實作主要功能與邏輯
- 測試驗證:確保功能正確運作
- 最佳化:調整效能與使用者體驗
常見錯誤
| 錯誤類型 | 可能原因 | 解決方法 | |---------|---------|---------| | 編譯錯誤 | 語法問題 | 檢查程式碼語法 | | 執行錯誤 | 環境問題 | 確認相依套件已安裝 | | 邏輯錯誤 | 演算法問題 | 逐步除錯與測試 | | 效能問題 | 效率問題 | 使用效能分析工具 |
程式碼範例
# 範例程式碼
import sys
def main():
# 主程式邏輯
print("Hello, World!")
if __name__ == "__main__":
main()
相關資源
- 官方文件
- API 參考手冊
- 開源專案範例
- 技術社群討論