實戰:從零訓練線性回歸
Vibe Prompt
「使用 Adam Optimizer 從零訓練線性回歸,比較自實作的 Adam 與 sklearn 的結果。」
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
# 產生資料
X, y = make_regression(n_samples=1000, n_features=10, noise=10, random_state=42)
y = y.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 標準化
mean, std = X_train.mean(axis=0), X_train.std(axis=0)
X_train = (X_train - mean) / std
X_test = (X_test - mean) / std
# 自實作 Adam 訓練
def train_adam(X, y, lr=0.01, epochs=200):
m, n = X.shape
w = np.zeros((n, 1))
b = 0.0
m_w, v_w = np.zeros((n, 1)), np.zeros((n, 1))
m_b, v_b = 0.0, 0.0
beta1, beta2 = 0.9, 0.999
eps = 1e-8
losses = []
for t in range(1, epochs+1):
pred = X @ w + b
loss = np.mean((pred - y)**2)
losses.append(loss)
dw = (2/m) * X.T @ (pred - y)
db = (2/m) * np.sum(pred - y)
m_w = beta1*m_w + (1-beta1)*dw
v_w = beta2*v_w + (1-beta2)*dw*dw
m_b = beta1*m_b + (1-beta1)*db
v_b = beta2*v_b + (1-beta2)*db*db
m_w_hat = m_w / (1-beta1**t)
v_w_hat = v_w / (1-beta2**t)
m_b_hat = m_b / (1-beta1**t)
v_b_hat = v_b / (1-beta2**t)
w -= lr * m_w_hat / (np.sqrt(v_w_hat) + eps)
b -= lr * m_b_hat / (np.sqrt(v_b_hat) + eps)
return w, b, losses
w, b, losses = train_adam(X_train, y_train)
pred = X_test @ w + b
print(f"自實作 Adam R²: {r2_score(y_test, pred):.4f}")
# sklearn 比較
lr = LinearRegression()
lr.fit(X_train, y_train)
print(f"sklearn R²: {r2_score(y_test, lr.predict(X_test)):.4f}")
print(f"權重差異: {np.mean(np.abs(w.flatten() - lr.coef_)):.6f}")
本日總結
- ✅ 梯度下降原理
- ✅ Momentum / RMSProp / Adam
- ✅ SGD / Mini-Batch
- ✅ 自動微分引擎
- ✅ 從零訓練線性回歸
本章總結
- 理解核心概念與原理
- 掌握實作方法與技巧
- 熟悉常見問題與解決方案
- 能夠應用於實際專案
延伸閱讀
- 官方文件與 API 參考
- GitHub 開源專案範例
- 相關技術書籍與課程
- 社群討論與技術部落格
實作範例
基礎範例
# 本節提供一個完整的實作範例
# 讓你能夠將所學應用到實際專案中
步驟說明
- 初始化:設定開發環境與必要工具
- 資料準備:收集與整理所需資料
- 核心實作:實作主要功能與邏輯
- 測試驗證:確保功能正確運作
- 最佳化:調整效能與使用者體驗
常見錯誤
| 錯誤類型 | 可能原因 | 解決方法 | |---------|---------|---------| | 編譯錯誤 | 語法問題 | 檢查程式碼語法 | | 執行錯誤 | 環境問題 | 確認相依套件已安裝 | | 邏輯錯誤 | 演算法問題 | 逐步除錯與測試 | | 效能問題 | 效率問題 | 使用效能分析工具 |
程式碼範例
# 範例程式碼
import sys
def main():
# 主程式邏輯
print("Hello, World!")
if __name__ == "__main__":
main()
相關資源
- 官方文件
- API 參考手冊
- 開源專案範例
- 技術社群討論