Hopfield 网络简介

引入

Hopfield网络的概念

Hopfield 网络的应用

Hopfield 网络由于能够非常有效地存储和检索信息,因此在各个领域都很有用。 尽管它们如今并不像用于一般机器学习任务的其他类型的人工神经网络那样常见,但它们仍然具有重要的特定应用:

1.联想记忆:该模型的主要应用之一是其联想记忆能力。 他们可以存储一组模式,然后从部分或嘈杂的版本中检索完整的模式。
2.优化问题:这些网络可用于解决优化问题,例如旅行商问题。 它们收敛到最小能量状态,这可以代表此类问题的最优或接近最优的解决方案。
3.模式识别:它们对于模式识别很有用,特别是在需要识别不完整或扭曲模式的情况下。
4.信号和图像处理:它们可用于过滤和恢复图像和信号的任务,利用其识别模式和校正失真的能力。
5.控制和决策系统:在一些特定的工程应用中,Hopfield 网络可用于控制系统和自动决策,其中快速收敛到稳定的解决方案至关重要。
6.大脑过程建模:它们提供了一个模型来理解大脑如何存储和检索信息,这有助于神经科学研究。
总之,这些人工神经网络模型特别适合需要基于部分或噪声输入检索存储信息的情况以及可以根据能量最小化进行映射的问题。

能量函数

Hopfield 网络的一个关键概念是 “能量景观” 的概念。 网络的配置状态可以通过其能量函数来描述,网络试图将其最小化。 这会导致网络动态中的稳定状态或“吸引子”。

存储和检索

该神经网络可以存储模式或记忆。 当接近存储记忆的模式呈现给网络时,网络会演化到最近的吸引子,从而有效地检索整个记忆。

动力学

每个神经元的状态由它从其他神经元接收的输入的加权和确定。 如果这个总和超过某个阈值,神经元就会被激活; 否则,神经元就会关闭。

Hopfield 网络的对后世影响及其历史地位

  • 物理灵感
    霍普菲尔德将神经网络的动力学与物理学中的系统(特别是统计力学)进行了比较。 这种跨学科方法是革命性的,为神经计算研究开辟了新途径。

  • 对人工智能和神经科学的影响
    该模型影响了人工智能和理论神经科学。 它提供了一个框架来理解复杂的计算如何从简单的神经交互中产生。

  • 未来研究的基础
    Hopfield 网络为神经网络的未来发展奠定了基础,包括深度学习和循环神经网络的进步。

Hopfield Networks 如何学习?

学习过程通过一种基于赫布规则的称为“赫布训练”的方法进行。 这条规则通常被总结为:“神经元一起放电,连接在一起”,并且是模型学习的基本原则。 让我们通过查看步骤来理解这一点:

  • 初始化:最初,网络的权重使用等于零或小的随机值的值进行初始化。
  • Hebbian 训练:在此阶段,网络会接触到必须学习的一组模式。 应用赫布规则来更- 新神经元之间的突触权重,按以下方式完成:
  1. 对于每种训练模式,都会考虑每对可能的神经元。
  2. 如果两个神经元处于相同状态(均活跃或均不活跃),则它们之间的突触权重会增加; 否则,重量保持不变,甚至可能减少。
  3. 这加强了神经元之间的连接,这些神经元在训练模式中往往处于相同的状态。
  • 模式存储:权重更新会导致网络“记住”训练模式。 换句话说,训练模式成为网络能量函数的最小值点。
  • 收敛到稳定状态:训练后,当向网络呈现新模式(可能不完整或有噪声)时,神经元根据突触权重更新其状态。 网络倾向于进化到一种能量最小化的状态,这在理想情况下是记忆模式之一。

Python 示例
为了说明 Hopfield 网络,让我们使用 Python 来举一个简单的例子:

import numpy as npclass HopfieldNetwork:def __init__(self, size):self.size = sizeself.weights = np.zeros((size, size))def train(self, data):for pattern in data:self.weights += np.outer(pattern, pattern)np.fill_diagonal(self.weights, 0)def predict(self, pattern):result = np.copy(pattern)for _ in range(100):  # for i in range(self.size):result[i] = 1 if np.dot(self.weights[i], result) > 0 else -1return result

训练准则:

这里使用 Hebbian 准则,参看文献 《现代机器学习技术导论》,王东, § \S § 3.3.2.1.

加入运行上面网络的代码,完整代码如下:

import numpy as np# 定义 Hopfield 网络类
class HopfieldNetwork:def __init__(self, size):self.size = sizeself.weights = np.zeros((size, size))# 训练函数,用于训练网络def train(self, data):for pattern in data:self.weights += np.outer(pattern, pattern)  # 更新权重矩阵np.fill_diagonal(self.weights, 0)  # 将对角线元素设置为0,避免自反馈# 预测函数,根据输入模式进行预测def predict(self, pattern):result = np.copy(pattern)for _ in range(100):  # 迭代更新模式100次for i in range(self.size):result[i] = 1 if np.dot(self.weights[i], result) > 0 else -1  # 更新每个神经元的状态return result# 测试案例
if __name__ == "__main__":# 创建一个 Hopfield 网络,大小为4net = HopfieldNetwork(4)# 定义训练模式,训练数据包含两个模式patterns = [np.array([1, -1, 1, -1]),np.array([1, 1, -1, -1])]# 训练网络net.train(patterns)# 定义测试模式test_pattern = np.array([1, -1, -1, -1])# 使用网络进行预测predicted_pattern = net.predict(test_pattern)# 打印预测结果print("测试模式:    ", test_pattern)print("预测模式:    ", predicted_pattern)

代码详细说明:

定义 HopfieldNetwork 类:

  • init(self, size):初始化网络大小和权重矩阵,权重矩阵初始化为零矩阵。
  • train(self, data):根据训练数据更新权重矩阵,使用外积计算权重更新,并将对角线元素设置为0。
  • predict(self, pattern):根据输入模式进行预测,迭代更新神经元状态100次,更新规则是根据当前权重矩阵和神经元状态的点积决定。

测试案例:

  • 创建一个4个神经元的 Hopfield 网络。
  • 定义并训练两个模式 [1, -1, 1, -1] 和 [1, 1, -1, -1]。
  • 定义一个测试模式 [1, -1, -1, -1],并使用网络进行预测。
  • 打印测试模式和预测模式。

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

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

相关文章

ES中的数据类型学习之ALIAS

Alias field type | Elasticsearch Guide [7.17] | Elastic 这里只针对data type的alias,暂时不说 index的alias。直接实战开始 PUT trips { "mappings": { "properties": { "distance": { "type": &…

Linux、Windows和macOS上使用Telnet

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上使用Telnet时,不同的系统有不同的工具和设置方法。以下是在这些系统上使用Telnet的简要说明: Linux 在Linux上,Telnet通常是通过telnet命令来使用的。首先,你需要确保你的系…

Docker-Compose单机容器集群编排工具

目录 前言 1.Docker-compose简介 2. YAML文件格式及编写注意事项 3. Docker-Compose配置常用字段 4.Docker Compose常用命令 5.使用Docker-compose创建LNMP环境,并运行Wordpress网站平台 前言 我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器&…

前端:Vue学习-3

前端:Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容(默认值)2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…

[题解]CF1401E.Divide Square(codeforces 05)

题目描述 There is a square of size 106106106106 on the coordinate plane with four points (0,0)(0,0) , (0,106)(0,106) , (106,0)(106,0) , and (106,106)(106,106) as its vertices. You are going to draw segments on the plane. All segments are either horizonta…

【数据结构】顺序表(ArrayList的具体使用)

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 💪💪💪 谢谢你这么帅…

VSCode STM32嵌入式开发插件记录

要卸载之前搭建的VSCode嵌入式开发环境了,记录一下用的插件。 1.Cortex-Debug https://github.com/Marus/cortex-debug 2.Embedded IDE https://github.com/github0null/eide 3.Keil uVision Assistant https://github.com/jacksonjim/keil-assistant/ 4.RTO…

支持向量机(SVM,Support Vector Machine)

支持向量机(SVM,Support Vector Machine)是一种监督学习模型,主要用于分类和回归分析。它的优点包括: 优点: 高效解决高维问题:通过核函数可以将低维数据映射到高维空间,使得非线性…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MimicMotion :利用可信度感知姿势指导生成高质量人体运动视频

目录 项目介绍 项目相关工作 图像/视频生成的扩散模型 姿势引导的人体动作转移 生成长视频 方法实践 与最先进方法的比较 消融研究 部署验证 1. 下载项目: 2. 建立环境 3. 下载参数模型 A. 下载 DWPose 预训练模型:dwpose B. 从 Huggingfa…

学术研究期刊

投稿指南 一、《学术研究》投稿须知   来稿需为作者的原创性研究成果,除了文中特别加以标注和致谢的地方外,不包含他人已经发表或者撰写过的研究成果,也不包含作者已经发表的研究成果。如发现学术不端行为,本刊将追究相关责任人…

DDD(3)-领域驱动设计之如何建模

前言 上一篇:从领域驱动到模型驱动中我们讨论到,领域驱动设计的核心思想是保持业务-模型-代码的一致性,模型作为沟通业务和代码的工具,至关重要,今天这篇文章就来讨论DDD中建模的一些思考和方法。 什么是建模 虽然看…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

【Drone】drone编译web端 防墙策略 | 如何在被墙的状态drone顺利编译npm

一、drone编译防墙版本 1、web端drone kind: pipeline type: docker name: ui steps:- name: build_projectimage: node:20-slim depends_on: [clone]volumes:- name: node_modulespath: /drone/src/node_modulescommands:- pwd- du -sh *- npm config set registry https://…

前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段

本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 g…

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

PHP进阶:前后端交互、cookie验证、sql与php

单词:construct 构造 destruct 摧毁 empty 空的 trim 修剪 strip 清除 slash 斜线 special 特殊 char 字符 query 询问 构造方法(魔术方法) 构造方法是一种特殊的函数&#xff0…

QT 4.8版本的Ubuntu2004编译错误的解决方案

arm-linux-gnueabihf-gcc 5.2编译qt4.8.5_error: ‘class ui::qprintpropertieswidget’ has no m-CSDN博客

k8s中部署nacos

1 部署nfs # 在k8s的主节点上执行 mkdir -p /appdata/download cd /appdata/download git clone https://github.com/nacos-group/nacos-k8s.git 将nacos部署到middleware的命名空间中 kubectl create namespace middleware cd /appdata/download/nacos-k8s # 创建角色 kub…

VScode连接虚拟机运行Python文件的方法

声明:本文使用Linux发行版本为rocky_9.4 目录 1. 在rocky_9.4最小安装的系统中,默认是没有tar工具的,因此,要先下载tar工具 2. 在安装好的vscode中下载ssh远程插件工具 3. 然后连接虚拟机 4. 查看python是否已经安装 5. 下载…

linux代填密码切换用户

一、背景 linux用户账户密码复杂,在不考虑安全的情况下,想要使用命令自动切换用户 二、操作 通过 expect 工具来实现自动输入密码的效果 yum install expect创建switchRoot.exp文件,内容参考下面的 #!/usr/bin/expect set username root…