关于神经网络的一个介绍

news2024/9/22 21:05:06

这篇文章中,我将简单介绍下与神经网络有关的东西,包括它的基本模型,典型的算法以及与深度学习的联系等内容。

一、神经元

神经网络是由许多个神经元组成的,在生物的神经网络中,就是神经元间相互连接,传递信号,改变其的电位;并且在某神经元的电位超过一个“阈值”后就会被激活,也就是会“兴奋”起来,而再向其他神经元发送化学物质。而对于生物神经网络进行抽象就会得到“M-P神经元模型”。如下图,就可以说是一个神经元模型:

其中,input表示输入,weight表示权重,就是神经元接收信号时的权重,而bias则是一个偏置项,用来调整拟合程度。

在神经网络中,大部分神经元总是存在一个激活函数,它可以控制输出范围,不同激活函数有不同的输出范围,就像sigmoid函数,它就可以将输出结果控制在0到1间,此外,激活函数还可以影响梯度计算、以及可以引入非线性因素等,从而可以影响权重的计算方式以及使得神经网络可以逼近任意复杂度的函数计算等。

二、感知机

1.1 感知机

如果用两层神经元进行组合,就可以等到“感知机”。它能容易地实现与、或、非操作。不过,我们要知道这些与、或、非操作都是线性可分的,如果是非线性可分的话,则要考虑多层功能神经元了。如下图,就是一个简单的用graphviz画的感知机模型:

其中,x1,x2所在层就是输入层,它们指向的就是输出层。

画出它的代码如下:

from graphviz import Digraph
from imageio import imread
import matplotlib.pyplot as plt


ax = plt.gca()
mygraph = Digraph(node_attr={'shape':'circle'},edge_attr={'labeldistance':'10.5'},format="png")
mygraph.node("0","x1")
mygraph.node("1","x2")
mygraph.node("2"," ")
mygraph.node('output'," ", color='none', style='filled', fillcolor='none')
mygraph.edge("0","2",label="w1")
mygraph.edge("1","2",label="w2")
mygraph.edge("2","output", label="y")
mygraph.render("tmp")
ax.imshow(imread("tmp.png"))
ax.set_axis_off()
plt.show()

在这个感知机中,当前的输出可以看为\hat{y},而对于训练样例(x,y)中,则可以发生这样一个调整:

w_{i}\leftarrow w_{i}+\bigtriangleup w_{i}\\ \bigtriangleup w_{i}=\eta (y-\hat{y})x_{i}

其中的η可以被称为“学习率”。从中,我们可以发现,如果对于样例的预测正确,那么感知机就不会发生变化,反之则将会对于错误的程度将感知机的权重进行调整。

1.2 多层前馈神经网络

如果我们在感知机的基础上加入了一层或多层的隐藏层,那么这个神经网络模型就会变为“多层前馈神经网络”。其中,输入层神经元会接收外界的输入,隐藏层则会对信号进行加工,最终输出层进行输出.

三、BP算法

BP算法也叫误差逆传播算法,它是指先由前到后正常地传播一次,然后计算误差得到损失函数,然后再向后传播,并将神经元的权重进行更新,如此这样迭代到目标次数,或是某一值的最低标准。

在如图的一个神经网络模型中,x层为输入层,b层的隐藏层,y层为输出层。

那么在图中的第h个隐藏神经元的输入就是:\alpha _{h}=\sum_{i=1}^{d}v_{ih}x_{i},在第j个输出神经元的输入为:\beta _{j}=\sum_{h=1}^{q}w_{hj}b_{h}。网络在(x_{k},y_{k})上就会存在一个均方误差:E_{k}=\frac{1}{2}\sum_{j=1}^{l}(\hat{y}_{j}^{k}-y_{j}^{k})^2

BP算法的目标是要最小化训练集D上的累计误差,所有可以有:E=\frac{1}{m}\sum_{k=1}^{m}E_{k}。在标准BP算法中,更新的规则是基于单个的E_{k}推导而来的,如果推导出这样的累计误差,那么就得到了累计误差逆传递算法。标准BP算法与累计BP算法都会经常用到,但标准算法只针对单个的样例,所以参数会更新的很频繁,而导致出现“抵消”现象,所以为此标准算法就需要更多的迭代次数。

我们回到刚才的神经网络模型中,我们在知道了E_{k}后就可以算得\bigtriangleup w_{hj},可以说它由两部分组成,一部分是学习率η,另一部分是\frac{\partial E_{k}}{\partial w_{hj}},不过与这整体的是反比的关系就是说要在它俩组合后的式子前加上负号。对于它的第二部分,即\frac{\partial E_{k}}{\partial w_{hj}},我们可以将之分解,具体的可以参考西瓜书P103的公式,在分解后又可以分为两部分,一部分因为sigmoid的特殊性质,即其导数等于原函数与1减原函数的积而可变形为:-g_{i}=\hat{y}_{j}^{k}(1-\hat{y}_{j}^{k})(y_{j}^{k}-\hat{y}_{j}^{k}),而另一部分则变为b_{n},如此考虑之前的学习率部分,整体就会是这样:

\bigtriangleup w_{hj}=\eta g_{i}b_{h}

同样的,我们可以陆续得到:\bigtriangleup\theta _{j}\bigtriangleup v_{ih}

BP算法有着强大的表示能力,但也因此时常发生过拟合的问题,所以为了解决这个问题,有两个策略,一是“早停”,二是“正则化”,在早停策略中,是将数据集分为训练集与验证集,其中的验证集用来估计误差,如果训练集的误差降低,但验证集的误差反而上升时,那么就要停止训练了,并返回最小验证集误差的连接权与阈值;而正则化则是对于误差目标函数进行改造,往其中增加一个用于描述网络复杂程度的部分。

四、全局最小与局部最小

用E来表示神经网络上的误差时,神经网络的训练过程就可以看作是一个参数寻优过程,去寻找一个最优参数使得E最小。但此时,在训练中会遇到局部最小,而局部最小不一定是全局最小,我们要找的则是全局最小,所以此时可能就会寻找错误,为此我们有一些算法来帮助我们跳出这个局部最小来,这些算法分别是模拟退火算法、遗传算法、随机梯度下降算法以及以多组不同参数值来初始多个神经网络并从结果中寻找答案。

五、其他神经网络

除了上述的神经网络模型外,还有以下这些神经网络:

5.1 RBF网络

RBF网络也叫径向基函数,它是一种单隐层前馈神经网络,广泛应用于模式识别、函数逼近和分类问题中。RBF网络利用径向基函数作为隐藏层的激活函数,这些函数通常是对称的,如高斯函数。其中高斯函数的形式如下:

5.2 ART网络

ART网络也叫自适应谐振理论网络,它是竞争型学习的重要代表,它由比较层、识别层、识别阈值和重置模块这四部分组成。其中关于竞争型学习,其核心思想是让网络中的神经元为一个给定的输入样本“竞争”,以决定哪个神经元应该被激活。在这一过程中,最接近输入样本的神经元(通常称为获胜神经元)会得到强化,而其他神经元则不会更新或更新程度较小。

5.3 SOM网络

SOM网络也叫自组织映射网络,也是一种竞争型学习的无监督神经网络,它能将高维输入数据映射到低维空间中,并同时保持输入数据在高维空间的拓扑结构。

5.4 级联相关网络

级联相关网络是一种人工神经网络架构。它的设计目的是克服传统多层感知器(MLP)在训练过程中遇到的一些问题,如容易陷入局部极小值、训练速度慢等。级联相关网络的特点在于它可以动态地增加隐藏单元,并且保证每次增加单元后,网络性能都有所提升。

也就是说,在寻常的神经网络中,其网络模型结构通常是固定的,而在这个网络中,网络结构也会是学习的目标之一,所以在学习的过程中,该网络会增加一些隐藏节点,因此,它无需设置网络层数、隐藏神经数目,且训练速度也较快,但相对的,它在数据较小时容易发生过拟合。

5.5 Elman网络

如果我们在前馈神经网络的基础上增加了递归的部分,那么就诞生了“递归神经网络”。而Elman网络就是最常见的递归神经网络之一。其结构如图:

六、深度学习

深度学习是神经网络的一个子领域,专注于构建和训练深层神经网络(具有多个隐藏层的神经网络)。深度学习的目标是通过大量的数据和计算资源来学习复杂的特征表示,从而实现更高级别的任务。

深度学习继承了传统神经网络的基本架构和训练方法,并在此基础上进行了扩展和改进。可以说深度学习就是具有更多隐藏层的神经网络。

七、python代码

最后,我们还是用神经网络算法在iris数据集上直接引用aklearn函数库来实践下,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report

# 加载数据并分割
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)

# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 构建神经网络
mlp = MLPClassifier(hidden_layer_sizes=(10, 10), max_iter=1000)
mlp.fit(X_train,y_train)

# 预测与评估
y_pre = mlp.predict(X_test)
accuracy = accuracy_score(y_test,y_pre)
report = classification_report(y_test,y_pre)
print("The accuracy is: {}".format(accuracy))
print("The report is: {}".format(report))

其结果如下:

The accuracy is: 1.0
The report is:               precision    recall  f1-score   support

           0       1.00      1.00      1.00        15
           1       1.00      1.00      1.00        11
           2       1.00      1.00      1.00        12

    accuracy                           1.00        38
   macro avg       1.00      1.00      1.00        38
weighted avg       1.00      1.00      1.00        38

(补充:在这篇文章中,整体的结构与介绍都与西瓜书的无异,因为这篇就是根据我这几日自学西瓜书时所作的笔记来写的,所以有些不同的地方是我自己的想法,故而可能会有差错,希望见到的人能告知于我)

此上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arthas getstatic(查看类的静态属性 )

文章目录 二、命令列表2.1 jvm相关命令### 2.1.7 getstatic(查看类的静态属性 ) 二、命令列表 2.1 jvm相关命令 ### 2.1.7 getstatic(查看类的静态属性 ) 使用场景: 我们项目部署在linux上,我有个本地内存…

从一到无穷大 #35 Velox Parquet Reader 能力边界

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言源码分析功能描述功能展望 引言 InfluxDB IOX这样完全不使用索引,只…

《沧浪之水》读后感

未完待续..... 未完待续.... 未完待续.... 【经典语录】 01、我一辈子的经验就是不要做瞎子,也不能做聋子,该听到的信息要听到,但是要做哑巴,看到了听到了心中有数就行了,可千万不要张口说什么。 02、你刚从学校毕业…

MQ入门(一):同步调用和异步调用--RabbitMQ基础入门

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装部署 2.2.RabbitMQ基本架构 2.3.收发消息 2.3.1.交换机 2.3.2.队列 2.3.3.绑定关系 2.3.4.发送消息 2.4.数据隔离 2.4.1.用户管理 2.4.2.virtual host 1.初识MQ 微服务一旦拆分&…

web前端字段大小写下划线转换工具

文章目录 前言一、如何使用?二、相关代码总结 前言 程序员在敲代码的过程中都要命名一些字段,但是Java语言对字段的命名规范和sql命名规范不一样,如下图所示,这种机械性的转换工作很劳神费力,为了省点劲写了一个web小…

尚品汇-Jenkins部署构建服务模块、Linux快照备份(五十七)

目录: (1)构建作业(server-gateway) (2)构建service_product模块 (3)演示添加新代码 (4)学会使用linux快照 (1)构建作…

在SpringCloud中实现服务间链路追踪

在微服务架构中,由于系统的复杂性和多样性,往往会涉及到多个服务之间的调用。当一个请求经过多个服务时,如果出现问题,我们希望能够快速定位问题所在。这就需要引入链路追踪机制,帮助我们定位问题。 Spring Cloud为我们…

【沪圈游戏公司作品井喷,游戏产业复兴近在眼前】

近期财报季中,腾讯、网易及B站等国内游戏巨头纷纷亮出亮眼的游戏业务表现,均实现了接近或超越双位数的同比增长。然而,审视过去一年,国内游戏行业仍笼罩在宏观经济“降本增效”的阴影下。 行业数据揭示,全国游戏公司社…

封装 wx.request 的必要性及其实现方式

目录 为什么需要封装 wx.request 1. 避免回调地狱 2. 统一管理 3. 扩展功能 小程序异步 API 的改进 封装实现方式 在小程序开发中,网络请求是不可或缺的功能之一。小程序提供了 wx.request API 来实现网络请求,但直接使用这个 API 在复杂场景下可…

关于SpringBoot项目使用maven打包由于Test引起的无法正常打包问题解决

一、问题描述 在日常工作中,在接手项目时,项目未必是“正常”的,一般平常搭建项目,都不会采用一键式生成的方式,现在说下旧项目,可能项目结构并不是那么简洁,通常都带有与main同层级的test&…

Cpp类和对象(中续)(5)

文章目录 前言一、赋值运算符重载运算符重载赋值运算符重载赋值运算符不可重载为全局函数前置和后置的重载 二、const修饰成员函数三、取地址及const取地址操作符重载四、日期类的实现构造函数日期 天数日期 天数日期 - 天数日期 - 天数日期类的大小比较日期类 > 日期类日…

嵌入式系统stm32cube本地安装出现的问题

stm32cube在线安装很慢,本地安装中出现的一个bug stm32cube_fw_f4_v1281安装成功之后,如果想安装stm32cube_fw_f4_v1281会提示stm32cube_fw_f4_v1280未安装。 如果先安装stm32cube_fw_f4_v1280之后,再安装stm32cube_fw_f4_v1281还会提示这个…

Python模拟鼠标轨迹[Python]

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。 二.鼠标轨迹算法实…

C#如何把写好的类编译成dll文件

1 新建一个类库项目 2 直接改写这个Class1.cs文件 3 记得要添加Windows.Forms引用 4 我直接把在别的项目中做好的cs文件搞到这里来,连文件名也改了(FilesDirectory.cs),这里using System.Windows.Forms不会报错,因为前…

go项目多环境配置

1.java项目配置加载最佳实践 在 Spring Boot 项目中,配置文件的加载和管理是开发过程中不可或缺的一部分。Spring Boot 提供了一套灵活且强大的机制来加载配置文件,使得开发者能够根据不同的环境和需求轻松地管理配置。当多个位置存在相同的配置文件时&…

Python语法进阶之路

一、Python基础 1.1 注释 定义和作用 对代码解释说明,增强可读性 单行注释 # 多行注释 """ 这是一个多行注释 """ 1.2 变量及变量类型 定义和作用 计算机目的是计算,编程是为了更方便计算,计算对象就是…

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时,常常会有以下情况:要展示的内容太多,但展示空间有限,比如我们要在页面的一部分空间中展示较多的内容放不下,通常会有两种解决方式:分页,“更多”按钮。 今天我们的案例用于…

mybatis 配置文件完成增删改查(二):根据条件查询一个

文章目录 参数占位符#{}:会将其替换为? ——为了防止sql注入${}:会将其替换为实际接收到的数据,拼sql ——无法防止sql注入 查询一个sql特殊字符的处理 参数占位符 #{}:会将其替换为? ——为了防止sql注入 ${}:会将其替换为实际接收到的数据…

Java继承教程!(o|o)

Java 继承 Java面向对象设计 - Java继承 子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。 从另一个类继承一个类非常简单。我们在子类的类声明中使用关键字extends,后跟超类名称。 Java不支持多重继承的实现。 Java中的类不能有多个超类。…

Linux-gcc/g++

系列文章目录 C语言中的编译和链接 文章目录 系列文章目录一、编译过程gcc如何完成过程在这里涉及到一个重要的概念:函数库 二、动态库、静态库2.1 函数库一般分为静态库和动态库两种。 三、gcc选项gcc选项记忆 一、编译过程 具体过程在这一片c语言文章中讲解过:C语言中的编…