【机器学习记录随笔-基础篇之前向传播与反向传播】
引言
在现代机器学习和深度学习的领域中,神经网络已经成为实现复杂学习任务的主要工具。神经网络之所以能够自动调整自身参数并实现高效学习,离不开两个核心的计算过程:前向传播(Forward Propagation)和反向传播(Backward Propagation)。这两个过程是神经网络训练中的关键步骤,通过前向传播计算输出,通过反向传播更新权重,两者协同作用,不断优化网络模型本文将详细介绍前向传播与反向传播的原理、实现过程以及其在神经网络训练中的作用。
前向传播
基本概念
前向传播是指在神经网络中数据从输入层经过各隐藏层一直流向输出层的过程。这个过程利用网络的当前权重和偏置参数对输入数据进行逐层计算,生成网络的最终输出。在前向传播过程中,每层神经元都会对接收到的信息进行加权求和,并通过激活函数转化为下一层神经元的输入。
前向传播的具体步骤
我们以一个简单的三层神经网络(输入层、隐藏层和输出层)为例,详细介绍前向传播的具体步骤。
- 初始化参数
首先,随机初始化网络的权重和偏置参数。权重通常用较小的随机数初始化,偏置通常初始化为小数或零。
import numpy as np
# 输入特征的数量(假设为3)
n_input = 3
# 隐藏层神经元数量(假设为4)
n_hidden = 4
# 输出层神经元数量(假设为1)
n_output = 1
# 初始化权重和偏置
W1 = np.random.randn(n_input, n_hidden)
b1 = np.zeros((1, n_hidden))
W2 = np.random.randn(n_hidden, n_output)
b2 = np.zeros((1, n_output))
- 前向传播计算
假设 X 是输入数据,前向传播的过程如下:
2.1 输入层到隐藏层
输入层数据 X 通过权重 W1 和偏置 b1,并经过激活函数(如 ReLU)计算得到隐藏层的激活值 Z1。
def relu(x):
return np.maximum(0, x)
Z1 = np.dot(X, W1) + b1
A1 = relu(Z1)
2.2 隐藏层到输出层
隐藏层激活值 A1 通过权重 W2 和偏置 b2,并经过激活函数(如 Sigmoid)计算得到输出层的激活值 Z2 和最终输出值 A2。
def sigmoid(x):
return 1 / (1 + np.exp(-x))
Z2 = np.dot(A1, W2) + b2
A2 = sigmoid(Z2)
2.3 获取最终输出
A2 是网络的最终输出,它可以用来计算损失和进行预测。
output = A2
反向传播
基本概念
反向传播是神经网络中用于优化权重的过程。在反向传播过程中,通过计算损失函数对权重和偏置参数的梯度,并利用梯度下降法更新这些参数,使得网络的预测误差逐步减小。反向传播本质上是应用了链式法则(Chain Rule),通过逐层计算梯度,实现对参数的优化调整。
反向传播的具体步骤
我们继续使用上述的三层神经网络来说明反向传播的具体步骤。
- 损失函数
损失函数用于衡量网络预测输出与真实值之间的差距。我们以均方误差损失函数(MSE)为例:
y_true = np.array([0.5]) # 真实值
y_pred = output # 预测值
def mean_squared_error(y_true, y_pred):
return np.mean(np.power(y_true - y_pred, 2))
loss = mean_squared_error(y_true, y_pred)
- 损失函数的梯度计算
反向传播从输出层开始,计算每层损失函数对各层输入的梯度。
2.1 输出层梯度
计算损失函数关于输出层激活值 A2 的梯度:
dA2 = -(y_true - y_pred)
计算输出层输入 Z2 对激活值 A2 的梯度:
dZ2 = dA2 * (A2 * (1 - A2)) # Sigmoid 函数的导数
计算输出层参数 W2 和 b2 的梯度:
dW2 = np.dot(A1.T, dZ2)
db2 = np.sum(dZ2, axis=0, keepdims=True)
2.2 隐藏层梯度
计算隐藏层激活值 A1 对隐藏层输入 Z1 的梯度:
dA1 = np.dot(dZ2, W2.T)
dZ1 = dA1 * (Z1 > 0) # ReLU 函数的导数
计算隐藏层参数 W1 和 b1 的梯度:
dW1 = np.dot(X.T, dZ1)
db1 = np.sum(dZ1, axis=0, keepdims=True)
2.3 参数更新
使用梯度下降法更新网络的权重和偏置参数:
learning_rate = 0.01
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
总结
前向传播和反向传播是神经网络训练的核心步骤。前向传播通过输入数据逐层计算输出结果,反向传播则通过计算损失和梯度,调整网络参数以优化模型性能。前向传播和反向传播不仅是神经网络的基础,也是更复杂的深度学习模型中不可或缺的组成部分。