ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hopfield 网络:联想记忆的「鼻祖」,为什么它能「回忆」?

Hopfield 网络:联想记忆的「鼻祖」,为什么它能「回忆」? 从联想记忆到能量函数理解神经动力学的数学本质开头为什么照片模糊了你还能认出来上一篇我们学习了动态规划解决的是「决策」问题。今天我们学习Hopfield 网络解决的是「记忆」问题。联想记忆 给你一张模糊的照片 → 你能认出是谁 给你一句歌词的开头 → 你能想起整首歌 给你一个残缺的图案 → 你能补全它 Hopfield 网络就是模仿这个过程 输入残缺/有噪声的模式 → 输出完整的原始模式一、Hopfield 网络结构1.1 网络特点Hopfield 网络结构 ═══════════════════════════════════════════════════════════════════ 特点 1. 全连接每个神经元与其他所有神经元连接 2. 对称权重w_ij w_ji 3. 无自连接w_ii 0 4. 二值激活x_i ∈ {-1, 1}或 {0, 1} ┌─────────────────┐ │ x₁ ──── x₂ │ │ │ ╲ ╱ │ │ │ │ ╲ ╱ │ │ │ │ ╲╱ │ │ │ │ ╱╲ │ │ │ │ ╱ ╲ │ │ │ │ ╱ ╲ │ │ │ x₃ ──── x₄ │ └─────────────────┘1.2 与感知器的区别特性感知器Hopfield连接方式单层前馈全连接递归权重有向对称目标分类联想记忆更新一次性迭代直到稳定二、联想记忆2.1 存储模式存储模式 ═══════════════════════════════════════════════════════════════════ 假设要存储 K 个模式x¹, x², ..., x^K 每个模式是 N 维向量x^k (x₁^k, x₂^k, ..., x_N^k) x_i^k ∈ {-1, 1} 权重矩阵 W Σ_k (x^k)(x^k)ᵀ - K I W_ij Σ_k x_i^k x_j^k i ≠ j W_ii 0 直觉 如果两个神经元在所有模式中经常同时为 1 或 -1 → 它们的连接权重为正正相关2.2 回忆过程回忆过程异步更新 ═══════════════════════════════════════════════════════════════════ 输入残缺/有噪声的模式 x(0) 迭代 for t 0, 1, 2, ... 随机选择一个神经元 i h_i Σ_j w_ij x_j(t) x_i(t1) sign(h_i) if x(t1) x(t): break # 收敛 输出稳定的完整模式 类比 人看到模糊的照片 → 大脑自动补全 → 识别出是谁三、能量函数3.1 能量定义Hopfield 网络的能量函数 ═══════════════════════════════════════════════════════════════════ E -Σ_{ij} w_ij x_i x_j 性质 1. 能量有下界 2. 每次更新能量单调递减ΔE ≤ 0 3. 稳定点是能量的局部最小值 能量 ↑ │╲ │ ╲ │ ╲ │ ○ 稳定点能量最小 │ └──────────→ 状态3.2 稳定性证明稳定性证明单个神经元更新 ═══════════════════════════════════════════════════════════════════ 假设更新神经元 i x_i(t1) sign(Σ_j w_ij x_j(t)) 能量变化 ΔE -x_i(t1) Σ_j w_ij x_j(t) x_i(t) Σ_j w_ij x_j(t) -(x_i(t1) - x_i(t)) Σ_j w_ij x_j(t) 如果 x_i(t1) ≠ x_i(t) x_i(t1) sign(Σ_j w_ij x_j(t)) → x_i(t1) 和 Σ_j w_ij x_j(t) 同号 → ΔE 0 结论能量单调递减网络一定会收敛到稳定点四、Python 实现 Hopfield 网络4.1 完整代码importnumpyasnpimportmatplotlib.pyplotaspltclassHopfieldNetwork:Hopfield 网络def__init__(self,n_neurons): 参数: n_neurons: 神经元数量 self.nn_neurons self.Wnp.zeros((n_neurons,n_neurons))defstore(self,pattern): 存储一个模式 参数: pattern: 形状 (n_neurons,)值为 -1 或 1 # 外积规则self.Wnp.outer(pattern,pattern)/self.n# 去除自连接np.fill_diagonal(self.W,0)defstore_patterns(self,patterns):存储多个模式forpatterninpatterns:self.store(pattern)defrecall(self,pattern,n_iterations100,async_updateTrue): 回忆从噪声输入恢复原始模式 参数: pattern: 初始输入可能是噪声 n_iterations: 最大迭代次数 async_update: 是否异步更新 statepattern.copy()prev_statenp.zeros_like(state)for_inrange(n_iterations):ifasync_update:# 异步更新随机选择神经元foriinnp.random.permutation(self.n):hself.W[i] state state[i]1ifh0else-1else:# 同步更新所有神经元同时更新hstate self.W statenp.where(h0,1,-1)# 检查收敛ifnp.array_equal(state,prev_state):breakprev_statestate.copy()returnstatedefenergy(self,state):计算能量return-0.5*state self.W statedefcapacity(self):估计最大存储容量# 经验法则约 0.138N 个模式returnint(0.138*self.n)4.2 测试存储和回忆# 创建 Hopfield 网络n100# 10x10 图案hopfieldHopfieldNetwork(n)# 定义要存储的模式5x5 简化版patterns[]labels[T,L,X,O,]# 模式 TTnp.array([[1,1,1,1,1],[-1,-1,1,-1,-1],[-1,-1,1,-1,-1],[-1,-1,1,-1,-1],[-1,-1,1,-1,-1]]).flatten()# 模式 LLnp.array([[1,-1,-1,-1,-1],[1,-1,-1,-1,-1],[1,-1,-1,-1,-1],[1,-1,-1,-1,-1],[1,1,1,1,1]]).flatten()# 模式 XXnp.array([[1,-1,-1,-1,1],[-1,1,-1,1,-1],[-1,-1,1,-1,-1],[-1,1,-1,1,-1],[1,-1,-1,-1,1]]).flatten()patterns[T,L,X]pattern_labels[T,L,X]# 存储模式hopfield.store_patterns(patterns)# 测试回忆添加噪声noise_levels[0.1,0.2,0.3,0.4]fig,axesplt.subplots(len(patterns),len(noise_levels)1,figsize(15,10))fori,(pattern,label)inenumerate(zip(patterns,pattern_labels)):# 原始模式axes[i,0].imshow(pattern.reshape(5,5),cmapgray)axes[i,0].set_title(fOriginal:{label})axes[i,0].axis(off)forj,noiseinenumerate(noise_levels):# 添加噪声noisypattern.copy()n_flipint(noise*len(pattern))flip_idxnp.random.choice(len(pattern),n_flip,replaceFalse)noisy[flip_idx]*-1# 回忆recalledhopfield.recall(noisy)# 可视化axes[i,j1].imshow(recalled.reshape(5,5),cmapgray)axes[i,j1].set_title(fNoise:{noise:.0%})axes[i,j1].axis(off)plt.tight_layout()plt.show()4.3 能量收敛可视化# 能量收敛过程defrecall_with_energy(hopfield,pattern,n_iterations50):回忆并记录能量变化statepattern.copy()energies[hopfield.energy(state)]for_inrange(n_iterations):foriinnp.random.permutation(hopfield.n):hhopfield.W[i] state state[i]1ifh0else-1energies.append(hopfield.energy(state))returnstate,energies# 测试noisypatterns[0].copy()flip_idxnp.random.choice(100,30,replaceFalse)noisy[flip_idx]*-1recalled,energiesrecall_with_energy(hopfield,noisy)# 绘制能量曲线plt.figure(figsize(10,4))plt.plot(energies,b-,linewidth2)plt.xlabel(Iteration)plt.ylabel(Energy)plt.title(Energy Convergence During Recall)plt.grid(True)plt.show()print(f初始能量:{energies[0]:.4f})print(f最终能量:{energies[-1]:.4f})print(f能量下降:{energies[0]-energies[-1]:.4f})五、工业应用5.1 图像识别图像识别 ═══════════════════════════════════════════════════════════════════ 应用场景 - 手写数字识别MNIST - 人脸识别简单版本 - 字符识别 优势 - 对噪声和残缺不敏感 - 实现简单 局限 - 存储容量有限约 0.138N - 只能存储二值图像5.2 优化问题优化问题 ═══════════════════════════════════════════════════════════════════ 旅行商问题TSP - 用 Hopfield 网络求解 - 能量函数对应路径长度 - 稳定点对应近似最优解 其他组合优化 - 图着色 - 调度问题5.3 联想记忆联想记忆 ═══════════════════════════════════════════════════════════════════ 异联想 输入模式 A 输出模式 B 应用 - 关键词 → 完整句子 - 图片 → 描述 - 问题 → 答案六、避坑指南使用 Hopfield 的 3 个陷阱坑 1存储模式太多 → 伪稳定点错误做法存储太多模式# ❌ 存储超过容量n100hopfieldHopfieldNetwork(n)foriinrange(20):# 超过 0.138*100 ≈ 14hopfield.store(np.random.choice([-1,1],n))# 会出现伪稳定点不是原始模式的稳定点正确做法控制存储模式数量# ✅ 在容量范围内n100max_patternsint(0.138*n)# ≈ 14hopfieldHopfieldNetwork(n)foriinrange(10):# 小于 14hopfield.store(np.random.choice([-1,1],n))坑 2权重矩阵不对称 → 能量不单调递减错误做法权重不对称# ❌ 权重不对称hopfield.W[i,j]1hopfield.W[j,i]0.5# 不对称# 能量可能增加网络不稳定正确做法确保对称# ✅ 对称权重hopfield.W[i,j]1hopfield.W[j,i]1# 对称坑 3自连接不设为 0 → 稳定点不稳定错误做法保留自连接# ❌ 自连接不为 0hopfield.W[i,i]1# 神经元会影响自己可能导致不稳定正确做法设为 0# ✅ 无自连接np.fill_diagonal(hopfield.W,0)七、Hopfield 网络 vs 现代神经网络特性Hopfield现代 RNN/LSTM记忆方式联想记忆序列记忆训练算法外积规则反向传播容量约 0.138N理论上无限应用图像识别自然语言处理八、本篇总结核心要点回顾Hopfield 网络全连接、对称权重、无自连接联想记忆从残缺/噪声输入恢复完整模式存储规则W Σ (xk)(xk)ᵀ - K I回忆过程异步更新直到收敛能量函数单调递减稳定点是局部最小容量限制约 0.138N 个模式下篇预告下一篇我们学习卡尔曼滤波。Hopfield 网络处理静态模式卡尔曼滤波处理动态系统的状态估计。下一篇你将学到贝叶斯推断基础卡尔曼滤波的预测和更新粒子滤波处理非线性系统用 Python 手写卡尔曼滤波本期互动你对 Hopfield 网络有什么看法你用过 Hopfield 网络吗在什么场景下你觉得 Hopfield 网络和 Transformer 的注意力机制有什么关系你知道 Hopfield 网络的哪些应用欢迎在评论区留言。系列目录篇标题状态01Haykin 精讲开篇从「只会调参」到「理解神经网络的灵魂」✅ 完成02感知器神经网络的「鼻祖」为什么它能「学会」分类✅ 完成03LMS 算法从最小二乘到随机梯度下降工业自适应滤波的核心✅ 完成04反向传播神经网络为什么能「学习」用 NumPy 手写 BP✅ 完成05核方法为什么 SVM 能处理非线性问题理解「升维」的本质✅ 完成06支持向量机最大间隔的「艺术」为什么它是「小数据之王」✅ 完成07正则化为什么模型越复杂越容易过拟合L1/L2/Dropout✅ 完成08PCA为什么降维能「去噪」从特征值分解到核 PCA✅ 完成09SOM无监督学习的「聚类之王」为什么它能「自组织」✅ 完成10信息论为什么「信息最大化」能学特征从熵到 ICA✅ 完成11玻尔兹曼机深度学习的「前世」从统计力学到 RBM✅ 完成12动态规划强化学习的「数学基础」从 MDP 到值迭代✅ 完成13Hopfield 网络联想记忆的「鼻祖」为什么它能「回忆」✅ 当前14卡尔曼滤波为什么它能「预测」从贝叶斯推断到粒子滤波⏳ 下一篇15Haykin 精讲终篇从感知器到深度学习——一部神经网络的「进化史」⏳ 待写点赞收藏转发是我持续更新的动力
返回列表