深度学习-反向传播算法
反向传播算法通过计算损失函数对网络参数的梯度,逐层更新网络的权重和偏置。它是深度学习中最基础且关键的算法之一,确保了神经网络能够有效地学习并优化性能。
反向传播算法(Backpropagation)是训练神经网络的核心算法之一。它用于计算神经网络中每个参数的梯度,并利用这些梯度来更新参数,从而最小化损失函数。反向传播算法基于链式法则,利用梯度下降法或其他优化算法来更新网络权重和偏置。
反向传播算法的主要步骤:
-
前向传播(Forward Propagation):
- 输入数据经过网络中的每一层,通过加权和激活函数计算每一层的输出,最终得到网络的预测值。
-
计算损失(Compute Loss):
- 使用损失函数计算网络预测值与实际目标值之间的误差。
-
反向传播(Backpropagation):
- 计算输出层的梯度:对损失函数关于输出层激活值的偏导数进行计算。
- 计算隐藏层的梯度:通过链式法则将输出层的梯度传递到隐藏层,计算隐藏层的梯度。
- 更新权重和偏置:利用梯度下降法或其他优化算法更新网络中每一层的权重和偏置。
反向传播算法详细步骤:
-
前向传播:
假设神经网络包含 ( L ) 层。对于第 ( l ) 层的神经元,前向传播计算如下:
z(l)=W(l)a(l−1)+b(l) z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)} z(l)=W(l)a(l−1)+b(l)
a(l)=σ(z(l)) a^{(l)} = \sigma(z^{(l)}) a(l)=σ(z(l))
其中,( W(l)W^{(l)}W(l) ) 和 ( b(l)b^{(l)}b(l) ) 分别是第 ( l ) 层的权重和偏置,( σ\sigmaσ ) 是激活函数,( a(l−1)a^{(l-1)}a(l−1) ) 是前一层的激活值。 -
计算损失:
使用损失函数(如均方误差或交叉熵)计算输出层的损失。 -
反向传播:
-
计算输出层的误差:
δ(L)=∂Loss∂z(L) \delta^{(L)} = \frac{\partial \text{Loss}}{\partial z^{(L)}} δ(L)=∂z(L)∂Loss
其中,( δ(L)\delta^{(L)}δ(L) ) 是输出层的误差。 -
计算每层的梯度:
- 对于第 ( l ) 层的权重:
∂Loss∂W(l)=δ(l)(a(l−1))T \frac{\partial \text{Loss}}{\partial W^{(l)}} = \delta^{(l)} (a^{(l-1)})^T ∂W(l)∂Loss=δ(l)(a(l−1))T - 对于第 ( l ) 层的偏置:
∂Loss∂b(l)=δ(l) \frac{\partial \text{Loss}}{\partial b^{(l)}} = \delta^{(l)} ∂b(l)∂Loss=δ(l) - 对于隐藏层的误差:
δ(l−1)=(W(l))Tδ(l)∘σ′(z(l−1)) \delta^{(l-1)} = (W^{(l)})^T \delta^{(l)} \circ \sigma'(z^{(l-1)}) δ(l−1)=(W(l))Tδ(l)∘σ′(z(l−1))
其中,( σ′\sigma'σ′ ) 是激活函数的导数,( ∘\circ∘ ) 表示Hadamard积(元素级乘法)。
- 对于第 ( l ) 层的权重:
-
-
更新权重和偏置:
使用计算得到的梯度更新权重和偏置:
W(l)=W(l)−α∂Loss∂W(l) W^{(l)} = W^{(l)} - \alpha \frac{\partial \text{Loss}}{\partial W^{(l)}} W(l)=W(l)−α∂W(l)∂Loss
b(l)=b(l)−α∂Loss∂b(l) b^{(l)} = b^{(l)} - \alpha \frac{\partial \text{Loss}}{\partial b^{(l)}} b(l)=b(l)−α∂b(l)∂Loss
其中,( α\alphaα ) 是学习率。
代码示例
以下是一个简单的反向传播算法的实现示例,以训练一个单层神经网络为例:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
# 初始化数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # 输入数据
y = np.array([[0], [1], [1], [0]]) # 目标输出
# 初始化参数
input_size = X.shape[1]
hidden_size = 4
output_size = y.shape[1]
learning_rate = 0.1
epochs = 10000
# 初始化权重和偏置
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
# 训练过程
for epoch in range(epochs):
# 前向传播
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2)
# 计算损失(均方误差)
loss = np.mean((y - a2) ** 2)
# 反向传播
d_loss = a2 - y
d_z2 = d_loss * sigmoid_derivative(z2)
d_W2 = np.dot(a1.T, d_z2) / X.shape[0]
d_b2 = np.sum(d_z2, axis=0, keepdims=True) / X.shape[0]
d_a1 = np.dot(d_z2, W2.T)
d_z1 = d_a1 * sigmoid_derivative(z1)
d_W1 = np.dot(X.T, d_z1) / X.shape[0]
d_b1 = np.sum(d_z1, axis=0, keepdims=True) / X.shape[0]
# 更新权重和偏置
W2 -= learning_rate * d_W2
b2 -= learning_rate * d_b2
W1 -= learning_rate * d_W1
b1 -= learning_rate * d_b1
if epoch % 1000 == 0:
print(f'Epoch {epoch}, Loss: {loss}')
print("训练完成")
总结
反向传播算法通过计算损失函数对网络参数的梯度,逐层更新网络的权重和偏置。它是深度学习中最基础且关键的算法之一,确保了神经网络能够有效地学习并优化性能。
更多推荐
所有评论(0)