本文主要是介绍BP神经网络学习内容分享:前向传播与后向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在深度学习和神经网络领域,BP(Backpropagation,反向传播)神经网络是一种非常基础且广泛应用的网络结构。它通过前向传播进行预测,并通过反向传播算法调整网络权重以优化预测结果。本文将详细介绍BP神经网络的前向传播和反向传播过程,并展示一个简单的BP神经网络实现。
一、前向传播过程
1.基本概念
前向传播是神经网络中信息从输入层经过隐藏层到输出层的传递过程。在这个过程中,每一层的神经元接收前一层神经元的输出作为输入,并通过激活函数处理后输出给下一层。
2.公式表示
假设我们有一个简单的三层神经网络(输入层、一个隐藏层、输出层),每层神经元均使用Sigmoid激活函数。如图所示就是前向传播图: (1)输入层到隐藏层
其中,xi 是输入层第 i 个神经元的输出,wij 是从输入层第 i 个神经元到隐藏层第 j 个神经元的权重,bj 是隐藏层第 j 个神经元的偏置,zj 是隐藏层第 j 个神经元的线性组合输出,aj 是经过Sigmoid激活函数后的输出。
(2)隐藏层到输出层
过程与输入层到隐藏层类似,只是输入变为了隐藏层的输出aj。
3.前向传播包括以下几个步骤:
(1)将输入数据送入输入层,每个输入节点接收一个输入数据值。
(2)将输入数据与输入层与隐藏层之间的连接权重相乘,并将结果加权求和,得到隐藏层神经元的输入值。
(3)对隐藏层的输入值进行激活函数的处理,将其转化为隐藏层神经元的输出值。
(4)重复步骤2和3,将隐藏层的输出值与隐藏层与输出层之间的连接权重相乘,并加权求和,得到输出层神经元的输入值。
(5)对输出层的输入值进行激活函数的处理,将其转化为输出层神经元的输出值。
(6)输出层的输出值即为BP网络对输入数据的预测结果。
二、反向传播算法
1.链式法则
反向传播算法的核心是链式法则,用于计算损失函数关于每个权重的梯度。如图所示反向传播计算:
2.梯度下降
梯度下降是一种优化算法,用于最小化损失函数。在BP神经网络中,我们通过反向传播算法计算梯度,然后使用梯度下降法更新权重。
3.反向传播计算
(1)计算输出层的误差
其中,yk 是真实输出,ok 是网络预测输出。
(2)计算隐藏层的误差
(3)计算输出层的误差
其中,η 是学习率。
4.后向传播包括以下几个步骤:
(1)计算网络输出层的误差,即预测值与真实值之间的差异。
(2)根据误差计算输出层神经元的梯度,用于调整输出层与隐藏层之间的连接权重。
(3)根据输出层梯度和隐藏层的输出值,计算隐藏层神经元的梯度,用于调整隐藏层与输入层之间的连接权重。
(4)根据梯度和学习率,调整连接权重,使得误差最小化。
(5)重复以上步骤,直到网络的预测结果达到预期或训练迭代次数达到设定值。
三、BP神经网络代码实现
下面是一个简单的BP神经网络实现,使用Python编写,并手动计算权重更新。
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(x): return x * (1 - x) # 初始化参数
input_size = 3
hidden_size = 4
output_size = 2 np.random.seed(1)
weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))
weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))
bias_hidden = np.zeros(hidden_size)
bias_output = np.zeros(output_size) # 前向传播
def forward_pass(X): hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden hidden_layer_output = sigmoid(hidden_layer_input) final_output_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output final_output = sigmoid(final_output_input) return final_output, hidden_layer_output # 反向传播和权重更新
def backward_pass(X, y, output, hidden_output): # 计算输出层误差 output_error = y - output d_output = output_error * sigmoid_derivative(output) # 计算隐藏层误差 hidden_error = d_output.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_output) # 更新输出层权重和偏置 weights_hidden_output += hidden_output.T.dot(d_output) * 0.1 bias_output += np.sum(d_output, axis=0, keepdims=True) * 0.1 # 更新输入层到隐藏层权重和偏置 weights_input_hidden += X.T.dot(hidden_error) * 0.1 bias_hidden += np.sum(hidden_error, axis=0, keepdims=True) * 0.1 # 示例数据
X = np.array([[0.1, 0.2, 0.3]])
y = np.array([[0.9, 0.1]]) # 训练网络
for _ in range(10000): output, hidden_output = forward_pass(X) backward_pass(X, y, output, hidden_output) # 测试网络
print("Output after training:", forward_pass(X)[0])
四、总结
本文详细介绍了BP神经网络的前向传播和反向传播算法,并通过Python代码实现了一个简单的BP神经网络。通过不断迭代训练,网络能够逐渐优化其权重,从而提高预测的准确性。
这篇关于BP神经网络学习内容分享:前向传播与后向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!