簡單比較
前向傳播(Forward Propagation):
前向傳播是神經(jīng)網(wǎng)絡(luò)中的正向計算過程,用于從輸入數(shù)據(jù)開始,逐層計算每個神經(jīng)元的輸出值,直到得到最終的預(yù)測值。在前向傳播過程中,我們按以下步驟進(jìn)行:
輸入數(shù)據(jù):將輸入數(shù)據(jù)傳遞給輸入層。
加權(quán)求和:對每個神經(jīng)元的輸入進(jìn)行加權(quán)求和,即將輸入與權(quán)重相乘并加上偏差。
激活函數(shù):將加權(quán)求和的結(jié)果輸入激活函數(shù)(如Sigmoid、ReLU等),得到神經(jīng)元的輸出。
傳遞至下一層:將當(dāng)前層的輸出作為下一層的輸入,重復(fù)步驟 2 和 3,直到達(dá)到輸出層,得到最終的預(yù)測值。
反向傳播(Backward Propagation):
反向傳播是神經(jīng)網(wǎng)絡(luò)中的梯度計算和權(quán)重更新過程,用于根據(jù)損失函數(shù)計算每個參數(shù)的梯度,然后根據(jù)梯度信息更新網(wǎng)絡(luò)的權(quán)重和偏差。在反向傳播過程中,我們按以下步驟進(jìn)行:
計算損失:使用損失函數(shù)計算預(yù)測值與真實(shí)標(biāo)簽之間的差距。
計算梯度:通過鏈?zhǔn)椒▌t,從輸出層開始,逐層計算每個參數(shù)的梯度,傳遞梯度至前一層。對于每一層,計算權(quán)重和偏差的梯度,以及當(dāng)前層輸入的梯度。
參數(shù)更新:使用計算得到的梯度信息,根據(jù)優(yōu)化算法(如梯度下降法、Adam等)更新每個參數(shù)的值,以減小損失函數(shù)。
重復(fù)迭代:重復(fù)進(jìn)行前向傳播和反向傳播,多次迭代,直到損失函數(shù)足夠小或達(dá)到預(yù)定的迭代次數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-653742.html
前向傳播和反向傳播是神經(jīng)網(wǎng)絡(luò)訓(xùn)練的基石,通過不斷地在這兩個過程中更新參數(shù),神經(jīng)網(wǎng)絡(luò)逐漸優(yōu)化其性能,從而能夠更好地進(jìn)行預(yù)測和模式識別任務(wù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-653742.html
代碼實(shí)現(xiàn)
import numpy as np
# Sigmoid 激活函數(shù)及其導(dǎo)數(shù)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# 初始化參數(shù)
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) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = 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)) / m
return loss
# 反向傳播
def backward_propagation(X, Y, cache, parameters):
m = X.shape[1]
A1, A2 = cache['A1'], cache['A2']
W2 = parameters['W2']
dZ2 = A2 - Y
dW2 = np.dot(dZ2, A1.T) / m
db2 = np.sum(dZ2, axis=1, keepdims=True) / m
dZ1 = np.dot(W2.T, dZ2) * sigmoid_derivative(A1)
dW1 = np.dot(dZ1, X.T) / m
db1 = np.sum(dZ1, axis=1, keepdims=True) / m
grads = {'dW1': dW1, 'db1': db1, 'dW2': dW2, 'db2': db2}
return grads
# 更新參數(shù)
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
# 主函數(shù)
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
# 示例數(shù)據(jù)
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
Y = np.array([[0, 1, 1, 0]])
# 定義超參數(shù)
hidden_size = 4
learning_rate = 0.1
num_iterations = 10000
# 訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)
parameters = deep_neural_network(X, Y, hidden_size, learning_rate, num_iterations)
# 預(yù)測
predictions, _ = forward_propagation(X, parameters)
print('Predictions:', predictions)
到了這里,關(guān)于神經(jīng)網(wǎng)絡(luò)基礎(chǔ)-神經(jīng)網(wǎng)絡(luò)補(bǔ)充概念-26-前向和反向傳播的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!