基于 Python 实现的BP神经网络算法【100011188】

1 BP 神经网络

1.1 算法介绍

反向传播(英语:Backpropagation,缩写为 BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。反向传播要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法。反向传播要求人工神经元(或“节点”)的激励函数可微。

下面举一个简单的例子来介绍什么是梯度下降法以及如何训练神经网络。

假设有这样一个函数(ε 是噪声)

但我们不知道参数的值,也就是 w 和 b 的值,但是我们直到很多(x,y)。那么我们可以通过这些值来预测原函数。

构造如下的损失函数

其中的 x 和 y 都是真实值,而 w 和 b 是我们要预测的值。我们预测的 w 和 b 应该使得损失函数越小越好,这点不难看出,损失函数越小证明我们预测出来的函数越接近真实情况。

假设我们得到的 loss 函数图像如上图所示,那么我们得目的就是找到一组 w 和 b 使得 loss 函数值处于一个极小值。

约定 w 和 b 按照上面得式子更新自己的值。其中 w 和 b 是原来的值,w’和 b’是新值,lr 是 learning rate 的缩写,直观理解就是横坐标移动的程度。根据高等数学的相关知识,我们知道函数梯度的方向指向极大值,所以上面式子用减号,也就达到了梯度下降的目的。梯度下降可以使得 loss 函数处于极小值。当然处于极小值不一定是处于最小值,可能会造成局部最优解,但这些问题超出了本篇实验报告的讨论范围,所以不作考虑。

经过若干次的更新 w 和 b,我们就会找到一个较小的 loss 值,也就是说我们找到的 w 和 b 就很接近真实值了。

梯度下降是一种常用的优化 loss 函数的方法,还有其他的方法也可以对 loss 函数进行优化,例如随机梯度下降、Adagrad、Adam 等。

下面介绍应用 BP 算法完成手写体识别问题。MNIST 数据集的每一张图片是一个 28x28 的矩阵,每个元素是其位置的灰度信息。

我们首先将二维的矩阵打平成一维的,也就是说变成一个 784x1 的矩阵。上面介绍的简单的例子是单个数字,这里成了矩阵,所以我们的参数也应该是矩阵。

假设我们先将 784x1 的矩阵乘以一个 512x784 的矩阵参数,将得到一个 512x1 的矩阵

再将 512x1 的矩阵乘以一个 256x512 的矩阵参数,将得到一个 256x1 的矩阵

再将 256x1 的矩阵乘以一个 10x256 的矩阵参数,将得到一个 10x1 的矩阵

经过上述操作,我们将一个 784x1 的矩阵转换成了一个 10x1 的矩阵。为什么最后要转换成 10 个元素的矩阵?因为我们的手写体识别问题中有 10 个数字,最后我们得到的矩阵的每个元素代表的是可能是相应数字的概率。根据得到的概率和实际情况来构造损失函数,再利用梯度下降的方法来更新参数。

上述的好几步的矩阵转换操作实际上就是神经网络中的层,最后一步的 10 个元素属于输出层,第一次的 784x1 是输入层,中间的则是隐藏层。

1.3 实验结果

可以看出经过 1000 次的训练,模型识别手写体的准确度达到了 0.9166

1.4 实验总结

BP 神经网络的原理并不难,可以自行手动实现,但使用 TensorFlow 不仅方便,而且有更高的效率。

Python 的数值计算效率并不高,要实现高效的数值运算一般会使用 NumPy 这样的库,将运算放到外部其他语言封装好的程序中,以此来完成高效运算。但是从外部计算切换回 Python 的每一个操作,仍然是一个很大的开销。

TensorFlow 也把复杂的计算放在 Python 之外完成,但是为了避免前面说的那些开销,它做了进一步完善。Tensorflow 不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在 Python 之外运行。

♻️ 资源

在这里插入图片描述

大小: 11.0MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87547869
注:如当前文章或代码侵犯了您的权益,请私信作者删除!

猜你喜欢

转载自blog.csdn.net/s1t16/article/details/131321077