前向傳播(Forward Propagation)實現詳解
前向傳播是神經網絡中數據從輸入層流向輸出層的過程,通過逐層計算每一層的輸出,最終得到預測結果。以下是其實現原理和步驟的完整解析:
1. 前向傳播的核心步驟
(1) 線性變換(Linear Transformation)
對輸入數據 (\mathbf{X}) 進行加權求和并加上偏置:
(2) 激活函數(Activation Function)
對線性變換結果應用非線性激活:
(3) 逐層傳遞
重復上述步驟,直到輸出層:
[
\text{輸入層} \rightarrow \text{隱藏層1} \rightarrow \dots \rightarrow \text{輸出層}
]
2. 數學公式示例(以3層網絡為例)
假設網絡結構為:輸入層 → 隱藏層(ReLU)→ 輸出層(Softmax):
3. 代碼實現(Python + NumPy)
(1) 定義激活函數
import numpy as npdef relu(z):return np.maximum(0, z)def softmax(z):exp_z = np.exp(z - np.max(z, axis=1, keepdims=True)) # 防溢出return exp_z / np.sum(exp_z, axis=1, keepdims=True)
(2) 初始化參數
input_size = 784 # 輸入維度(如MNIST圖像展平后)
hidden_size = 128 # 隱藏層神經元數
output_size = 10 # 輸出類別數(如10分類)# 隨機初始化權重和偏置
W1 = np.random.randn(input_size, hidden_size) * 0.01
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size) * 0.01
b2 = np.zeros((1, output_size))
(3) 前向傳播實現
def forward_propagation(X, W1, b1, W2, b2):# 隱藏層計算z1 = np.dot(X, W1) + b1a1 = relu(z1)# 輸出層計算z2 = np.dot(a1, W2) + b2y_pred = softmax(z2)return y_pred, {"z1": z1, "a1": a1} # 緩存中間結果(用于反向傳播)# 示例輸入(假設X是100張784維的MNIST圖像)
X = np.random.randn(100, input_size)
y_pred, cache = forward_propagation(X, W1, b1, W2, b2)
print("預測結果形狀:", y_pred.shape) # 輸出 (100, 10)
4. 關鍵細節與注意事項
(1) 維度一致性檢查
- 輸入 (\mathbf{X}) 形狀:
(batch_size, input_size)
。 - 權重 (\mathbf{W}^{(l)}) 形狀:
(上一層神經元數, 當前層神經元數)
。 - 偏置 (\mathbf{b}^{(l)}) 形狀:
(1, 當前層神經元數)
(廣播機制自動擴展)。
(2) 激活函數的選擇
任務類型 | 隱藏層激活函數 | 輸出層激活函數 |
---|---|---|
二分類 | ReLU | Sigmoid |
多分類 | ReLU | Softmax |
回歸 | ReLU | 無(線性輸出) |
(3) 數值穩定性
- Softmax溢出問題:需減去最大值(
z - np.max(z)
)。 - 初始化權重:小隨機數(如乘0.01),避免初始激活值過大。
5. 前向傳播 vs 反向傳播
階段 | 前向傳播 | 反向傳播 |
---|---|---|
目的 | 計算預測值 (\hat{y}) | 計算梯度 (\frac{\partial J}{\partial \mathbf{W}}) |
數據流向 | 輸入層 → 輸出層 | 輸出層 → 輸入層 |
緩存內容 | 保存 (\mathbf{z}, \mathbf{a}) | 利用緩存的 (\mathbf{z}, \mathbf{a}) 計算梯度 |
6. 實際應用中的優化
(1) 批量處理(Batch Processing)
- 一次性計算多個樣本(如100張圖像)的前向傳播,利用矩陣運算加速。
- 輸入X形狀為
(batch_size, input_size)
。
(2) 深度學習框架實現
-
TensorFlow/Keras:自動處理前向傳播,用戶只需定義層結構。
model = Sequential([Dense(128, activation='relu', input_shape=(784,)),Dense(10, activation='softmax') ]) y_pred = model.predict(X)
-
PyTorch:通過
forward
方法自定義前向邏輯。class Net(nn.Module):def __init__(self):super().__init__()self.fc1 = nn.Linear(784, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.relu(self.fc1(x))x = torch.softmax(self.fc2(x), dim=1)return x
7. 總結
- 前向傳播是神經網絡預測的核心過程,通過線性變換和激活函數逐層傳遞數據。
- 實現要點:
- 確保權重和輸入的維度匹配。
- 合理選擇激活函數(隱藏層用ReLU,輸出層按任務選擇)。
- 緩存中間結果(
z
,a
)以供反向傳播使用。
- 擴展應用:CNN中的卷積層、RNN中的時間步展開均基于相同原理。