多层前馈神经网络及BP算法

多层,前馈,神经网络,bp,算法 · 浏览次数 : 169

小编点评

**一、多层前馈神经网络关系概述** 多层前馈神经网络是具有多个隐藏层的神经网络类型。它们通过从输入层到输出层逐渐进行计算来进行预测。 * **输入层**:接收原始数据。 * **隐藏层**:包含多个隐藏层,每个隐藏层都与输入层和输出层之间建立联结。 * **输出层**:负责模型的最终预测。 **二、BP算法详解** BP算法是一种反向传播算法,用于训练多层前馈神经网络。该算法通过计算误差并对权重和偏置进行调整来让神经网络学习。 1. **初始化权重和偏置**: - 权重:随机初始化为小随机数。 - 偏置:随机初始化为小随机数。 2. **前向传播**: - 给定隐藏层或输出层的单元,计算其净输入。 - 权重:从上一层单元到当前单元的连接权重。 - 偏置:从单元的偏置到当前单元。 - 计算单元的输出。 3. **后向传播误差**: - 误差:输出层单元的实际输出与训练元组的已知目标值之间的差异。 - 误差用于计算隐藏层单元的误差。 - 隐藏层单元的误差用于计算权重的更新。 4. **权重更新**: - 权重的改变量:学习率乘以隐藏层单元的误差。 - 权重的更新:权重 += 更新量。 5. **偏置更新**: - 偏置的改变量:学习率乘以隐藏层单元的误差。 - 偏置的更新:偏置 += 更新量。 6. **实例更新和周期更新**: - 实例更新:在每处理一个样本时更新权重和偏置。 - 周期更新:在训练集中所有样本结束后更新权重和偏置。 **三、Python实现BP神经网络** ```python # 定义学习率 learning_rate = 0.9 # 设置第一个训练元组 first_sample_data = ... # 获取训练元组数据 first_sample_label = 1 # 获取训练元组的类标号 # 初始化权重和偏置 weights = ... biases = ... # 计算每个神经元的净输入和输出 net_input = ... net_output = ... # 计算每个神经元的误差 errors = ... # 更新权重和偏置 weights += learning_rate * errors * net_input biases += learning_rate * errors ``` **四、示例代码** 这是一个基础的三层BP神经网络示例,但缺少偏置和学习率等参数的设置: ```python # 定义权重和偏置 weights = np.random.randn(3, 10) # 3 个输入神经元,10 个隐藏层神经元 biases = np.random.randn(10) # 计算每个神经元的净输入和输出 net_input = np.random.randn(3, 10) net_output = np.dot(weights, net_input) + biases # 计算每个神经元的误差 errors = np.linalg.norm(net_output - target_values)**2 # 更新权重和偏置 weights -= learning_rate * errors * net_input biases -= learning_rate * errors ```

正文

一.多层前馈神经网络
首先说下多层前馈神经网络,BP算法,BP神经网络之间的关系。多层前馈[multilayer feed-forward]神经网络由一个输入层、一个或多个隐藏层和一个输出层组成,后向传播(BP)算法在多层前馈神经网络上面进行学习,采用BP算法的(多层)前馈神经网络被称为BP神经网络。给出一个多层前馈神经网络的拓扑结构,如下所示: 图1 多层前馈神经网络 神经网络的拓扑结构包括:输入层的单元数、隐藏层数(如果多于一层)、每个隐藏层的单元数和输出层的单元数。神经网络可以用于分类(预测给定元组的类标号)和数值预测(预测连续值输出)等。

二.后向传播(BP)算法详解
1.初始值权重
神经网络的权重被初始化为小随机数,每个神经元都有一个相关联的偏置,同样也被初始化为小随机数。
2.前向传播输入
以单个神经网络单元为例,如下所示: 这里写图片描述 给定隐藏层或输出层的单元,到单元的净输入,如下所示:

其中,是由上一层的单元到单元的连接的权重;是上一层的单元的输出;是单元的偏置。需要说明的是偏置充当阀值,用来改变单元的活性。 给定单元的净输入,单元的输出,如下所示:

3.后向传播误差
(1)对于输出层单元,误差用下式计算:

其中,是单元的实际输出,而给定训练元组的已知目标值。需要说明的是,是逻辑斯缔函数的导数。
(2)对于隐藏层单元,它的误差用下式计算:

其中,是由下一较高层中单元到单元的连接权重,而是单元的误差。
(3)权重更新,如下所示:

其中,是权重的改变量,变量是学习率,通常取0.0和1.0之间的常数值。
(4)偏置更新,如下所示:

其中,的改变量。

(5)权重和偏置更新
如果每处理一个样本就更新权重和偏置,称为实例更新(case update);如果处理完训练集中的所有元组之后再更新权重和偏置,称为周期更新(epoch update)。理论上,反向传播算法的数据推导使用周期更新,但是在实践中,实例更新通常产生更加准确的结果。
说明:误差反向传播的过程就是将误差分摊给各层所有单元,从而获得各层单元的误差信号,进而修正各单元的权值,即权值调整的过程。
4.终止条件
如果满足条件之一,就可以停止训练,如下所示:
(1)前一周期所有的都太小,小于某个指定的阀值。
(2)前一周期误分类的元组百分比小于某个阀值。
(3)超过预先指定的周期数。
实践中,权重收敛可能需要数十万个周期。神经网络的训练有很多的经验和技巧,比如可以使用一种称为模拟退火的技术,使神经网络确保收敛到全局最优。

三.用BP训练多层前馈神经网络
举个例子具体说明使用BP算法训练多层前馈神经网络的每个细节,如下所示: 这里写图片描述 设置学习率为0.9,第一个训练元组为,其类标号为1。神经网络的初始权重和偏置值如表1所示: 这里写图片描述 根据给定的元组,计算每个神经元的净输入和输出,如表2所示: 这里写图片描述 每个神经元的误差值如表3所示: 这里写图片描述 说明:从误差的计算过程来理解反向(BP)传播算法也许更加直观和容易。 权重和偏置的更新如表4所示: 这里写图片描述 说明:将该神经网络模型训练好后,就可以得到权重和偏执参数,进而做二分类。

四.用Python实现BP神经网络[3]
神经网络拓扑结构,如下所示: 这里写图片描述 解析:
1.第33和35行:l1和l2分别表示第1层和第2层神经元的输出。(第0层表示元组输入)
2.第37行:l2_error与相对应。
3.第40行:l2_delta与输出层误差相对应。
4.第42行:l1_error与相对应。
5.第43行:l1_delta与隐藏层误差相对应。
6.第45行:l1.T.dot(l2_delta)与相对应,而syn1与相对应。
7.第46行:l0.T.dot(l1_delta)与相对应,而syn0与相对应。
说明:一边代码,一边方程,做到代码与方程的映射。这是一个基础的三层BP神经网络,但是麻雀虽小五脏俱全。主要的不足有几点:没有考虑偏置;没有考虑学习率;没有考虑正则化;使用的是周期更新,而不是实例更新(一个样本)和批量更新(m个样本)。但是,足以理解前馈神经网络和BP算法的工作原理。神经网络和BP算法的详细数学推导参考[5]。

参考文献:
[1]数据挖掘:概念与技术[第三版] [2]使用Python构造神经网络:http://www.ibm.com/developerworks/cn/linux/l-neurnet/
[3]一个11行Python代码实现的神经网络:http://python.jobbole.com/82758/
[4]用BP人工神经网络识别手写数字:http://blog.csdn.net/gzlaiyonghao/article/details/7109898
[5]反向传导算法:http://ufldl.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95

与多层前馈神经网络及BP算法相似的内容:

多层前馈神经网络及BP算法

一.多层前馈神经网络 首先说下多层前馈神经网络,BP算法,BP神经网络之间的关系。多层前馈[multilayer feed-forward]神经网络由一个输入层、一个或多个隐藏层和一个输出层组成,后向传播(BP)算法在多层前馈神经网络上面进行学习,采用BP算法的(多层)前馈神经网络被称为BP神经网络

鸿蒙HarmonyOS实战-ArkTS语言基础类库(XML)

前言 数据传输的数据格式有以下几种常见的格式: JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可读性高且易于解析。它使用键值对的方式表示数据,并且支持多层嵌套。 XML(eXtensible Markup Language):XML是一种标

[转帖]如何利用wrarp测试oss性能?

https://zhuanlan.zhihu.com/p/529735003 前言 我们利用mino与ceph rgw搭建好的oss经过多层网络转发,传输速度必定有所折损,这个时候我们使用wrap来测试oss对象存储的真实性能。 利用wrarp测试oss性能 wrarp是minio项目下的一个开源测

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.CUDA 解析:2007年,NVIDIA推出CUDA(Compute Unified Device Architecture,统一计算设

CUDA C编程权威指南:1.2-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.闭扫描和开扫描 对于一个二元运算符和一个元输入数组。如果返回输出数组为,那么是闭扫描;如果返回输出数组为,那么是开扫描。串行闭扫描算法,

CUDA C编程权威指南:1.3-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.CUDA数组 解析:CUDA数组是使用cudaMallocArray()、cudaMalloc3DArray()分配的,使用cudaFr

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的。 1.shared_ptr 解析:shared_ptr是一种计数指针,当引用计数变为0时,shared_ptr所指向的对象将会被删除。如下所示

Boost程序库完全开发指南:1.2-C++基础知识点梳理

主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的。 1.const_cast (expression)[1] 解析:const_cast转换符用来移除变量的const或v

[转帖]一文读懂美国的出口管制

https://zhuanlan.zhihu.com/p/568211990 一年多前小白写过一文读懂什么是制裁?,这篇出口管制的文章其实也是酝酿了很久,终于跟小白的粉丝们见面了,喜欢请记得点赞收藏哦♥️♥️♥️。 简单来说,出口管制主要管制美国的物项,不能“落入”某些不符合美国经济外交国家安全利益

[转帖]自动化配置SSH免密登录和取消SSH免密配置脚本

1. 前文 搭建了一套有多台主机的局域网环境,不完全考虑安全性的情况下,为方便管理局域网内主机,配置SSH免密登录,因主机较多,前阵子针对配置ssh免密和取消ssh免密功能单独写了脚本来自动化批量部署,现把两个功能封装在一起做成交互式程序 2.实现代码 #!/bin/bash #Author:cos