引言
神經網絡是人工智能和深度學習的核心,它模仿人腦的工作方式,通過數據學習復雜的模式。本文將以通俗易懂的方式講解神經網絡的基礎知識,包括單層神經網絡、多層神經網絡,最后用Python代碼實現一個簡單的神經網絡模型。
1. 神經網絡模型基礎
1.1 什么是神經網絡?
神經網絡是由神經元(Neurons)組成的計算系統,它接收輸入數據,經過一系列計算后輸出預測結果。其核心思想是模仿人腦神經元之間的連接方式。
圖表:人工神經元結構示意圖
擴展說明:
每個神經元會對輸入加權求和,加上偏置后通過激活函數,輸出結果。激活函數賦予網絡非線性表達能力。
1.2 神經元的結構
一個神經元的基本計算方式如下:
輸出=f(w1x1+w2x2+?+wnxn+b)?\text{輸出} = f(w_1 x_1 + w_2 x_2 + \dots + w_n x_n + b)\,輸出=f(w1?x1?+w2?x2?+?+wn?xn?+b)
其中:
- (x1,x2,…,xnx_1, x_2, \dots, x_nx1?,x2?,…,xn?) 是輸入數據
- (w1,w2,…,wnw_1, w_2, \dots, w_nw1?,w2?,…,wn?) 是權重(決定輸入的重要性)
- (bbb) 是偏置(調整輸出的偏移量)
- (fff) 是激活函數(引入非線性)
1.3 常見的激活函數
函數名稱 | 公式 | 特點 |
---|---|---|
Sigmoid | σ(x)=11+e?x?\sigma(x) = \frac{1}{1 + e^{-x}} \,σ(x)=1+e?x1? | 輸出0~1,適合二分類 |
ReLU | ReLU(x)=max?(0,x)?\text{ReLU}(x) = \max(0, x) \,ReLU(x)=max(0,x) | 計算快,緩解梯度消失 |
Tanh | tanh?(x)=ex?e?xex+e?x? \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} \,tanh(x)=ex+e?xex?e?x? | 輸出-1~1,適合回歸 |
圖表:常見激活函數對比思維導圖
擴展說明:
激活函數的選擇會影響神經網絡的收斂速度和表達能力。ReLU因其高效和緩解梯度消失問題,在深度網絡中應用最廣。
2. 單層神經網絡(感知機)
單層神經網絡(Perceptron)是最簡單的神經網絡,僅包含輸入層和輸出層,沒有隱藏層。
圖表:單層感知機結構圖
2.1 數學表示
y=f(wTx+b) y = f(\mathbf{w}^T \mathbf{x} + b) y=f(wTx+b)
- (x?\mathbf{x}\,x) 是輸入向量
- (w?\mathbf{w}\,w) 是權重向量
- (bbb) 是偏置
- (fff) 是激活函數(如Sigmoid)
2.2 應用場景
- 線性分類(如邏輯回歸)
- 簡單二分類問題
擴展說明:
單層感知機只能解決線性可分問題,無法擬合復雜的非線性關系。
3. 多層神經網絡(深度神經網絡)
多層神經網絡(MLP, Multi-Layer Perceptron)包含輸入層、隱藏層、輸出層,能夠學習更復雜的非線性關系。
圖表:多層神經網絡結構圖
3.1 結構
- 輸入層:接收原始數據(如像素、文本)
- 隱藏層:多個非線性變換層(常用ReLU)
- 輸出層:最終預測(如分類概率)
3.2 前向傳播
數據從輸入層逐層計算到輸出層:
h1=f(W1x+b1)h2=f(W2h1+b2)…y=f(Wnhn?1+bn)
\mathbf{h}_1 = f(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1) \\
\mathbf{h}_2 = f(\mathbf{W}_2 \mathbf{h}_1 + \mathbf{b}_2) \\
\dots \\
\mathbf{y} = f(\mathbf{W}_n \mathbf{h}_{n-1} + \mathbf{b}_n)
h1?=f(W1?x+b1?)h2?=f(W2?h1?+b2?)…y=f(Wn?hn?1?+bn?)
圖表:前向傳播流程圖
3.3 反向傳播(Backpropagation)
通過計算損失函數的梯度,調整權重和偏置:
w←w?η?L?w
\mathbf{w} \leftarrow \mathbf{w} - \eta \frac{\partial L}{\partial \mathbf{w}}
w←w?η?w?L?
其中:
- (LLL) 是損失函數(如交叉熵、MSE)
- (η?\eta\,η) 是學習率
圖表:反向傳播流程圖
擴展說明:
前向傳播負責計算輸出,反向傳播則根據損失調整參數,是神經網絡學習的核心機制。
4. 神經網絡代碼簡單實現(Python)
使用 numpy
和 sklearn
實現一個簡單的多層神經網絡(MLP)進行二分類。
4.1 數據準備
import numpy as np
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split# 生成非線性數據集
X, y = make_moons(n_samples=1000, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
4.2 定義神經網絡
class NeuralNetwork:def __init__(self, input_size, hidden_size, output_size):# 初始化權重self.W1 = np.random.randn(input_size, hidden_size) * 0.01self.b1 = np.zeros(hidden_size)self.W2 = np.random.randn(hidden_size, output_size) * 0.01self.b2 = np.zeros(output_size)def relu(self, x):return np.maximum(0, x)def sigmoid(self, x):return 1 / (1 + np.exp(-x))def forward(self, X):# 前向傳播self.z1 = np.dot(X, self.W1) + self.b1self.a1 = self.relu(self.z1)self.z2 = np.dot(self.a1, self.W2) + self.b2self.y_pred = self.sigmoid(self.z2)return self.y_preddef backward(self, X, y, lr=0.01):# 反向傳播m = X.shape[0]# 計算梯度d_z2 = self.y_pred - y.reshape(-1, 1)d_W2 = np.dot(self.a1.T, d_z2) / md_b2 = np.sum(d_z2, axis=0) / md_a1 = np.dot(d_z2, self.W2.T)d_z1 = d_a1 * (self.a1 > 0) # ReLU的導數d_W1 = np.dot(X.T, d_z1) / md_b1 = np.sum(d_z1, axis=0) / m# 更新權重self.W1 -= lr * d_W1self.b1 -= lr * d_b1self.W2 -= lr * d_W2self.b2 -= lr * d_b2def train(self, X, y, epochs=1000, lr=0.01):for epoch in range(epochs):y_pred = self.forward(X)loss = -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))self.backward(X, y, lr)if epoch % 100 == 0:print(f"Epoch {epoch}, Loss: {loss:.4f}")
4.3 訓練與測試
# 初始化網絡
nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)# 訓練
nn.train(X_train, y_train, epochs=1000, lr=0.1)# 測試
y_pred = (nn.forward(X_test) > 0.5).astype(int)
accuracy = np.mean(y_pred.flatten() == y_test)
print(f"Test Accuracy: {accuracy * 100:.2f}%")
輸出示例:
Epoch 0, Loss: 0.6931
Epoch 100, Loss: 0.3521
Epoch 200, Loss: 0.2104
...
Test Accuracy: 93.33%
5. 神經網絡的應用場景
圖表:神經網絡應用場景思維導圖
擴展說明:
神經網絡廣泛應用于圖像、語音、文本等多種領域,是現代人工智能的基石。
總結
- 單層神經網絡:適合簡單線性問題(如邏輯回歸)。
- 多層神經網絡(MLP):能學習復雜非線性關系,是深度學習的基礎。
- 代碼實現:使用
numpy
手動實現前向傳播、反向傳播,訓練一個簡單的分類模型。
希望這篇博客能幫助你理解神經網絡的基本原理!🚀 如果有問題,歡迎留言討論!