概念
神經網絡的梯度下降法是訓練神經網絡的核心優化算法之一。它通過調整神經網絡的權重和偏差,以最小化損失函數,從而使神經網絡能夠逐漸逼近目標函數的最優值。
步驟
1損失函數(Loss Function):
首先,我們定義一個損失函數,用來衡量神經網絡預測值與真實標簽之間的差距。常見的損失函數包括均方誤差(Mean Squared Error)和交叉熵(Cross-Entropy)等。
2初始化參數:
在訓練之前,需要隨機初始化神經網絡的權重和偏差。
4前向傳播:
通過前向傳播計算神經網絡的輸出,根據輸入數據、權重和偏差計算每一層的激活值和預測值。
5計算損失:
使用損失函數計算預測值與真實標簽之間的差距。
6反向傳播:
反向傳播是梯度下降法的關鍵步驟。它從輸出層開始,計算每一層的誤差梯度,然后根據鏈式法則將梯度傳遞回每一層。這樣,可以得到關于權重和偏差的梯度信息,指導參數的更新。
7更新參數:
使用梯度信息,按照一定的學習率(learning rate)更新神經網絡的權重和偏差。通常采用如下更新規則:新權重 = 舊權重 - 學習率 × 梯度。
8重復迭代:
重復執行前向傳播、計算損失、反向傳播和參數更新步驟,直到損失函數收斂或達到預定的迭代次數。
9評估模型:
在訓練過程中,可以周期性地評估模型在驗證集上的性能,以防止過擬合并選擇合適的模型。
python實現
import numpy as np# 定義 sigmoid 激活函數及其導數
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 設置隨機種子以保證可重復性
np.random.seed(42)# 生成模擬數據
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])# 初始化權重和偏差
input_size = 2
output_size = 1
hidden_size = 4weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))
bias_hidden = np.zeros((1, hidden_size))weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))
bias_output = np.zeros((1, output_size))# 設置學習率和迭代次數
learning_rate = 0.1
epochs = 10000# 訓練神經網絡
for epoch in range(epochs):# 前向傳播hidden_input = np.dot(X, weights_input_hidden) + bias_hiddenhidden_output = sigmoid(hidden_input)final_input = np.dot(hidden_output, weights_hidden_output) + bias_outputfinal_output = sigmoid(final_input)# 計算損失loss = np.mean(0.5 * (y - final_output) ** 2)# 反向傳播d_output = (y - final_output) * sigmoid_derivative(final_output)d_hidden = d_output.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_output)# 更新權重和偏差weights_hidden_output += hidden_output.T.dot(d_output) * learning_ratebias_output += np.sum(d_output, axis=0, keepdims=True) * learning_rateweights_input_hidden += X.T.dot(d_hidden) * learning_ratebias_hidden += np.sum(d_hidden, axis=0, keepdims=True) * learning_rateif epoch % 1000 == 0:print(f'Epoch {epoch}, Loss: {loss}')# 打印訓練后的權重和偏差
print('Final weights_input_hidden:', weights_input_hidden)
print('Final bias_hidden:', bias_hidden)
print('Final weights_hidden_output:', weights_hidden_output)
print('Final bias_output:', bias_output)