人工智能发展史 — 物理学诺奖之 Hopfield 联想和记忆神经网络模型
目录
文章目录
- 目录
- 1982 年,Hopfield 联想和记忆神经网络模型
- 背景知识
- 历史:霍普菲尔德简介
- 神经学:大脑的联想记忆机制
- 物理学:磁性材料的自旋玻璃理论和能量最小值函数
- Hopfield 神经网络基本原理
- 记忆存储(训练),构建能量景观用于存储不同的模式
- 联想检索(推理),系统状态的动态变化朝着局部最小值发展
- 数学模型的元素
- 神经网络的能量最小函数
- 新记忆的形成:训练中的参数调整迭代
- 记忆联想算法:推理中的神经元数值调整迭代
- 记忆多个模式(Pattern)
- 应用示例
- 局限性
1982 年,Hopfield 联想和记忆神经网络模型
1982 年,约翰·霍普菲尔德(John Hopfield)通过对生物大脑的联想记忆机制进行了研究,发表论文《神经网络和具有突发性集体计算能力的物理系统》,提出了一种全互联反馈神经网络数学模型,即:Hopfield 神经网络模型。此模型尝试解释神经网络系统如何存储记忆,又是如何从海量记忆中快速联想某个记忆片段。
Hopfield 神经网络模仿了生物大脑的联想记忆功能,通过物理学能量函数最小化模拟了大脑的信息存储和检索能力,被应用于图像识别等场景,例如:通过 Hopfield 神经网络 “记忆” 存储了一张图片的数据之后,就可以通过 “联想” 能力来修复这张 “破损” 的图片。
背景知识
历史:霍普菲尔德简介
约翰·霍普菲尔德(John Hopfield)文学士、物理学博士,研究领域横跨物理学、分子生物学、神经科学、计算机科学,是一名以推动跨学科交叉融合而闻名于世的科学家,其推动了物理学与生命科学、人工智能的交叉融合,被誉为 “扩展统计物理学边界的先驱”,获得了 2024 年的物理学诺贝尔奖。
霍普菲尔德早期是理论物理学家,专注于固体物理和量子力学,研究电子行为与能量状态,在激化子、长程电子输运等方面有极大的贡献。然而,20 世纪 70 年代,他对生物学和神经科学产生了浓厚兴趣,尤其是大脑如何存储和处理信息的问题。
他在贝尔实验室期间参与了跨学科研讨会,与神经科学家合作探讨神经网络与生物学的联系,这种交流促使他将物理学原理应用到生物系统中。
- 1979 年,贝尔实验室的跨学科研讨会:霍普菲尔德与生物学家讨论神经网络的可能机制,开始尝试用数学模型解释大脑的信息处理。
- 1981 年,普林斯顿大学神经科学会议:大卫·马尔(David Marr)关于视觉系统如何组织信息的演讲,启发霍普菲尔德将物理系统的自组织特性与神经网络结合。
得益于与好友 Phil Anderson(凝聚态理论物理学家,1977 年诺贝尔奖得主)长期交流,霍普菲尔德对自旋玻璃理论进行了深入的研究。最终在 1982 年提出了 Hopfield 神经网络模型。
因此,在 Hopfield 神经网络中,我们将看见物理学、神经科学、计算机学科三者之间的交汇融合。(注意,本文中只讨论离散型 Hopfield 神经网络。)
神经学:大脑的联想记忆机制
生物大脑的 “联想记忆” 指的是,当我们听见一首音乐的片段时,我们可以回想起歌词并唱出来,而不需要听完整首歌曲才能记起。当我们看见一张模糊的甚至是残缺的照片时,我们可以回想起照片的全貌,而不需要看见完整的照片。
生物大脑的联想记忆由海马体和杏仁核等多个脑区协作,并通过突触可塑性和神经网络的动态同步来实现。具体而言:
- 海马体的记忆巩固:海马体负责将短期记忆转化为长期记忆。其中 CA3 区通过 “模式分离(区分相似记忆)” 和 “模式完成(从部分信息恢复完整记忆)” 实现联想记忆 。例如:当接收到部分感官输入时,海马体能够激活与之相关的完整记忆模式。
- 杏仁核的情绪记忆整合:杏仁核将情绪信息(如恐惧或快乐)与感官输入绑定,形成带有情感色彩的联想记忆。例如:闻到某种气味可能触发与特定情绪事件相关的记忆 。
- 突触可塑性:赫布定律解释了重复的神经活动会强化并塑造相关的突触连接,形成记忆痕迹。长期增强(LTP)和长期抑制(LTD)是生物联想记忆的基础。
- 神经网络的动态同步:神经元集群通过同步放电编码和检索记忆。这种时空编码方式允许大脑从噪声或部分输入中恢复完整信息。
联想记忆功能可以被抽象为下图这般的神经动力学:空间中任何一个点都代表大脑可能的一个状态,每一个吸引子(黑点)编码了一份记忆,同时这些吸引子把整个空间划分成了各自的吸引域,如果大脑状态落进了某个吸引域就相当于是拥有了一些辅助信息,之后会被吸引到相应的吸引子那里,这个吸引的过程就是联想或者说找回记忆(memory retrieval,pattern completion)的过程。
Hopfield 神经网络正是为构造上图这样的动力学系统提供了一个简单的模型。
物理学:磁性材料的自旋玻璃理论和能量最小值函数
霍普菲尔德早年从事磁性材料的自旋玻璃的研究。自旋玻璃(Spin Glass)是磁性材料的一种原子自旋性质,而不是一种 “玻璃”。
磁性材料的每颗原子都相当于一个小磁铁,邻近原子之间的自旋会互相影响,使得自旋方向一致的区域(非全局)形成。以下是自旋玻璃的关键特性:
- 阻挫(Frustration)性质:想象一群人(磁矩,如下图红蓝箭头)在黑暗中随机站立,每个人可以选择面朝东或西(自旋方向,红箭头或蓝箭头)。若规则是 “邻居必须面朝同一方向”(铁磁相变),所有人会整齐排列;若规则是 “邻居必须相反方向”(反铁磁相变),则形成交替排列。但自旋玻璃的规则是混合的(自旋玻璃相变),即:某些邻居必须同向,另一些则必须反向,导致无法达成统一,陷入混乱的 “争执” 状态,称为阻挫。
- 自旋冻结性质:高温时,磁矩的自旋方向会随机翻转(像沸腾的水);降温后,磁矩的自旋方向会具有无序性,并需要长时间才能逐渐稳定下来(朝能量最小的方向稳定,符合热力学第二定律),就类似于高温融化的玻璃逐渐冷却固化的过程。因此得名 “自旋玻璃”。
- 亚稳态多样性质:冷却固化后,磁性系统系统通过磁矩相互作用达到了能量最小化的亚稳态(局部能量极小值),并呈现出亚稳态的多样性,即:系统可能稳定在多个能量相近但结构不同的亚稳态中,而非唯一的一个全局最低能量态。所有的能量亚稳态可能性被描绘在一张 “多谷结构的能量景观” 中,每个山谷代表一种可能的亚稳态。
自旋玻璃的亚稳态(局部能力极小值)通过能量最小函数(Energy Minimization Function)来计算。能量最小函数是一种用于描述动态系统稳定性的数学工具,其核心思想是系统在演化过程中会自发向能量最低的状态收敛。
自旋玻璃的能量函数如下所示,J_ij 是自旋间的相互作用强度,S_i 是自旋方向(±1,红蓝箭头)。
Hopfield 神经网络基本原理
大脑的记忆和联想就相当于计算机中的存储和检索。对此,最直观的思路就是构建一个庞大的 “数据库” 将信息存储下来,然后通过 “最长匹配优先” 等算法来进行检索。但是人工神经元不是计算机,也没有数据库,如何实现 “存储空间如何足够大” 和 “检索速度如何足够快” 的最优解问题呢?
霍普菲尔德突破了常规的思维,他从热力学和物理学中获得灵感,认为 “能量最小化原则” 就是自然界中最优的路径,可用于神经网络寻找最优解的过程,继而基于 “能量最小化函数” 来模拟了神经网络中的记忆和联想。
Hopfield 神经网络展示了在神经网络中如何通过能量极小点和来存储和检索记忆,具有深刻的物理含义。
记忆存储(训练),构建能量景观用于存储不同的模式
- 首先,神经网络接受图片的二值化矩阵向量输入(对神经元进行 +/-1 赋值);
- 然后,基于 “能量最小化原则” 通过计算出神经网络的能量总和值;
- 接着,根据 Hebbian 学习规则来训练网络的权重参数,确保系统在迭代过程中能量严格递减,最终稳定在局部或全局最小值点。
- 最后,训练收敛,神经网络系统到达了能量最小化的亚稳态,完成了对图片的储存(“记忆” 过程)。并且每个亚稳态对应存储一个记忆模式,多个亚稳态可以存储多个记忆模式(多张图片)。
联想检索(推理),系统状态的动态变化朝着局部最小值发展
在神经元连接权重确定的前提下,神经网络通过调整神经元的数值来使得能量变化。例如:当一张新的图片被输入到网络时,新图片对应的神经元的数值都会逐一被检查。根据能量最小化函数,如果存在 “破损” 部分,那么改变破损神经元的数值可以让网络的能量总和继续下降(“联想” 过程),然后就会修改这个神经元的数值(图片修复过程)。
数学模型的元素
霍普菲尔德认为磁性原子集群和神经元集群拥有类似的 “互相动态影响” 集群行为,所以 Hopfield 神经网络具有特殊的网络拓扑结构,所有节点之间相互全连接。模拟了生物神经元相互连接,如下图所示。
在这个全连接反馈网络中,每个神经元既有输入也有输出,且每个神经元的输出就作为其他神经元的输入。通过连接形成一个动态系统,模拟了大脑中神经元集群的递归循环活动。
受到统计物理学 Ising 铁磁模型启发,Hopfield 神经网络中的神经元集群具有以下特性:
-
都有一个 x_i 状态,且只有 2 种可能的取值,代表神经元处于活跃或不活跃状态。(注:离散型 Hopfield 网络中,所有神经元的取值都是 -1 或 +1,而不是一个连续的值。)
- 激活 x_i = +1
- 未激活 x_i = -1
-
每条连接都有一个权重 w_ij。
- 同态链 w_ij > 0,如其一端的神经元处于激发态,会影响另一端的神经元也处于激发态。如其一端神经元处于未激发态,另一端的神经元也会受到抑制。
- 异态链 w_ij < 0,则相反,其一端神经元的状态会 “反向地” 影响另一端神经元的状态。
- 权重对称性 w_ji = w_ji。
-
2 个神经元之间的能量契合度为:h_ij = w_ij ⋅ x_i ⋅ x_j
- h_i > 0 为高能契合度。
- h_i < 0 为低能契合度。
以只有 3 个神经元的 Hopfield 神经网络为例,其图形如下所示:
那么上图的权重矩阵就为:
- w_ii = 0 时,神经元不连接自己,所以权重为 0。
- A 不等于 B 时,w_BA = w_AB 对称。
神经网络的能量最小函数
整个神经网络的总能量 H 为所有神经元以及之间的权重的累乘积,如下:
- x_i:神经元 i 的激活状态(+1 或 -1)。
- x_j:神经元 j 的激活状态(+1 或 -1)。
- w_ij:神经元 i 与 j 之间的连接权重(需满足对称性,w_ij = w_ji)。
而 Hopfield 神经网络迭代计算的目的就在于求得符合 “能量最小化原则” 的权重矩阵参数。所以最小能量函数 E 就是总能量 H 的负值。这里使用负值,是因为物理学的习惯。这样的系统,低势能才是稳定态。
进而,将能力最小函数应用到神经网络中,我们就得到了 Hopfield 神经网络完整的能量最小函数模型,如下图所示。
新记忆的形成:训练中的参数调整迭代
Hopfield 认为神经元的连接权重 w_ij 应当满足 Hebbian 学习规则,以此来进行学习(权重参数调整),模拟了生物神经元突触的可塑性。
Hebb 学习法则指出:当 2 个神经元之间一同激活时,那么它们之间的连接会被加强。所以,得到得到连接权重参数的更新公式,如下图所示。
- Δw_ij 是神经元 i 和 j 之间的权重的变化量。
- η 是学习率,正数,控制权值更新的速度。
- 一个二值化矩阵向量 ξ,其中 ξ_i 表示第 i 个神经元的状态,ξ_j 表示第 j 个神经元的状态(-1 或 +1)。
将公式代入到能量函数中后,得到以下公式。显然的,此时当 ξ_i 和 ξ_j 都是 +1(激活)时,w_ij > 0,此时让 w_ij 变大,则会降低网络的总能量。符合 Hebb 学习法则。
如下公式小于 0。
在训练过程中,调整权重和偏置量参数的几何意义就是在能量景观中 “挖掘” 低谷。
记忆联想算法:推理中的神经元数值调整迭代
对比理解,感知机模型是一种前馈神经网络,推理中用于完成静态的非线性映射;而 Hopfield 模型是一个 “循环/递归/反馈” 神经网络,即:x_i 的输出最终会成为影响 x_i 自身的输入。
同时,Hopfield 模型也是一个反馈动力学系统,其状态演化遵循一个简单的动力学规则,即:对于任意神经元 x_i,其 t+1 时刻的状态由 t 时刻的状态决定。
这使得 Hopfield 网络能够自我调整,恢复到稳定状态。简而言之,推理过程中,Hopfield 神经网络通过动态更新神经元 x_i 的状态,使得网络的能量降低。每次迭代只改变一个神经元的状态,根据顺序逐一更新(进行联想修复),最终使得整个网络的总能量 E 不再降低。
更新公式如下所示:
- s_j(t_n) 是当前时刻第 j 个神经元的状态。
- s_i(t_n+1) 是下一时刻第 i 个神经元的状态。
- J_ij 是 i 和 j 之间的权重。
- 激活函数采用了 sgn 符号函数。
该公式的现实意义为:如果一个神经元 i 所连接的 N 个其他神经元及它们之间的权重乘积 > 0,则表示 i 被 “多数投票” 为 +1,否则为 -1。
即:x_i 转换为高能契合,可以提高总能量 H,降低能量最小函数值 E。
记忆多个模式(Pattern)
Hopfield 神经网络可以存储多个模式(图片),但存储容量有限,存储的数量取决于神经元数量的规模,通常是 0.14N 个模式(N 是神经元数量)。
如下是一幅 Hopfield 神经网络的能量景观示意图,每个记忆模式对应着网络中的一个极小值(但不是每个极小值对应一个记忆模式,可能是虚假的记忆)。
多个模式的权重矩阵就等于将全部模式的权重矩阵向量进行叠加。
应用示例
下面以记忆存储和联想修复 2 个 6x6 维的图像为例。
训练图像 1:
-
图像的二值化矩阵为(神经元的数值是通过图片的二值化矩阵向量完成输入的):
-
矩阵可以展开成向量 V:
V = [0,0,1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0] -
对应的图像为:
训练图像 2:
-
图像的二值化矩阵为(神经元的数值是通过图片的二值化矩阵向量完成输入的):
-
矩阵可以展开成向量 V:
V = [0,0,1,1,0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0] -
对应的图像为:
2 个模式存储的结果:
推理修复图形 3:
Python 代码实现:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt# -------------------------- 定义存储模式 --------------------------
# 霍普菲尔德网络中存储的"记忆"模式,这里用6x6二值矩阵表示简单图形
a = np.array([[0,0,1,1,0,0],[0,0,1,1,0,0],[1,1,1,1,1,1],[1,1,1,1,1,1],[0,0,1,1,0,0],[0,0,1,1,0,0]]) # 类似"十字"图形b = np.array([[0,0,1,1,0,0],[0,1,0,0,1,0],[1,0,0,0,0,1],[1,0,0,0,0,1],[0,1,0,0,1,0],[0,0,1,1,0,0]]) # 类似"圆环"图形c = np.array([[0,0,1,1,0,0],[0,0,1,1,0,0],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,0,0,1,0,0],[0,0,1,1,0,0]]) # 被噪声污染的"十字"(用于测试联想记忆)# ------------------------ 霍普菲尔德网络初始化 ------------------------
# 将矩阵展平为向量(霍普菲尔德神经元的状态表示)
array_a = a.flatten() # 36维向量(6x6=36神经元)
array_b = b.flatten()
input_array = [array_a, array_b] # 存储的记忆模式集合# 初始化权重矩阵(关键参数,体现Hebbian学习规则)
w = np.zeros((36, 36)) # 36x36权重矩阵(神经元全连接)# 权重训练过程:根据存储模式计算权重矩阵(外积规则)
for s in input_array:w0 = np.zeros((36, 36))for i in range(36):for j in range(36):if i == j:w0[i,j] = 0 # 禁止自连接(霍普菲尔德网络特征)else:# Hebbian学习规则:(2s[i]-1)将0/1转换为-1/1(对称性要求)w0[i,j] = (2*s[i]-1) * (2*s[j]-1) # 外积公式w += w0 # 累积多个模式的权重# -------------------------- 联想记忆测试 --------------------------
# 初始化输入(带噪声的测试模式)
c = c.flatten()
v0 = c # 初始状态(受损的输入)# 迭代更新过程(能量最小化搜索)
Y = np.zeros(36)
for t in range(10): # 迭代次数(通常收敛很快)v1 = np.zeros(36)for j in range(36): # 对每个神经元j计算输入总和for i in range(36):if i == j:continue # 跳过自连接else:v1[j] += w[i,j] * v0[i] # 加权输入求和# 激活函数(阈值判断,对应能量函数的梯度下降)Y[j] = 0 if v1[j] < 0 else 1 # 硬阈值函数v0 = Y # 更新神经元状态# -------------------------- 结果可视化 --------------------------
# 将结果恢复为二维矩阵并显示
result = np.array(v0).reshape(6, 6)
# 将二值矩阵转为图像(0->0,1->600灰度值)
p = Image.fromarray(result * 600)
plt.imshow(p)
plt.show()
注意,上述实现中使用了Hebb规则来更新权重,并且在网络状态更新时采用了简单的阈值函数,即 sign 函数。实际应用中,Hopfield 网络还可以采用不同的权重更新规则和激活函数,并且可以根据实际需求调整噪声处理能力和召回性能。在处理大型网络时,应确保对称性权重矩阵的正确性和处理效率。
最终推理修复结果:
局限性
Hopfield 神经网络的一大优点是其强大的联想记忆能力。网络能够通过训练过程存储多个模式,并在接收到与存储模式部分相关的输入时,通过迭代过程自动恢复出完整的模式。这种特性使得 Hopfield 神经网络非常适合应用于图像恢复、序列补全等需要关联记忆的任务。
Hopfield 神经网络的缺点:
-
易陷入局部极小值:Hopfield网络在迭代过程中寻找能量函数的局部极小值,这意味着网络可能无法在所有情况下都能找到全局最优解,特别是当输入模式非常复杂或者噪声较大时。网络可能在迭代过程中停在了一个并不反映原有存储模式的局部极小点,导致回忆出来的结果不准确或完全错误。
-
存储容量有限且易发生模式混淆:随着存储模式数量的增加,Hopfield网络的性能会逐渐下降。这是因为网络的权重矩阵必须反映出所有存储模式的信息,过多的模式会导致权重矩阵过于复杂,可能造成模式之间的相互干扰和混淆。此外,网络的稳定性也会随模式数量的增多而降低,表现为原本能够成功回忆的模式在加入新的模式后无法准确回忆出来。
鉴于以上优缺点,Hopfield网络在特定场合如图像恢复、优化问题等有限规模的模式记忆和优化任务中仍然有着实用价值,但在处理大规模、复杂或噪声严重的数据时,可能需要结合其他更先进的神经网络模型或算法来改进其性能。
相关文章:
人工智能发展史 — 物理学诺奖之 Hopfield 联想和记忆神经网络模型
目录 文章目录 目录1982 年,Hopfield 联想和记忆神经网络模型背景知识历史:霍普菲尔德简介神经学:大脑的联想记忆机制物理学:磁性材料的自旋玻璃理论和能量最小值函数 Hopfield 神经网络基本原理记忆存储(训练…...
Docker —— 技术架构的演进
Docker —— 技术架构的演进 技术架构演进总结单机架构优点缺点总结 应用数据分离架构优点缺点总结 应用服务集群架构1. Nginx2. HAProxy3. LVS(Linux Virtual Server)4. F5 BIG-IP对比总结选型建议 读写分离/主从分离架构1. MyCat简介 2. TDDLÿ…...
Docker与WSL2如何清理
文章目录 Docker与WSL2如何清理一、docker占据磁盘空间核心原因分析1. WSL2 虚拟磁盘的动态扩展特性2. Docker 镜像分层缓存与未清理资源 二、解决方案步骤 1:清理 Docker 未使用的资源步骤 2:手动压缩 WSL2 虚拟磁盘1. 关闭 WSL2 和 Docker Desktop2. 定…...
单片机嵌入式按键库
kw_btn库说明 本库主要满足嵌入式按键需求,集成了常用的按键响应事件:高电平、低电平、上升沿、下降沿、单击、双击、长按键事件。可以裸机运行,也可以配合实时操作系统运行。 本库开源连接地址:gitee连接 实现思路 本库采用C语…...
多多铃声 7.4| 拥有丰富的铃声曲库,满足不同用户的个性化需求,支持一键设置手机铃声
多多铃声是一款提供丰富铃声资源的应用程序,它拥有广泛的铃声曲库,涵盖各种风格和类型,能够满足不同用户的个性化需求。该应用程序支持分类浏览和热门榜单功能,让用户可以轻松找到当前最流行或自己感兴趣的铃声。此次分享的版本为…...
基于stm32的四旋翼飞行器:MPU6050讲解 · 上(参数读取)
大伙早上好,不知道大伙有没有飞行器情结,就是学习嵌入式就想做一个能飞的东西。小白兔不才,小白兔有啊,所以最近准备做一个简单的飞行器出来,如果失败了,那么这个系列就只能烂尾了,如果成功了&a…...
使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字
之前我写了一篇文章excel表中将无规律的文本型数字批量转化成真正的数字-CSDN博客 是使用excel自带的操作,相对繁琐。 今天使用xlwings操作,表格如下(有真正的数字,也有文本型数字,混在在一起)࿱…...
linux netlink实现用户态和内核态数据交互
1,内核态代码 #include <linux/module.h> #include <linux/netlink.h> #include <net/sock.h> #define NETLINK_TEST 31 struct sock *nl_sk NULL; static void nl_recv_msg(struct sk_buff *skb) { struct nlmsghdr *nlh; int pid; …...
学习黑客安全基础理论入门
准备安全课程内容 你已安装Kali和相关工具,并希望从基础开始学习安全。为了使课程更加互动,我会提供有趣的文本,并结合可视化内容,可能还会提供一些参考链接。内容方面,我会根据最新的中国网络安全法律作出更新&#…...
探索内容智能化的关键解决方案
北京先智先行科技有限公司拥有三款旗舰产品,分别是“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”。这三款产品在企业发展过程中扮演着重要角色。 北京先智先行科技有限公司围绕先知大模型等核心要素,构建了完备的业务体系。先知大模型私…...
学习黑客色即是空
二、Day 3 学习目标(保真版) 一句话目标: 学会用 Asset-Threat-Vulnerability-Risk (ATVR) 四件套给任何系统快速画“风险画像”,并能把它映射到黑客常说的 5 阶段攻击生命周期。 1. 30 分钟理论——ATVR 四件套 概念核心定义参考…...
【Java学习】关于springBoot的自动配置和起步依赖
关于springBoot的起步依赖:解决了spring框架中开发者配置依赖难的问题,各种依赖及版本的不同,可能引发不同的问题,使得开发者的精力大部分可能耗费在非业务代码中。所以springBoot起步依赖解决了各种依赖难的配置问题。 起步依赖…...
【LLaMA-Factory实战】1.3命令行深度操作:YAML配置与多GPU训练全解析
一、引言 在大模型微调场景中,命令行操作是实现自动化、规模化训练的核心手段。LLaMA-Factory通过YAML配置文件和多GPU分布式训练技术,支持开发者高效管理复杂训练参数,突破单机算力限制。本文将结合结构图、实战代码和生产级部署经验&#…...
【Mytais系列】介绍、核心概念
MyBatis 是一款优秀的 持久层框架,它通过简化 JDBC 操作、提供灵活的 SQL 映射能力,成为 Java 开发中处理数据库交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析: 一、MyBatis 框架概述 1. 核心定位 作用:将 Java 对象…...
Vivado FPGA 开发 | 创建工程 / 仿真 / 烧录
注:本文为 “Vivado FPGA 开发 | 创建工程 / 仿真 / 烧录” 相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Vivado 开发流程(手把手教学实例)(FPGA) 不完美先生 于 2018-04-…...
PowerShell从5.1升级到7.X
文章目录 环境背景安装PowerShell 7.X其它启动PowerShell 5.1和7.X$PSVersionTable.PSVersion启动PowerShell 5.1时强制启动7.X 参考 环境 Windows 11 专业版 背景 PowerShell 5.1是Windows内置的,发布时间是2016 年。现在PowerShell版本已经到了7.5.1࿰…...
域名与官网的迷思:数字身份认证的全球困境与实践解方-优雅草卓伊凡
域名与官网的迷思:数字身份认证的全球困境与实践解方-优雅草卓伊凡 一、官网概念的法律与技术界定 1.1 官网的实质定义 当卓伊凡被问及”公司域名就是官网吗”这一问题时,他首先指出:”这相当于问’印着某公司logo的建筑就是该公司总部吗’…...
Vue实现成绩增删案例
Vue实现成绩增删案例 案例功能需求案例实现实现思路完整代码功能演示 案例小结 案例功能需求 1.通过vue渲染数据,将成绩的相关信息显示出来(学号,学科,成绩) 2.能够增加相关的成绩信息 3.能够删除相关的成绩信息 4.能…...
开源项目实战学习之YOLO11:ultralytics-cfg-models-rtdetr(十一)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1. __init__.py2. model.py3. predict.py4. train.py5. val.py ultralytics-cfg-models-rtdetr 主要与 Ultralytics 库中 RTDETR(实时目标检测模型,R…...
【Bootstrap V4系列】学习入门教程之 组件-按钮(Buttons)
Bootstrap V4系列 学习入门教程之 组件-按钮(Buttons) 按钮(Buttons)一、示例二、可用作按钮的 HTML 标签三、带轮廓线的按钮四、按钮的尺寸五、活动状态六、禁用状态七、按钮插件切换状态Checkbox and radio buttons (…...
【java八股文】深入浅出synchronized优化原理
🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 synchronized优化原理 synchronized即使悲观锁也是乐观锁,拥有自适应性。 jvm内部会统计每个锁的竞争激烈程度&…...
裴蜀定理及其证明
裴蜀定理 对于所有整数 a a a和 b b b,存在: g c d ( a , b ) a x b y gcd(a,b)axby gcd(a,b)axby 并且 a x b y axby axby一定是 g c d ( a , b ) gcd(a,b) gcd(a,b)的倍数。 证明 定义一个集合: { a x b y | a x b y &…...
单片机嵌入式CAN库
kw_can库说明 本库是针对CAN类型数据的收发设计: 主要应用于大数据量(数据处理速度高于缓存CAN_RTX_FIFO_SIZE大小)接收不丢包可快速进出接收中断可跨线程调用发送接口。 本库开源连接地址:gitee连接 实现思路 本库采用C语言…...
基于 JSP 和 Servlet 的数字信息分析小应用
Java Web 实验:基于 JSP 和 Servlet 的数字信息分析小应用 一、实验目的 实现一个简单的 Java Web 应用,通过 JSP 表单收集用户输入的文本信息,提交至 Servlet 分析其中是否包含数字,并返回结果。掌握 JSP 与 Servlet 的协同工作…...
从零认识阿里云OSS:云原生对象存储的核心价值
引言 在云计算时代,海量数据的存储与管理成为企业数字化转型的关键命题。阿里云对象存储OSS(Object Storage Service)作为云原生的分布式存储服务,凭借其独特的架构设计和丰富的功能矩阵,正在成为企业构建数据湖、管理…...
2025年深圳杯数学建模(东三省)B题【颜色转换】原论文讲解
大家好呀,从发布赛题一直到现在,总算完成了2025年深圳杯数学建模(东三省)B题【颜色转换】完整的成品论文。 给大家看一下目录吧: 目录 摘 要: 一、问题重述 二.问题分析 2.1问题一 2.2问…...
开源语音合成和转换项目
开源语音合成和转换项目 大模型出来以后,语音合成和转换方面也有了很大的变化。在语音转换文字方面有Whisper、SeamlessM4T等;在语音合成方面有ChatTTS(中英文)、Orpheus TTS(仅仅支持英文)、Amphion&…...
考研408《计算机组成原理》复习笔记,第二章计算机性能
一、计算机各项性能指标 1、计算机系统整体的性能指标: 从宏观上看,整个计算机是由软件硬件共同性能决定的,但是【最主要的决定性的影响】还是来自于【硬件】 因为计算机组成原理主要讲【硬件】,那么我们也仅考虑【硬件性能】 2…...
智能决策支持系统的基本概念与理论体系
决策支持系统是管理科学的一个分支,原本与人工智能属于不同的学科范畴,但自20世纪80年代以来,由于专家系统在许多方面取得了成功,于是人们开始考虑把人工智能技术用于计算机管理中来。在用计算机所进行的各种管理中,如…...
什么是运算符重载
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型,本质上是函数重载。以下为您详细介绍: 实现原理与方式 - 原理:把指定的运算表达式转化为对运算符函数的调用࿰…...
自定义Dockerfile,发布springboot项目
(1) 上传jar包 把hello项目打成一个可执行的jar包 hello-1.0-SNAPSHOT.jar,把这个jar包上传到linux中 (2) 创建文件,文件名my_hello(就是一个Dockerfile),内容如下 #1.定义父镜像(定义当前工程依赖的环境):…...
什么是多租户系统
随着云计算和 SaaS(Software as a Service)模式的普及,多租户架构(Multi-Tenant Architecture)成为 SaaS 产品设计中的核心模式之一。多租户架构允许多个用户(租户)共享同一套基础设施和应用&am…...
摩尔缠论课程合集完整版核心课程前置课程圈子问答星球圈子摩尔缠论三个阶段
一、教程描述 这是一套摩尔缠论课程合集(完整版),内容非常系统并且极为全面,包括视频、图片和文档等不同文件类型,摩尔缠论共有三个版本,有些类似软件版本迭代,后一版本是前一版本的升级和进化…...
java学习之数据结构:三、八大排序
主要介绍学过的各种排序算法 目录 1.插入排序 1.1直接插入排序 1.2希尔排序 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 3.2快速排序 4.归并排序 5.基数排序 1.插入排序 1.1直接插入排序 基本思想:就是将待排序的数据按照其元素值的…...
Docker Compose:服务编排:批量管理多个容器
通过docker compose进行容器批量管理:一次性启动四个容器(nginx,tomcat,redis,mysql) (1) 创建docker-compose目录 mkdir ~/docker-compose cd ~/docker-compose (2&…...
微服务设计约束
相较于单体应用,微服务架构在提升开发、部署等环节灵活性的同时,也提升了在运维、监控环节的复杂性。结合实践总结,微服务架构的设计有以下四条设计约束遵循: (1)微服务个体约束 一个设计良好的微服务应用,所完成的功…...
C语言中的自定义类型 —— 结构体.位段.联合体和枚举
自定义类型 1. 前言2. 结构体2.1 结构体的声明2.2 结构体变量的定义和初始化2.3 结构体的特殊声明2.4 结构体的自引用2.5 结构体的内存对齐2.6 修改默认对齐数2.7 结构体传参 3. 位段4. 联合体5. 枚举6. 结言 1. 前言 在C语言中已经为用过户提供了内置类型,如&…...
【序列贪心】摆动序列 / 最长递增子序列 / 递增的三元子序列 / 最长连续递增序列
⭐️个人主页:小羊 ⭐️所属专栏:贪心算法 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 摆动序列最长递增子序列递增的三元子序列最长连续递增序列 摆动序列 摆动序列 贪心策略:统计出所有的极大值和极小…...
从零开发一个B站视频数据统计Chrome插件
从零开发一个B站视频数据统计Chrome插件 前言 B站(哔哩哔哩)作为国内最大的弹幕视频网站之一,视频的播放量、点赞、投币、收藏等数据对于内容创作者和数据分析者来说非常重要。本文将带你一步步实现一个Chrome插件,自动统计并展…...
【Python实战】飞机大战
开发一个飞机大战游戏是Python学习的经典实战项目,尤其适合结合面向对象编程和游戏框架(如Pygame)进行实践。以下是游戏设计的核心考虑因素和模块划分建议: 一、游戏设计核心考虑因素 性能优化 Python游戏需注意帧率控制ÿ…...
WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘
1.控制器层方法返回类型不能为元组 控制器层方法返回类型为元组时,序列化结果为空。 因为元组没有属性只有field,除非使用IncludeFields参数专门指定,否则使用System.Text.Json进行序列化时不会序列化field var options new JsonSerializ…...
人工智能助力工业制造:迈向智能制造的未来
在当今数字化转型的浪潮中,人工智能(AI)技术正逐渐成为推动工业制造领域变革的核心力量。智能制造作为工业 4.0 的重要组成部分,通过将 AI 技术与传统制造工艺深度融合,正在重塑整个生产流程,提高生产效率、…...
影楼精修-露齿笑算法解析
注意,为避免侵权,本文图片均为AIGC生成或网络公开数据; 像素蛋糕-露齿笑 在介绍本文之前,先说一下,其实露齿笑特效,并非像素蛋糕首创,早在几年前,face app就率先推出了这个效果&am…...
【iview】es6变量结构赋值(对象赋值)
变量的解构赋值 以iview的src/index.js中Vue.prototype.$IVIEW改造为例练习下怎么使用变量的解构赋值 原来的写法: const install function(Vue, opts {}) {if (install.installed) return;locale.use(opts.locale);locale.i18n(opts.i18n);Object.keys(iview).fo…...
在Windows系统中使用Docker发布镜像到镜像仓库
在Windows系统中使用Docker发布镜像到镜像仓库的步骤如下: 步骤 1:安装并配置Docker 安装Docker Desktop • 下载Docker Desktop for Windows并安装。 • 确保启用WSL 2或Hyper-V后端(根据系统版本选择)。 验证Docker运行状态 打…...
糖尿病筛查常识---秋浦四郎
糖尿病筛查可以早期发现糖尿病或糖尿病前期(血糖异常但未达到糖尿病标准),以利于及时干预,预防并发症。因为许多人患上糖尿病时没有明显症状,但已经开始对身体造成损害,有了明显糖尿病症状才检查发现糖尿病…...
CSS 预处理器 Sass
目录 Sass 一、Sass 是什么? 二、核心功能详解 1. 变量(Variables) 2. 嵌套(Nesting) 3. 混合宏(Mixins) 4. 继承(Inheritance) 5. 运算(Operations&…...
Mybatisplus:一些常用功能
自动驼峰 mybatis-plus:configuration:# 开启驼峰命名规则,默认true开启map-underscore-to-camel-case: true# 控制台日志打印,便于查看SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl TableName 作用:表名注解,标识…...
Golang WaitGroup 用法 源码阅读笔记
使用 sync.WaitGroup可以用来阻塞等待一组并发任务完成 下面是如何使用sync.WaitGroup的使用 最重要的就是不能并发调用Add()和Wait() var wg sync.WaitGroupfor ... {wg.Add(1) // 不能和wg.Wait()并发执行go func() {// 不能在启动的函数里面执行wg.Add(), 否则会panicde…...
第二章:一致性基础 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
在本章中,我们将介绍足够多的缓存一致性知识,以便理解一致性模型是如何与缓存相互作用的。我们在 2.1 节首先给出在本入门教程中所考虑的系统模型。为了简化本章以及后续章节的阐述,我们选择了尽可能简单的系统模型,该模型足以说明…...