目錄
一、模型訓練直觀圖
二、核心目標?
三、訓練過程詳解
3.1 訓練階段
1、準備起點:輸入數據 + 初始參數權重
2、模型嘗試預測:變換計算 (前向傳播)
3、檢查錯誤:計算損失值
4、學習的關鍵:反向傳播 + 梯度下降法 (調整權重)
5、循環迭代:模型訓練迭代過程
6、停止條件:損失值達標
3.2 訓練完成
7、模型測試
8、模型應用
四、圖解流程總結?
4.1 流程圖說明
4.2 關鍵特點
4.3 關鍵點記住
五、訓練模型代碼示例
5.1 執行代碼
5.2 運行結果
5.3 圖示結果
5.4 關鍵點對應關系
一、模型訓練直觀圖
二、核心目標?
讓模型學會從“輸入數據”準確預測“輸出結果”。
三、訓練過程詳解
3.1 訓練階段
1、準備起點:輸入數據 + 初始參數權重
-
輸入數據:?這是模型學習的“教材”。例如:一堆貓和狗的圖片(特征:像素值、顏色等)。
-
參數權重:?模型內部的“調節旋鈕”。訓練開始時,這些權重是隨機初始化的(就像給模型一個隨機的猜測起點)。這些權重決定了輸入數據如何被組合、轉換。
2、模型嘗試預測:變換計算 (前向傳播)
-
模型使用當前的權重參數,對輸入的一批數據進行計算。
-
這個計算過程(可能是復雜的數學公式或神經網絡層)將輸入數據“變換”成一個預測輸出。
-
例子:?模型看到一張圖片(輸入),經過當前權重計算后,輸出一個預測:“這張圖有70%概率是貓,30%概率是狗”。
3、檢查錯誤:計算損失值
-
真實標簽:?每個輸入數據對應的正確答案(Ground Truth)。例子:?剛才那張圖其實是一只貓(標簽是“貓”)。
-
損失值:?一個衡量預測輸出與真實標簽之間差距(錯誤程度)的數值。常見的損失函數如均方誤差(回歸)、交叉熵(分類)。
-
例子:?模型預測“貓70%,狗30%”,真實是“貓100%”。損失函數會計算出一個值(比如0.36),表示這個預測的“錯誤成本”。目標就是讓這個損失值盡可能小!
4、學習的關鍵:反向傳播 + 梯度下降法 (調整權重)
-
反向傳播:?這是模型“反思錯誤”的過程。算法會從輸出層向輸入層反向計算,精確地找出每一個權重參數對最終的損失值應該負多大責任。它計算的是損失值相對于每個權重的梯度。
-
梯度下降法:?利用計算出的梯度信息來更新權重參數。
-
梯度:?指向損失值增加最快的方向。
-
下降:?我們要讓損失值減小,所以更新權重時,要沿著梯度的反方向移動一小步。
-
學習率:?一個超參數,控制每次更新權重時移動的“步長”有多大。太小學習慢,太大可能跳過最優解。
-
-
核心動作:?
新權重 = 舊權重 - 學習率 * 梯度
-
結果:?經過這次更新,模型在下一次遇到類似輸入時,預測結果應該更接近真實標簽(損失值應該更小)。
5、循環迭代:模型訓練迭代過程
-
步驟 2 -> 3 -> 4 會在一批又一批的數據上反復進行。
-
每一次完整的循環(遍歷完所有訓練數據一次)稱為一個?Epoch。
-
在一個 Epoch 中,數據通常被分成更小的批次(Batch)?進行訓練(步驟2-4在Batch上進行)。
-
隨著迭代的進行,模型的權重參數被不斷調整優化,損失值總體趨勢是逐漸下降的。
6、停止條件:損失值達標
-
訓練不會無限進行下去。停止條件通常包括:
-
損失值降低到某個可接受的閾值以下。
-
損失值在連續幾個 Epoch 內不再顯著下降(收斂)。
-
達到預設的最大 Epoch 數。
-
-
此時,我們認為模型在訓練數據上已經“學得差不多了”,權重參數基本穩定。
3.2 訓練完成
7、模型測試
-
使用訓練階段從未見過的新數據(測試集)來評估訓練好的模型的真實泛化能力。
-
計算模型在測試集上的損失值或準確率等指標。這才是模型性能的真實反映,避免模型只是“死記硬背”了訓練數據(過擬合)。
8、模型應用
-
當模型通過測試,性能滿足要求后,就可以投入實際使用。
-
輸入新的、未知的數據,模型利用訓練好的權重參數進行計算,輸出預測結果。
四、圖解流程總結?
4.1 流程圖說明
1、訓練初始化:
輸入數據(特征)
隨機初始化權重參數
2、前向傳播(Forward Propagation):
數據通過模型計算
生成預測輸出
# 偽代碼示例 predictions = model(input_data, weights)
3、損失計算:
比較預測輸出與真實標簽
計算損失值(如均方誤差、交叉熵等)
loss = loss_function(predictions, true_labels)
4、停止條件判斷:
檢查損失是否達標(足夠小)
或達到最大迭代次數
5、反向傳播(Backpropagation):
計算損失對每個權重的梯度
確定權重調整方向和幅度
gradients = calculate_gradients(loss, weights)
6、權重更新:
使用梯度下降法更新權重
學習率控制更新步長
weights = weights - learning_rate * gradients
7、迭代循環:
重復前向傳播→損失計算→反向傳播→權重更新
直到損失達標
8、模型部署:
使用測試集評估模型性能
部署模型進行實際預測
4.2 關鍵特點
循環結構:核心訓練過程形成閉環,持續迭代優化
雙向箭頭:前向傳播(數據流動)與反向傳播(梯度流動)方向相反
停止條件:當損失足夠小時跳出循環
分離階段:訓練/測試/應用三個階段清晰區分
這個流程圖展示了機器學習"通過數據自動調整參數"的本質:模型通過反復試錯(前向計算),評估錯誤(損失計算),然后修正錯誤(反向傳播更新權重),最終獲得預測能力。
4.3 關鍵點記住
-
前向傳播:?輸入 -> 權重計算 -> 輸出預測。
-
損失函數:?量化預測與真實的差距。
-
反向傳播:?找出每個權重對損失應負的責任(計算梯度)。
-
梯度下降:?沿著減少損失的方向更新權重(梯度反方向)。
-
迭代:?反復進行前向、計算損失、反向傳播、更新權重。
-
測試與應用分離:?訓練好的模型必須用新數據測試和應用,確保學到的知識是通用的。
這個過程就像教一個學生:給他題目(輸入)和初始思路(權重),他嘗試解題(預測),老師批改對錯(計算損失),分析錯誤原因(反向傳播),學生根據反饋修正思路(梯度下降更新權重),不斷練習(迭代),直到考試合格(損失達標),然后參加真正的考試(模型測試)并最終工作(模型應用)。
五、訓練模型代碼示例
5.1 執行代碼
這個示例完整展示了機器學習模型訓練的整個生命周期,從數據準備到模型應用,每一步都有清晰的代碼實現和可視化展示。
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np# ==== 解決中文顯示問題 ====
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑體
plt.rcParams['axes.unicode_minus'] = False # 顯示負號# =====================
# 1. 準備數據(輸入數據 + 真實標簽)
# =====================
# 創建 y = 2x + 1 的線性數據,加入隨機噪聲
np.random.seed(42)
x = np.linspace(0, 5, 100)
y = 2 * x + 1 + np.random.normal(0, 0.5, 100)# 轉換為PyTorch張量
inputs = torch.tensor(x, dtype=torch.float32).unsqueeze(1)
labels = torch.tensor(y, dtype=torch.float32).unsqueeze(1)# =====================
# 2. 初始化模型參數(權重和偏置)
# =====================
class LinearRegression(nn.Module):def __init__(self):super().__init__()# 隨機初始化權重參數 (類似 y = wx + b)self.weights = nn.Parameter(torch.randn(1))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):# 前向傳播計算:變換計算return self.weights * x + self.biasmodel = LinearRegression()
print(f"初始參數: w={model.weights.item():.3f}, b={model.bias.item():.3f}")# =====================
# 3. 設置訓練參數
# =====================
learning_rate = 0.01 # 學習率
epochs = 100 # 訓練輪數
loss_function = nn.MSELoss() # 均方誤差損失函數
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 梯度下降優化器# 記錄訓練過程
loss_history = []# =====================
# 4. 訓練迭代過程
# =====================
for epoch in range(epochs):# 前向傳播:計算預測輸出predictions = model(inputs)# 計算損失值loss = loss_function(predictions, labels)loss_history.append(loss.item())# 反向傳播:計算梯度loss.backward()# 梯度下降法:調整權重optimizer.step()# 清空梯度optimizer.zero_grad()# 每10輪打印進度if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')# =====================
# 5. 檢查訓練結果
# =====================
print(f"\n訓練后參數: w={model.weights.item():.3f}, b={model.bias.item():.3f}")
print(f"真實參數: w=2.0, b=1.0")# 可視化訓練過程
plt.figure(figsize=(12, 4))# 損失曲線
plt.subplot(1, 2, 1)
plt.plot(loss_history)
plt.title('訓練損失變化')
plt.xlabel('迭代次數')
plt.ylabel('損失值')
plt.grid(True)# 擬合結果
plt.subplot(1, 2, 2)
plt.scatter(x, y, label='原始數據', alpha=0.6)
plt.plot(x, model(inputs).detach().numpy(), 'r-', lw=2, label='擬合直線')
plt.title('線性回歸擬合結果')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()# =====================
# 6. 模型測試與應用
# =====================
# 測試新數據
test_x = torch.tensor([1.5, 3.5, 4.8], dtype=torch.float32).unsqueeze(1)
predictions = model(test_x)print("\n模型測試:")
for i in range(len(test_x)):true_y = 2 * test_x[i].item() + 1pred_y = predictions[i].item()print(f"輸入 x={test_x[i].item():.1f}, 預測值={pred_y:.2f}, 真實值={true_y:.2f}")
5.2 運行結果
輸出效果
初始參數: w=-0.205, b=0.783
Epoch [10/100], Loss: 1.3883
Epoch [20/100], Loss: 0.2775
Epoch [30/100], Loss: 0.2533
Epoch [40/100], Loss: 0.2485
Epoch [50/100], Loss: 0.2445
Epoch [60/100], Loss: 0.2409
Epoch [70/100], Loss: 0.2376
Epoch [80/100], Loss: 0.2346
Epoch [90/100], Loss: 0.2318
Epoch [100/100], Loss: 0.2293訓練后參數: w=1.917, b=1.229
真實參數: w=2.0, b=1.0模型測試:
輸入 x=1.5, 預測值=4.10, 真實值=4.00
輸入 x=3.5, 預測值=7.94, 真實值=8.00
輸入 x=4.8, 預測值=10.43, 真實值=10.60
5.3 圖示結果
?
5.4 關鍵點對應關系
代碼部分 | 流程圖步驟 |
---|---|
model(inputs) | 變換計算(前向傳播) |
loss_function() | 計算損失值 |
loss.backward() | 反向傳播(計算梯度) |
optimizer.step() | 梯度下降(更新權重) |
訓練循環 | 模型訓練迭代過程 |
損失值監測 | 損失值達標判斷 |
新數據預測 | 模型測試與應用 |