BP神经网络
一、BP 神经网络概述BP(Back Propagation)神经网络是一种按照偏差逆向传播算法训练的多层前馈神经网络,它是现在应用最广泛的神经网络模子之一。BP 神经网络由输入层、隐藏层和输出层构成,隐藏层可以有一层或多层。其学习过程由正向传播和反向传播构成,在正向传播过程中,输入信息从输入层经隐藏层逐层处理处罚并传向输出层,若输出层的现实输出与期望输出不符,则转入反向传播阶段,将偏差信号沿原来的毗连通路返回,通过修改各层神经元的权值,使得偏差信号最小。
算法流程图
https://i-blog.csdnimg.cn/direct/940980ceacfa4738bfa68c8f2e03ef27.png
神经元模子
https://i-blog.csdnimg.cn/direct/8e51ab5f544647bc9654ae46a8c7ddee.png
每个神经元都担当来自其它神经元的输入信号,每个信号都通过一个带有权重的毗连转达,神经元把这些信号加起来得到一个总输入值,然后将总输入值与神经元的阈值举行对比(模拟阈值电位),然后通过一个“激活函数”处理处罚得到最终的输出(模拟细胞的激活),这个输出又会作为之后神经元的输入一层一层转达下去。
二、BP 神经网络的布局与工作原理
(一)网络布局
[*]输入层:汲取外部输入数据,神经元的数量取决于输入数据的特性维度。比方,在手写数字识别使掷中,假如输入的是 28×28 像素的图像,那么输入层神经元数量大概就是 784。
[*]隐藏层:可以有一层或多层,隐藏层神经元通过激活函数对输入举行非线性变换,使网络可以大概学习到复杂的模式。隐藏层神经元数量的选择会影响网络的学习本领和泛化本领,通常需要通过实验来确定。
[*]输出层:输出最终的预测效果,神经元数量根据任务范例而定。在二分类使掷中,输出层大概只有 1 个神经元,输出 0 或 1 表现差别种别;在多分类使掷中,输出层神经元数量便是种别数,通过 Softmax 函数将输出转换为概率分布。
(二)正向传播
在正向传播过程中,输入数据从输入层进入网络,依次颠末隐藏层,最终到达输出层。每层神经元汲取上一层神经元的输出,并通过加权求和,再颠末激活函数处理处罚,得到该层的输出,转达给下一层。假设第\(l\)层的输入为\(x^{(l)}\),权重矩阵为\(W^{(l)}\),偏置向量为\(b^{(l)}\),激活函数为\(\sigma\),那么该层的输出\(a^{(l)}\)可以表现为:\(a^{(l)} = \sigma(W^{(l)}x^{(l)} + b^{(l)})\)
(三)反向传播
反向传播是 BP 神经网络的关键。在得到输出层的预测效果后,通过损失函数(如均方偏差函数、交错熵损失函数等)盘算预测值与真实值之间的偏差。然后,从输出层开始,将偏差逐层反向传播,盘算每个神经元的偏差梯度,并根据梯度降落法更新各层之间的权重。详细来说,权重的更新公式为:\(W^{(l)} = W^{(l)} - \eta \frac{\partial J}{\partial W^{(l)}}\)
\(b^{(l)} = b^{(l)} - \eta \frac{\partial J}{\partial b^{(l)}}\)
此中,\(\eta\)为学习率,控制权重更新的步长;\(J\)为损失函数。
三、BP 神经网络的 Python 代码实现
下面利用 Python 和 NumPy 实现一个简朴的单隐藏层 BP 神经网络,用于办理二分类题目:
import numpy as np
# 定义激活函数sigmoid
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义sigmoid函数的导数
def sigmoid_derivative(x):
return x * (1 - x)
# 定义BP神经网络类
class BPNeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.weights1 = np.random.rand(input_size, hidden_size)
self.bias1 = np.zeros((1, hidden_size))
self.weights2 = np.random.rand(hidden_size, output_size)
self.bias2 = np.zeros((1, output_size))
def forward_propagation(self, X):
self.z1 = np.dot(X, self.weights1) + self.bias1
self.a1 = sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.weights2) + self.bias2
self.a2 = sigmoid(self.z2)
return self.a2
def back_propagation(self, X, y, output):
self.d2 = output - y
self.d1 = np.dot(self.d2, self.weights2.T) * sigmoid_derivative(self.a1)
self.weights2 -= np.dot(self.a1.T, self.d2)
self.bias2 -= np.sum(self.d2, axis=0, keepdims=True)
self.weights1 -= np.dot(X.T, self.d1)
self.bias1 -= np.sum(self.d1, axis=0)
def train(self, X, y, epochs, learning_rate):
for epoch in range(epochs):
output = self.forward_propagation(X)
self.back_propagation(X, y, output)
if epoch % 1000 == 0:
loss = np.mean(np.square(y - output))
print(f'Epoch {epoch}, Loss: {loss}')
# 示例数据
X = np.array([, , , ])
y = np.array([, , , ])
# 创建BP神经网络实例
nn = BPNeuralNetwork(2, 4, 1)
# 训练神经网络
nn.train(X, y, epochs=10000, learning_rate=0.1)
# 测试神经网络
test_output = nn.forward_propagation(X)
print("预测结果:", test_output)上述代码定义了一个包罗输入层(2 个神经元)、隐藏层(4 个神经元)和输出层(1 个神经元)的 BP 神经网络,通过训练可以学习到异或逻辑关系。
四、BP 神经网络的应用与范围
(一)应用范畴
BP 神经网络广泛应用于图像识别、语音识别、自然语言处理处罚、数据预测等多个范畴。比方在图像识别中,它可以学习图像的特性,实现对差别物体的分类;在数据预测中,能根据汗青数据预测将来趋势。
(二)范围性
[*]易陷入局部最优:由于接纳梯度降落法举行优化,BP 神经网络在训练过程中轻易陷入局部最优解,导致模子无法找到全局最优的权重参数,影响预测效果。
[*]训练时间长:随着网络层数和神经元数量的增长,BP 神经网络的训练时间会明显增长,尤其是在处理处罚大规模数据时,盘算资源和时间本钱较高。
[*]对参数敏感:网络布局、学习率、隐藏层神经元数量等参数的选择对模子性能影响很大,需要通过大量实验举行调优,增长了模子训练的难度和复杂性。
五、总结
BP 神经网络作为神经网络发展史上的重要算法,为深度学习的繁荣奠定了根本。通过本文对其原理、布局、代码实现、应用及范围的先容,信赖你对 BP 神经网络有了更深入的明白。只管它存在一些范围性,但随着技术的不断发展,各种改进方法和优化计谋不断涌现,BP 神经网络仍旧在浩繁范畴发挥着重要作用,值得我们一连深入研究和探索。
以上博客全面出现了 BP 神经网络的知识。假如你想相识 BP 神经网络的改进方法,或者针对特定应用场景深入探究,欢迎随时分享你的想法。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]