当前位置: 首页 > news >正文

机器学习第五章-神经网络

目录

5.1神经元模型

5.2感知机与多层网络

5.3误差逆传播算法(BP)

5.4全局最小与局部极小

5.5其他常见的神经网络

5.5.1RBF网络

5.5.2ART网络

5.5.3SOM网络

5.5.4级联相关网络

5.5.5Elman网络

5.5.6Boltzmann 机


5.1神经元模型

        神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。

        神经网络中最基本的成分是神经元模型。在生物神经网络中每个神经元与其他神经元相连,当它兴奋时, 就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阔值,那么它就会被激活兴奋起来,向其他神经元发送化学物质。

        一直沿用至今的是 "M-P 神经元模型“,如下图所示:
        神经元会接收外界的n个输入信号,这些输入会与带权重的连接传递,再通过“激活函数”对信号进行处理从而产生神经元的输出。
        理想的激活函数是阶跃函数,其将输入值映射为输出值0或1,但是因为其不连续、不光滑的性质,实际常用sigmoid函数作为激活函数,有时也将sigmoid函数叫做挤压函数。阶跃函数和sigmoid函数如下所示:

5.2感知机与多层网络

        感知机由两层神经元组成,输入层接收外界输入信号后传递给输出层, 输出 层是 M-P 经元,亦称"阔值逻辑单元",结构示意图如下:
                                        
        更一般地,给定训练数据集,权重w_{i}(i=1,2, \ldots, n)以及阈值\theta可通过学习得到.
        感知机学习规则非常简单,对训练样例忡(x,y) 若当前感知机的输出为\hat{y},则感知机权
重将这样调整:
                                w_{i} \leftarrow w_{i}+\Delta w_{i}
                                \Delta w _ { i } = \eta ( y - \hat { y } ) x _ { i }
其中\eta为学习率.
        感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限.所以应该采用多层功能神经元,如下图所示,输出层与输入层之间有一层神经元,被称为隐居或隐含层,隐含层和输出层神经元都是拥有激活函数的功能神经元.
多层神经元结构图如下:
                

5.3误差逆传播算法(BP)

        误差逆传播算法是更强大的学习算法,BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整。学习率控制着算法每一轮迭代中的更新步长,太长会导致震荡,太短会导致收敛速度过慢。其基本流程如下图所示:

BP 算法的目标是要最小化训练集 D上的累积误差:
                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        E = \frac { 1 } { m } \sum _ { k = 1 } ^ { m } E _ { k }
        一般来说,标准 BP算法每次更新只针对单个样例,累积 BP 算法直接针对累积误差最小化.
实际应用中经常靠“试错法”来调整设置隐层神经元的个数。一般用两种策略来缓解BP网络的过拟合:
        一,“早停”:将数据分成训练集和验证集,训练、集用来计算梯度、更新连接权和阔值,验证集用来估计误差,若训练集误差降低但验证集误差升高?则停止训练,同时返回具有最小验证集误差的连接权和阑值.
        二,“正则化”:在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阔值的平方和.仍令 Ek 表示第 k个训练样例上的误差,w_{i}表示连接权和阙值,则误差目标函数改变为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​   E=\lambda \frac{1}{m} \sum_{k=1}^{m} E_{k}+(1-\lambda) \sum_{i} w_{i}^{2}
下面是一个简单的示例,展示了如何使用Python实现一个基本的误差逆传播算法来训练一个神经网络。这个示例使用了NumPy库来进行矩阵运算,假设我们要训练一个简单的多层感知机(MLP)来解决二分类问题:
import numpy as np# 定义sigmoid函数及其导数
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 定义神经网络类
class NeuralNetwork:def __init__(self, input_size, hidden_size, output_size):# 初始化权重self.weights_input_hidden = np.random.randn(input_size, hidden_size)self.weights_hidden_output = np.random.randn(hidden_size, output_size)def forward(self, inputs):# 前向传播self.hidden_input = np.dot(inputs, self.weights_input_hidden)self.hidden_output = sigmoid(self.hidden_input)self.output = sigmoid(np.dot(self.hidden_output, self.weights_hidden_output))return self.outputdef backward(self, inputs, targets, learning_rate):# 反向传播output_error = targets - self.outputoutput_delta = output_error * sigmoid_derivative(self.output)hidden_error = output_delta.dot(self.weights_hidden_output.T)hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output)# 更新权重self.weights_hidden_output += self.hidden_output.T.dot(output_delta) * learning_rateself.weights_input_hidden += inputs.T.dot(hidden_delta) * learning_ratedef train(self, inputs, targets, epochs, learning_rate):for epoch in range(epochs):for i in range(len(inputs)):output = self.forward(inputs[i])self.backward(inputs[i], targets[i], learning_rate)if epoch % 1000 == 0:print(f"Epoch {epoch}: Error = {np.mean(np.square(targets - self.forward(inputs)))}")# 示例用法
if __name__ == "__main__":# 输入数据和对应的标签(二分类问题)inputs = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])targets = np.array([[0], [1], [1], [0]])# 创建神经网络实例neural_network = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)# 训练神经网络neural_network.train(inputs, targets, epochs=10000, learning_rate=0.1)# 测试神经网络(示例输出)test_inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])for input in test_inputs:print(f"Input: {input}, Predicted Output: {neural_network.forward(input)}")

5.4全局最小与局部极小

        若用 E表示神经网络在训练集上的误差,则它显然是关于连接权\omega 和阈值\theta的函数.此时,神经网络的训练过程可看作一个参数寻优过程 ,即在参数空间中,寻找一组最优参数使得E最小.
观察下图可以明显看出全局最小和局部极小的区别:
        ​​​​​​​        
"全局最最小"一定是"局部极小”,反之不成立。
        基于梯度的搜索是使用最广泛的参数寻优方法,梯度下降法的主要思想就是沿着负梯度方向去搜索最优解,负梯度方向是函数值下降最快的方向,若迭代到某处的梯度为0,则表示达到一个局部最小,参数更新停止。因此在现实任务中,通常使用以下策略尽可能地去接近全局最小:
        1:以多组不同参数值初始化多个神经网络,取其中误差最小的解作为最终参数.
        2:使用 "模拟退火" 技术,每一步都以一定的概率接受比当前解更差的结果
        3:使用随机梯度下降,随机梯度下降法在计算梯度时加入了随机因素,即便陷入局部极小点,它计算出的梯度仍可能不为零。
        此外, 遗传算法也常用来训练神经网络以更好地逼近全局最小。
        下面实验代码演示了如何使用梯度下降算法来寻找一个函数的全局最小值和局部最小值。这里假设我们要优化的函数是一个简单的二次函数 f(x)=x^{4}-3x^{3}+2:
import numpy as np
import matplotlib.pyplot as plt# 定义函数及其导数
def f(x):return x**4 - 3*x**3 + 2def f_derivative(x):return 4*x**3 - 9*x**2# 梯度下降算法找到最小值
def gradient_descent(starting_point, learning_rate, epochs):x = starting_pointfor epoch in range(epochs):gradient = f_derivative(x)x = x - learning_rate * gradientreturn x, f(x)# 寻找全局最小值
global_min_point, global_min_value = gradient_descent(starting_point=0.0, learning_rate=0.01, epochs=1000)# 寻找局部最小值(不同初始点)
local_min_point1, local_min_value1 = gradient_descent(starting_point=-1.0, learning_rate=0.01, epochs=1000)
local_min_point2, local_min_value2 = gradient_descent(starting_point=2.0, learning_rate=0.01, epochs=1000)# 输出结果
print(f"Global Minimum: Point = {global_min_point}, Value = {global_min_value}")
print(f"Local Minimum 1: Point = {local_min_point1}, Value = {local_min_value1}")
print(f"Local Minimum 2: Point = {local_min_point2}, Value = {local_min_value2}")# 绘制函数图像及最小值点
x = np.linspace(-2, 3, 400)
y = f(x)plt.figure(figsize=(10, 6))
plt.plot(x, y, label='f(x) = x^4 - 3x^3 + 2')
plt.scatter(global_min_point, global_min_value, color='red', label='Global Minimum')
plt.scatter(local_min_point1, local_min_value1, color='green', label='Local Minimum 1')
plt.scatter(local_min_point2, local_min_value2, color='orange', label='Local Minimum 2')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Gradient Descent to Find Global and Local Minima')
plt.legend()
plt.grid(True)
plt.show()

        实验结果如下:

5.5其他常见的神经网络

5.5.1RBF网络

        RBF网络是一种单隐层前馈神经网络,假定输入为 d维向量x,输出为实值, RBF 网络可表示为:

                                                \varphi(\boldsymbol{x})=\sum_{i=1}^{q} w_{i} \rho\left(\boldsymbol{x}, \boldsymbol{c}_{i}\right)

        通常采用两步过程来训练 RBF 网络:第一步,确定神经元中心c_{i}常用的方式包括随机采样、聚类等;第二步,利用 BP 算法等来确定参数w_{i}\beta _{i}.

5.5.2ART网络

        ART网络是竞争型学习的重要代表,该网络由比较层、识别层、识别阈值和重置模块构成.其中,比较层负责输入样本,并将其传递给识别层神经元.识别层每个神经元对应一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类.

        它通过两个主要机制实现自适应:一是保持稳定的识别和分类能力,即当新输入到达时,网络可以调整自身以适应新模式,而不会完全改变已有的学习;二是在学习过程中通过比较新输入与已有模式的相似性来决定是否创建新的类别或更新现有类别。这使得ART网络在处理动态变化的数据和实时学习中具有较好的鲁棒性和适应性。

5.5.3SOM网络

        SOM网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间 ,同时保持输入数据在高维空间的拓扑结构。
        SOM 的训练过程很简单:在接收到一个训练样本后.每个输出层神经局会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元。 然后,最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小.这个过 程不断迭代,直至收敛.
        ​​​​​​​        ​​​​​​​        

5.5.4级联相关网络

        结构自适网络是将网络结构也当作学习的目标之一。并希望能在训练过程中找到最符合数据特点 的网络结构。级联相关网络就是结构自适应网络的代表,其训练过程如下:

        与一般的前馈神经网络相比,级联相关网络无需设置网络层数、隐层神经元数目,且训练速度较快,但其在数据较小时易陷入过拟合。

5.5.5Elman网络

        Elman 网络它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        

5.5.6Boltzmann 机

        神经网络中有一类模型是为网络状态定义一个“能量”,能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann机就是一种“基于能量的模型”常见结构如图 其神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann 机中的神经元都是布尔型的,即只能取 0、1两种状态,状态1表示激活,状态0表示抑制。

        ​​​​​​​        ​​​​​​​        

     

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubantu-elasticsearch
  • echarts横向柱状图
  • Vue3发送验证码,开启倒计时,并且倒计时结束前无法点击
  • 21LTR-Scene打靶渗透【附POC】(权限提升)
  • uniapp 多渠道打包实现方案
  • 【Buffer Pool】定长内存池的实现
  • cmake(1)
  • 【C++】:错误处理机制 -- 异常
  • 图像处理案例02
  • 效率何止10倍!利用输入法瞬间调用提示词
  • Harmony OS 卡片能力
  • ARM 离线安装k8s + harbor私有镜像库(麒麟)
  • NLP 之词的表示与语言模型
  • 巴黎奥运会8K转播科技为国产品牌自主研发设计
  • 第二章 部署LVS-DR集群
  • 《剑指offer》分解让复杂问题更简单
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CSS盒模型深入
  • HashMap ConcurrentHashMap
  • JavaScript HTML DOM
  • Java比较器对数组,集合排序
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL的数据类型
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Terraform入门 - 1. 安装Terraform
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信开放平台全网发布【失败】的几点排查方法
  • ​Java基础复习笔记 第16章:网络编程
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # include “ “ 和 # include < >两者的区别
  • # 透过事物看本质的能力怎么培养?
  • #162 (Div. 2)
  • #java学习笔记(面向对象)----(未完结)
  • $ git push -u origin master 推送到远程库出错
  • $$$$GB2312-80区位编码表$$$$
  • $NOIp2018$劝退记
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (160)时序收敛--->(10)时序收敛十
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (含笔试题)深度解析数据在内存中的存储
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)VC++中ondraw在什么时候调用的
  • (转载)深入super,看Python如何解决钻石继承难题
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net 知识杂记
  • .NET运行机制