反向传播(Backpropagation)是一种用于训练神经网络的算法。
它的主要思想是:
- 前向传播:输入数据通过神经网络层层前向传播,计算最终输出和损失函数。
- 反向传播:从输出层开始,根据损失函数对权重参数的梯度,层层反向传播计算各层参数的梯度。
- 使用梯度下降算法更新网络参数,最小化损失函数,实现网络训练。
反向传播在神经网络中的主要应用是:
- 网络参数训练:使用反向传播算法计算参数梯度,实现网络权重参数的更新和优化。这是训练深度神经网络的关键算法。
- 隐层特征学习:通过反向传播训练,神经网络可以自动学习数据的隐层特征表示。这是深度学习的关键。
- 端到端训练:反向传播可以对整个神经网络端到端进行训练,无需人工设计复杂的特征和规则。
主要的反向传播步骤如下:
- 初始化网络参数。
- 输入训练数据进行前向传播,得到最终输出和损失函数。
- 根据损失函数计算输出层相对于各节点权重的梯度。
- 反向传播梯度,计算隐层各节点相对于权重的梯度。
- 使用梯度下降算法更新所有网络参数。
- 重复2-5,直到收敛。
代码示例:
python
# 定义前向传播
def forward_propagate(X, W1, b1, W2, b2):
Z1 = X.dot(W1) + b1
A1 = relu(Z1)
Z2 = A1.dot(W2) + b2
A2 = sigmoid(Z2)
return A1, A2
# 定义反向传播
def backpropagate(A1, A2, X, y, W1, b1, W2, b2):
# 输出层梯度
dA2 = -(y/A2) + ((1-y)/(1-A2))
dW2 = A1.T.dot(dA2)
db2 = np.sum(dA2, axis=0)
# 隐层梯度
dA1 = dA2.dot(W2.T)
dW1 = X.T.dot(dA1)
db1 = np.sum(dA1, axis=0)
return dW1, db1, dW2, db2