深入探索离散 Hopfield 神经网络
一、离散 Hopfield 神经网络的起源与发展
离散 Hopfield 神经网络由约翰・霍普菲尔德在 1982 年提出,这一创新性的成果在当时引起了广泛关注,成为早期人工神经网络的重要代表之一。
在那个时期,人工神经网络的发展还处于相对初级的阶段。霍普菲尔德神经网络的出现,为解决一大类模式识别问题以及给出一类组合优化问题的近似解提供了新的思路。它是一种单层网络,每个神经元的输出均接到其它神经元的输入,各节点没有自反馈。
这种独特的结构使得离散 Hopfield 神经网络在模式识别和联想记忆等领域展现出巨大的潜力。它能够收敛到稳定的平衡状态,并以其作为样本的记忆信息,同时具有回忆能力,能够从某一残缺的信息回忆起所属的完整的记忆信息。
随着时间的推移,离散 Hopfield 神经网络对后续的神经网络发展产生了深远影响。许多研究人员在其基础上进行了深入的研究和拓展,提出了各种改进的方法和应用。例如,在联想记忆方面,不断探索提高记忆容量和准确性的方法;在优化问题求解中,利用其能量函数的特性来寻找最优解。
总之,离散 Hopfield 神经网络的提出为人工神经网络的发展开辟了新的道路,其影响至今仍然在学术界和工业界持续发酵。
二、网络结构与工作原理
(一)网络结构特点
离散 Hopfield 网络是一种独特的单层反馈网络。其输出为二值,通常为 - 1 或 1。在这个网络中,每个神经元都与其他所有神经元相互连接,但是不存在自反馈,即神经元自身到自身的权重为 0。同时,连接权重具有对称性,即对于任意两个神经元 i 和 j,连接权重 Wij = Wji。这种对称的连接结构保证了能量方程在神经元激活时单调递减,从而使得网络能够更加稳定地运行。例如,在一个具有 10 个神经元的离散 Hopfield 网络中,这种对称的连接结构可以使得网络在处理信息时更加高效和准确。
(二)工作方式
- 异步方式:在任一时刻 t,只有一个神经元通过随机或者一定次序进行变化,而其他神经元状态不变。这种工作方式类似于人类大脑在处理信息时的逐步思考过程。例如,当我们在识别一个物体时,大脑可能会先注意到物体的一个特征,然后再逐渐注意到其他特征,最终完成对整个物体的识别。
- 同步方式:在任一时刻 t,部分神经元或全部神经元的状态同时改变。这种工作方式可以加快网络的处理速度,但也可能会导致网络的稳定性降低。例如,在一些需要快速处理大量信息的任务中,同步方式可能会更加有效。
(三)稳定性分析
网络稳定性的判定主要依据能量函数。当连接矩阵对称且对角线元素为 0 时,网络是稳定的。在这种情况下,网络的稳定状态与能量函数的局部最小点相对应。能量函数是网络的一个重要特性,它可以用来衡量网络的状态。当网络从一个初始状态开始演化时,能量函数会逐渐减小,直到网络达到一个稳定状态。例如,对于一个具有 n 个神经元的离散 Hopfield 网络,其能量函数可以表示为 E = -1/2ΣΣ Wij Xi Xj,其中 Wij 是连接权重,Xi 和 Xj 是神经元的状态。当网络达到稳定状态时,能量函数的值最小。
三、算法实现与应用
(一)算法实现步骤
离散 Hopfield 神经网络的算法实现主要包括以下几个关键步骤:
- 设定能量函数:能量函数是离散 Hopfield 神经网络的核心概念之一,它可以用来衡量网络的状态。对于一个具有 个神经元的离散 Hopfield 网络,其能量函数通常表示为 ,其中 是连接权重, 和 是神经元的状态。这个能量函数具有一些重要的性质,例如当网络从一个初始状态开始演化时,能量函数会逐渐减小,直到网络达到一个稳定状态。
- 根据相邻神经元状态和连接权重更新状态:在离散 Hopfield 神经网络中,神经元的状态更新是根据相邻神经元的状态和连接权重来进行的。具体来说,对于每个神经元 ,其状态更新规则可以表示为 ,其中 表示神经元 在时间 的状态, 是连接权重, 是符号函数。这个更新规则意味着神经元的状态会根据其相邻神经元的状态和连接权重进行调整,以使得网络的能量函数逐渐减小,最终达到一个稳定状态。
在 Python 和 Matlab 中,离散 Hopfield 神经网络的实现可以通过以下步骤进行:
Python 实现示例:
import numpy as np class HopfieldNetwork: def __init__(self, num_neurons): self.num_neurons = num_neurons self.weights = np.zeros((num_neurons, num_neurons)) def train(self, patterns): for pattern in patterns: pattern = np.array(pattern).reshape(-1, 1) self.weights += np.dot(pattern, pattern.T) np.fill_diagonal(self.weights, 0) def update(self, state): new_state = np.zeros_like(state) for i in range(self.num_neurons): activation = np.dot(self.weights[i], state) new_state[i] = 1 if activation >= 0 else -1 return new_state def run(self, initial_state, max_iterations=100): state = initial_state for _ in range(max_iterations): new_state = self.update(state) if np.array_equal(state, new_state): break state = new_state return state |
Matlab 实现示例:
function [final_state] = hopfield_network(patterns, initial_state) num_neurons = length(patterns(1,:)); weights = zeros(num_neurons, num_neurons); for i = 1:length(patterns) pattern = patterns(i,:); weights = weights + pattern' * pattern; end weights = weights - diag(diag(weights)); state = initial_state; max_iterations = 100; for iter = 1:max_iterations new_state = zeros(1, num_neurons); for i = 1:num_neurons activation = weights(i,:) * state'; new_state(i) = sign(activation); end if all(new_state == state) break; state = new_state; end final_state = state; end |
(二)数字识别应用
离散 Hopfield 神经网络在数字识别任务中具有广泛的应用。其基本原理是通过输入带噪声的数字图像,网络能够利用其联想记忆的功能恢复为正确的数字。
具体的设计步骤如下:
- 准备训练数据集:首先,需要准备一组用于训练的数字图像数据集。这些图像应该是已经处理好的二进制图像,每个像素值为 0 或 1。例如,可以将数字划分成一定大小的矩阵,有数字的部分用 1 表示,空白部分用 -1 表示。
- 创建 Hopfield 网络:利用训练数据集确定网络的连接权重,使得网络能够对训练数据集中的数字进行记忆。可以使用 Python 或 Matlab 中的相关函数来创建 Hopfield 网络。
- 输入带噪声的数字图像:将带噪声的数字图像作为网络的输入,网络会根据其当前状态和连接权重进行状态更新。
- 重复更新直到稳定:不断重复步骤 3,直到网络达到稳定状态,此时网络的输出即为恢复后的数字图像。
结果分析:通过对大量带噪声的数字图像进行测试,可以评估离散 Hopfield 神经网络在数字识别任务中的性能。一些关键的性能指标包括识别准确率、收敛速度等。如果网络能够在较短的时间内准确地恢复带噪声的数字图像,那么说明该网络在数字识别任务中具有较好的性能。
例如,在一些实验中,使用离散 Hopfield 神经网络对带噪声的数字图像进行识别,当噪声强度较低时,网络能够以较高的准确率恢复正确的数字图像。并且,随着网络规模的增加,其记忆容量和识别准确率也可能会有所提高。但是,当噪声强度过高时,网络的性能可能会下降,需要进一步改进网络结构或算法来提高其抗噪声能力。
四、研究进展与优势
(一)研究进展
- 延迟离散 Hopfield 网络的收敛性研究:
- 延迟离散 Hopfield - 型神经网络具有新的异步运行规则,在非对称连接权阵条件下证明了收敛性定理,推广了已有延迟离散 Hopfield - 型神经网络的收敛性结果。同时给出了能量函数的极大值点与网络稳定态的关系。
- 延迟离散 Hopfield 型网络在正规异步运行规则下,其滞后于能量函数收敛的步数由 Hopfield 结果的 n² 步降到 2n + 1 步,揭示了离散 Hopfield 型网络与延迟离散 Hopfield 型神经网络收敛性的内在关系。
- 随机神经网络:
- Hopfield 神经网络中,神经元状态为确定性的,而随机神经网络中,神经元状态为随机的,服从一定的概率分布,如玻尔兹曼、高斯、柯西分布等,从而构成玻尔兹曼机、高斯机、柯西机等随机机。
- Boltzmann 机是离散 Hopfield 神经网络的一种变型,通过对离散 Hopfield 神经网络加以扰动,使其以概率的形式表达,而网络的模型方程不变,只是输出值类似于 Boltzmann 分布以概率分布取值。
- 改进的连续 Hopfield 神经网络:
- 在优化连续 Hopfield 神经网络时,需要考虑选择合适的激活函数、设计合适的能量函数、权重矩阵初始化、学习率调整、正则化、训练策略、模型选择与评估等方面。
- 以旅行商问题为例,通过将问题表示为连续 Hopfield 神经网络,设计能量函数,采用 sigmoid 函数作为激活函数并使用梯度下降法进行优化,设置合适的权衡因子和超参数,采用自适应学习率和小批量梯度下降法等训练策略,最后将网络状态矩阵解码为问题的解,从而实现对旅行商问题的优化。
(二)优势体现
- 联想记忆功能强大:
- 离散 Hopfield 神经网络可视为一个类脑模型,主要用于联想记忆,即联想存储器,这是类人智能的特点之一。人类的 “触景生情” 就是见到类同于过去接触的景物,容易产生对过去情景的回味和思忆。对于 Hopfield 网络,用它作联想记忆时,首先通过学习训练确定网络中的权系数,使所记忆的信息在网络的 n 维超立方体的某一个顶角达到能量最小。
- 当网络的权重矩阵确定之后,只要向网络给出输入向量,这个向量可能是局部数据,即不完全或部分不正确的数据,但是网络仍然能够产生所记忆信息的完整输出。
- 网络结构简洁:
- 离散 Hopfield 神经网络是一种单层反馈网络,结构相对简单。每个神经元都与其他所有神经元相互连接,但是不存在自反馈,连接权重具有对称性。这种简洁的网络结构降低了实现和理解的复杂度。
- 同时,其对称的连接结构保证了能量方程在神经元激活时单调递减,从而使得网络能够更加稳定地运行,在模式识别和联想记忆等领域展现出巨大的潜力,能够存储多个模式并从残缺信息恢复完整模式。
相关文章:

深入探索离散 Hopfield 神经网络
一、离散 Hopfield 神经网络的起源与发展 离散 Hopfield 神经网络由约翰・霍普菲尔德在 1982 年提出,这一创新性的成果在当时引起了广泛关注,成为早期人工神经网络的重要代表之一。 在那个时期,人工神经网络的发展还处于相对初级的阶段。霍…...

[智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备。它们通常包括几个不同类型,如前视摄像头、环视摄像头、行车记录仪等。这些摄像头的主要功能有: 前视摄像头(Forward Camera):用于提供驾驶员前方…...

前端vue 列表中回显并下拉选择修改标签
1,vue数据列表中进行回显状态并可以在下拉框中选择修改,效果如下 2,vue 页面关键代码 <el-table-column label"审核" align"center" class-name"small-padding fixed-width" prop"status" >&…...

hbase未来的发展趋势
HBase 作为一个开源的分布式、可伸缩的 NoSQL 数据库,依托于 Hadoop 生态系统,以处理海量结构化数据为优势。随着大数据技术的发展,HBase 的发展趋势主要体现在以下几个方面: 1. 与云计算深度集成 随着企业向云迁移,HBase 也正在越来越多地部署在云环境中。云服务商(如 …...

Rust 语言学习笔记(二)
再继续快速学习一下 Rust 的以下几个知识点,就可以开始着手做点小工具了 基本数据类型复合数据类型基本的流程控制 Rust 设计为有效使用内存考虑的,它提供了非常细力度的数据类型,如整数分为有无符号,宽度从 8 位到 128 位&…...

【postman】怎么通过curl看请求报什么错
获取现成的curl方式: 1,拿别人给的curl 2,手机app界面通过charles抓包,点击接口复制curl 3,浏览器界面-开发者工具-选中接口复制curl 拿到curl之后打开postman,点击import,粘贴curl点击send&am…...

Python 编程入门指南(一)
1. Python 简介 Python是一种广泛使用的高级编程语言,因其简洁的语法和强大的功能而备受欢迎。Python由Guido van Rossum于20世纪90年代初设计,旨在提供易于阅读和编写的代码,适合从初学者到专业开发者的各个水平。它是一种解释型语言,这意味着在编写和执行代码之间不需要…...

macOS 设置固定IP
文章目录 以太网Wifi 基于 macOS 15.1 以太网 Wifi...

redis实现消息队列的几种方式
一、了解 众所周知,redis是我们日常开发过程中使用最多的非关系型数据库,也是消息中间件。实际上除了常用的rabbitmq、rocketmq、kafka消息队列(大家自己下去研究吧~模式都是通用的),我们也能使用redis实现消息队列。…...

debian 系统更新升级
系统升级能够有效避免漏洞导致的损害 不过需要做好提前和后续的测试,避免现有运行程序的错误。 debian安装参考:链接 一、清理过时和不再使用的源 1.清理源 vi /etc/apt/sources.list2.在下面的文件夹下清理不需要的 cd /etc/apt/sources.list.d二、…...

STM32学习笔记-----UART的概念
在 STM32 中,UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,广泛应用于嵌入式系统中。STM32 提供了丰富的硬件资源来支持 UART 通信,可以通过标准库(STM32 HAL 或者标准外设…...

Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用
Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用 前言一、什么是 datatable 参数?Gherkin 表格示例 二、datatable 参数的基本使用feature文件:获取用户信息并执行相关操作的使用 datatable 处理表格数据Give…...

【408】SDN重点笔记
总特征:数据平面(负责转发)与控制平面(负责控制)分离 控制平面: 由服务器和软件组成。控制平面完成转发表,并分发。 路由器不再需要路由选择协议,不再交换信息,只负责收到…...

云运维基础
笔记内容侵权联系删除 云审计(CTS) 云审计云上资源变更均可被管控,实时系统性记录所有人的操作,无需手工统计。云审计服务支持将操作记录合并,周期性地生成事件文件实时同步转存到OBS存储桶,帮助用户实现…...

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
摘 要 互联网发展至今,广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力…...

Rust开发一个命令行工具(一,简单版持续更新)
依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…...

实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端
在数据库中处理大量文本数据时,包含搜索(例如查找包含特定单词的文本)往往是必需的。然而,直接使用 LIKE %text% 的方式在大数据量中进行模糊查询会造成性能瓶颈。为了解决这一问题,MySQL 和 SQL Server 提供了全文索引(Full-Text Indexing)功能,可以显著加速文本数据的…...

情景2 虚拟化世界 自己答案的理解
1、什么是虚拟化? 答:版本很多,选了两个作为参考。 定义1:虚拟化是创造设备或者资源的虚拟版本,如服务器、存储设备、网络或者操作系统。 定义2:虚拟化是资源的逻辑表示,它不受物理限制的约束。 2、寄生…...

【国产操作系统对Qt支持有哪些?】
国产操作系统 鸿蒙操作系统:由华为开发,主要用于智能设备和物联网领域。 深度操作系统:基于Linux的操作系统,适用于个人电脑和服务器。 中标麒麟:由中国电子科技集团公司研发,适用于服务器和桌面环境。 悠然操作系统:面向教育和个人用户的Linux发行版。 红旗Linux:早期…...

深度学习--正则化
笔记内容侵权联系删 过拟合问题 过拟合问题描述:模型在训练集表现优异,但在测试集上表现较差。 根本原因:特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多导致拟合出的函数几乎完美的对训练集做出预…...

PHP反序列化_1
目录 一、基本概念 1. 序列化 2. 反序列化 二、反序列化漏洞 1. 漏洞产生原因 2. 魔术方法 3.利用魔术方法进行攻击的示例: 一、基本概念 什么是 PHP 反序列化 PHP 反序列化是将序列化后的字符串恢复为原始 PHP 数据类型(如对象、数组等&#x…...

深度学习在图像识别中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 深度学习在图像识别中的应用 深度学习在图像识别中的应用 深度学习在图像识别中的应用 引言 深度学习概述 定义与原理 发展历程 …...

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…...

Leecode刷题C语言之统计好节点的数目
执行结果:通过 执行用时和内存消耗如下: 题目:统计好节点的数目 现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] [ai,…...

webpack5 + vue3 从零配置项目
前言 虽然在实际项目当中很少会从 0 到 1 配置一个项目,毕竟很多重复工作是没有必要的,脚手架将这些重复性的工作进行了整合,方便开发者使用。也正因如此,导致部分开发者过于依赖脚手架,却不清楚其内部的实现流程&…...

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…...

./mysqld: error while loading shared libraries: libaio.so.1: cannot open sha
mysql:5.6 使用离线方式安装:rpm -ivh --nodeps mysql* ,执行 systemctl start mysqld.service发现启动不了,通过vi /var/log/mysql.log看到如下关键字:libraries: libaio.so.1,之前也是按照网上帖子各种修改都没有解决…...

Qt主线程把数据发给子线程,主线程会阻塞吗
演示: #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…...

前后端、网关、协议方面补充
这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…...

如何在Mac上切换到JDK 17开发环境
在本文中,我将为您介绍如何在Mac上切换到JDK 17,包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置,并最终使用mvn clean install重新编译项目。通过这个流程,您可以顺利地将开发环境升级到JDK …...