簡單比較
前向傳播(Forward Propagation):
前向傳播是神經網絡中的正向計算過程,用于從輸入數據開始,逐層計算每個神經元的輸出值,直到得到最終的預測值。在前向傳播過程中,我們按以下步驟進行:
輸入數據:將輸入數據傳遞給輸入層。
加權求和:對每個神經元的輸入進行加權求和,即將輸入與權重相乘并加上偏差。
激活函數:將加權求和的結果輸入激活函數(如Sigmoid、ReLU等),得到神經元的輸出。
傳遞至下一層:將當前層的輸出作為下一層的輸入,重復步驟 2 和 3,直到達到輸出層,得到最終的預測值。
反向傳播(Backward Propagation):
反向傳播是神經網絡中的梯度計算和權重更新過程,用于根據損失函數計算每個參數的梯度,然后根據梯度信息更新網絡的權重和偏差。在反向傳播過程中,我們按以下步驟進行:
計算損失:使用損失函數計算預測值與真實標簽之間的差距。
計算梯度:通過鏈式法則,從輸出層開始,逐層計算每個參數的梯度,傳遞梯度至前一層。對于每一層,計算權重和偏差的梯度,以及當前層輸入的梯度。
參數更新:使用計算得到的梯度信息,根據優化算法(如梯度下降法、Adam等)更新每個參數的值,以減小損失函數。
重復迭代:重復進行前向傳播和反向傳播,多次迭代,直到損失函數足夠小或達到預定的迭代次數。
前向傳播和反向傳播是神經網絡訓練的基石,通過不斷地在這兩個過程中更新參數,神經網絡逐漸優化其性能,從而能夠更好地進行預測和模式識別任務。
代碼實現
import numpy as np# Sigmoid 激活函數及其導數
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 初始化參數
def initialize_parameters(input_size, hidden_size, output_size):parameters = {'W1': np.random.randn(hidden_size, input_size),'b1': np.zeros((hidden_size, 1)),'W2': np.random.randn(output_size, hidden_size),'b2': np.zeros((output_size, 1))}return parameters# 前向傳播
def forward_propagation(X, parameters):W1, b1, W2, b2 = parameters['W1'], parameters['b1'], parameters['W2'], parameters['b2']Z1 = np.dot(W1, X) + b1A1 = sigmoid(Z1)Z2 = np.dot(W2, A1) + b2A2 = sigmoid(Z2)cache = {'Z1': Z1, 'A1': A1, 'Z2': Z2, 'A2': A2}return A2, cache# 計算損失
def compute_loss(A2, Y):m = Y.shape[1]loss = -np.sum(Y * np.log(A2) + (1 - Y) * np.log(1 - A2)) / mreturn loss# 反向傳播
def backward_propagation(X, Y, cache, parameters):m = X.shape[1]A1, A2 = cache['A1'], cache['A2']W2 = parameters['W2']dZ2 = A2 - YdW2 = np.dot(dZ2, A1.T) / mdb2 = np.sum(dZ2, axis=1, keepdims=True) / mdZ1 = np.dot(W2.T, dZ2) * sigmoid_derivative(A1)dW1 = np.dot(dZ1, X.T) / mdb1 = np.sum(dZ1, axis=1, keepdims=True) / mgrads = {'dW1': dW1, 'db1': db1, 'dW2': dW2, 'db2': db2}return grads# 更新參數
def update_parameters(parameters, grads, learning_rate):parameters['W1'] -= learning_rate * grads['dW1']parameters['b1'] -= learning_rate * grads['db1']parameters['W2'] -= learning_rate * grads['dW2']parameters['b2'] -= learning_rate * grads['db2']return parameters# 主函數
def deep_neural_network(X, Y, hidden_size, learning_rate, num_iterations):np.random.seed(42)input_size = X.shape[0]output_size = Y.shape[0]parameters = initialize_parameters(input_size, hidden_size, output_size)for i in range(num_iterations):A2, cache = forward_propagation(X, parameters)loss = compute_loss(A2, Y)grads = backward_propagation(X, Y, cache, parameters)parameters = update_parameters(parameters, grads, learning_rate)if i % 100 == 0:print(f'Iteration {i}, Loss: {loss:.4f}')return parameters# 示例數據
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
Y = np.array([[0, 1, 1, 0]])# 定義超參數
hidden_size = 4
learning_rate = 0.1
num_iterations = 10000# 訓練深層神經網絡
parameters = deep_neural_network(X, Y, hidden_size, learning_rate, num_iterations)# 預測
predictions, _ = forward_propagation(X, parameters)
print('Predictions:', predictions)