一、 為什么要用神經網絡?
- 邏輯回歸只能處理線性可分問題。
- 例如,經典的 XOR 異或問題無法用單層邏輯回歸準確分類。
- 神經網絡通過多層結構和非線性激活函數,能學習復雜的決策邊界,解決非線性問題。
二、神經網絡的基本組成
神經網絡由多層組成:
層級 | 說明 |
---|---|
輸入層 | 接收輸入特征,比如像素或數值。 |
隱藏層 | 通過若干個神經元(單元)進行非線性變換。 |
輸出層 | 輸出最終結果,如分類概率。 |
三、神經元和權重的定義
- 每個神經元代表一個計算單元,輸出稱為“激活值” a i ( j ) a_i^{(j)} ai(j)?,表示第 j j j 層第 i i i 個神經元的輸出。
- 每層之間的連接由權重矩陣 Θ ( j ) \Theta^{(j)} Θ(j) 表示,從第 j j j 層到第 j + 1 j+1 j+1 層。
- 權重矩陣的維度為: s j + 1 × ( s j + 1 ) s_{j+1} \times (s_j + 1) sj+1?×(sj?+1),其中 s j s_j sj? 是第 j j j 層神經元數(不包含偏置單元), + 1 +1 +1 是因為偏置項。
四、前向傳播(Forward Propagation)
假設有一個3層神經網絡(輸入層-隱藏層-輸出層),執行前向傳播的過程如下:
- 輸入層激活 a ( 1 ) = x a^{(1)} = x a(1)=x,在輸入層加上偏置單元 a 0 ( 1 ) = 1 a_0^{(1)} = 1 a0(1)?=1。
- 計算隱藏層的輸入值:
z ( 2 ) = Θ ( 1 ) a ( 1 ) z^{(2)} = \Theta^{(1)} a^{(1)} z(2)=Θ(1)a(1)
這里, z ( 2 ) z^{(2)} z(2) 是隱藏層每個神經元的線性組合輸入(權重 * 輸入 + 偏置)。
- 對 z ( 2 ) z^{(2)} z(2) 使用激活函數(sigmoid)得到隱藏層激活:
a ( 2 ) = g ( z ( 2 ) ) = 1 1 + e ? z ( 2 ) a^{(2)} = g(z^{(2)}) = \frac{1}{1 + e^{-z^{(2)}}} a(2)=g(z(2))=1+e?z(2)1?
- 在隱藏層激活前加偏置單元 a 0 ( 2 ) = 1 a_0^{(2)} = 1 a0(2)?=1。
- 計算輸出層的輸入:
z ( 3 ) = Θ ( 2 ) a ( 2 ) z^{(3)} = \Theta^{(2)} a^{(2)} z(3)=Θ(2)a(2)
- 輸出層激活:
a ( 3 ) = h Θ ( x ) = g ( z ( 3 ) ) a^{(3)} = h_\Theta(x) = g(z^{(3)}) a(3)=hΘ?(x)=g(z(3))
a ( 3 ) a^{(3)} a(3) 就是網絡最終的輸出,可能是多類分類的概率向量。
五、激活函數:sigmoid 函數
- 公式:
g ( z ) = 1 1 + e ? z g(z) = \frac{1}{1 + e^{-z}} g(z)=1+e?z1?
- 作用:
- 將任意實數映射到 (0, 1) 之間。
- 模擬生物神經元“激活”的概率。
- 輸出值可解釋為概率,方便做分類。
- 形狀:
- z → + ∞ z \to +\infty z→+∞, g ( z ) → 1 g(z) \to 1 g(z)→1
- z → ? ∞ z \to -\infty z→?∞, g ( z ) → 0 g(z) \to 0 g(z)→0
- z = 0 z = 0 z=0, g ( z ) = 0.5 g(z) = 0.5 g(z)=0.5
六、神經網絡舉例:用來實現 XOR 函數
XOR 真值表:
x 1 x_1 x1? | x 2 x_2 x2? | XOR 輸出 y y y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
邏輯回歸不能擬合這個非線性邊界,但神經網絡可以。
七、Python代碼示例:手寫3層神經網絡實現 XOR
import numpy as npdef sigmoid(z):return 1 / (1 + np.exp(-z))# 輸入數據:4個樣本,2個特征
X = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])
m = X.shape[0]# 添加偏置單元
X = np.hstack((np.ones((m,1)), X)) # shape (4,3)# 手動設定權重參數 Theta
# 輸入層到隱藏層 (2隱藏單元 + 偏置),shape = (2,3)
Theta1 = np.array([[-30, 20, 20], # 模擬AND[10, -20, -20]]) # 模擬NOR# 隱藏層到輸出層 (1輸出單元 + 偏置), shape = (1,3)
Theta2 = np.array([-10, 20, 20]) # 模擬ORdef forward_propagation(X):# 輸入層到隱藏層z2 = X @ Theta1.T # (4,3) @ (3,2).T => (4,2)a2 = sigmoid(z2)# 添加偏置單元到隱藏層激活a2 = np.hstack((np.ones((m,1)), a2)) # (4,3)# 隱藏層到輸出層z3 = a2 @ Theta2.T # (4,3) @ (3,1) => (4,1)a3 = sigmoid(z3)return a3y_pred = forward_propagation(X)
print("預測結果(概率):\n", y_pred)
print("預測結果(四舍五入):\n", np.round(y_pred))
結果:
預測結果(概率):[[0.0000454 ][0.9999546 ][0.9999546 ][0.0000454 ]]
預測結果(四舍五入):[[0.][1.][1.][0.]]
成功模擬 XOR 輸出。
八、神經網絡參數維度
層間連接 | 權重矩陣維度 |
---|---|
輸入層(含偏置)到隱藏層 | Θ ( 1 ) ∈ R s 2 × ( s 1 + 1 ) \Theta^{(1)} \in \mathbb{R}^{s_2 \times (s_1 + 1)} Θ(1)∈Rs2?×(s1?+1) |
隱藏層(含偏置)到輸出層 | Θ ( 2 ) ∈ R s 3 × ( s 2 + 1 ) \Theta^{(2)} \in \mathbb{R}^{s_3 \times (s_2 + 1)} Θ(2)∈Rs3?×(s2?+1) |
- s j s_j sj?:第 j j j 層神經元個數,不含偏置。
- 偏置項在矩陣維度中體現為多加的一列。
九、神經網絡如何支持多分類?
- 輸出層每個神經元對應一個類別。
- 網絡輸出是一個概率向量,表示輸入屬于各類別的概率。
- 常用于 One-vs-All 多分類。