【漫话机器学习系列】008.反向传播算法(Backpropagation Algorithm)

反向传播算法(Backpropagation Algorithm)

反向传播(Backpropagation,简称 BP)是一种高效的梯度下降算法,用于优化神经网络的权重和偏置。它通过计算损失函数相对于模型参数的梯度,从而调整参数以最小化损失函数。


1. 基本思想

  • 核心目标是最小化损失函数 L(y, \hat{y}),其中:
    • y:真实值。
    • \hat{y}​:模型预测值。
  • BP 算法通过链式法则逐层传播误差,从输出层到输入层,逐步计算梯度并更新参数。

2. 反向传播的步骤

(1) 前向传播
  1. 输入数据通过网络计算输出(预测值 \hat{y}​)。
  2. 计算每层的激活值 z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)} 和激活后的输出 a^{(l)} = f(z^{(l)})
  3. 在最后一层计算损失函数 L(y, \hat{y})
(2) 计算损失
  • 使用损失函数(如均方误差、交叉熵)来衡量预测值和真实值之间的差距。
(3) 反向传播
  1. 计算输出层误差
    • 对于输出层: \delta^{(L)} = \frac{\partial L}{\partial a^{(L)}} \cdot f'(z^{(L)}) 其中,\delta^{(L)} 表示输出层的误差。
  2. 传播到隐藏层
    • 对于每一层 l
       
                            \delta^{(l)} = (W^{(l+1)})^\top \delta^{(l+1)} \cdot f'(z^{(l)})
  3. 计算梯度
    • 权重梯度:

                        \frac{\partial L}{\partial W^{(l)}} = \delta^{(l)} \cdot (a^{(l-1)})^\top
    • 偏置梯度:

                        \frac{\partial L}{\partial b^{(l)}} = \delta^{(l)}
(4) 参数更新
  • 使用梯度下降法更新参数:

                                               W^{(l)} \gets W^{(l)} - \eta \cdot \frac{\partial L}{\partial W^{(l)}}

                                              ​ b^{(l)}\gets b^{(l)} - \eta \cdot \frac{\partial L}{\partial b^{(l)}}
    其中,\eta 为学习率。

3. 公式解读

  • 前向传播公式

                             z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}, \quad a^{(l)} = f(z^{(l)})
  • 误差传播公式

                             \delta^{(l)} = (W^{(l+1)})^\top \delta^{(l+1)} \cdot f'(z^{(l)})
  • 梯度公式

                           \frac{\partial L}{\partial W^{(l)}} = \delta^{(l)} \cdot (a^{(l-1)})^\top

                           \frac{\partial L}{\partial b^{(l)}} = \delta^{(l)}
     

 4. Python 实现

以下是反向传播算法的基本实现:

import numpy as np

# 激活函数及其导数(以Sigmoid为例)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 初始化参数
np.random.seed(42)
input_size, hidden_size, output_size = 3, 4, 1
W1 = np.random.randn(hidden_size, input_size)
b1 = np.random.randn(hidden_size, 1)
W2 = np.random.randn(output_size, hidden_size)
b2 = np.random.randn(output_size, 1)

# 数据示例
X = np.random.randn(input_size, 1)  # 输入
y = np.array([[1]])  # 真实值

# 前向传播
z1 = np.dot(W1, X) + b1
a1 = sigmoid(z1)
z2 = np.dot(W2, a1) + b2
a2 = sigmoid(z2)  # 预测值

# 损失函数:均方误差
loss = 0.5 * (y - a2) ** 2

# 反向传播
# 输出层误差
delta2 = (a2 - y) * sigmoid_derivative(z2)
dW2 = np.dot(delta2, a1.T)
db2 = delta2

# 隐藏层误差
delta1 = np.dot(W2.T, delta2) * sigmoid_derivative(z1)
dW1 = np.dot(delta1, X.T)
db1 = delta1

# 参数更新
learning_rate = 0.1
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1

print("Updated Weights and Biases:")
print("W1:", W1)
print("b1:", b1)
print("W2:", W2)
print("b2:", b2)

输出结果

Updated Weights and Biases:
W1: [[ 0.49721568 -0.13841431  0.65085341]
 [ 1.52294983 -0.23412944 -0.23464195]
 [ 1.57955459  0.76733251 -0.46731765]
 [ 0.54337753 -0.4636622  -0.46057106]]
b1: [[ 0.23974092]
 [-1.9129258 ]
 [-1.7264316 ]
 [-0.5659083 ]]
W2: [[-1.00965471  0.31553744 -0.90592943 -1.40730743]]
b2: [[1.47591079]]

5. 总结

  • 反向传播的作用:通过计算损失函数对参数的梯度,指导权重和偏置更新,从而最小化误差。
  • 优点:高效、易于实现,适合深度神经网络。
  • 局限性:可能出现梯度消失或梯度爆炸问题,特别是在深层网络中。
  • 改进:结合优化算法(如 Adam、RMSProp)和正则化技术,增强 BP 算法的性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值