第 19 章 自适应共振、稳定性与 Hopfield 网络
本章合并原书第 19 章(自适应共振理论 ART)、第 20 章(稳定性)、第 21 章(Hopfield 网络)。这三章延续前面的竞争网络与递归网络理论,数学完整,但与今天的量化实务直接联系较弱,所以压缩为一章:每个主题讲清"它解决什么问题、核心机制是什么、关键公式和一个代表性例题",略去连续时间微分方程的逐步推导。真正可以迁移到量化工作的是三种思想:带警戒阈值的在线聚类(ART)、用 Lyapunov 函数论证系统收敛(稳定性)、把离散选择问题写成二次能量函数(Hopfield 设计,即今天的 QUBO 建模)。需要做生物神经建模、硬件实现或递归网络理论研究时,再回原书细读。
学习目标
读完本章,你应当能够:
- 说清竞争学习的"稳定性/可塑性两难",以及 ART1 用"自下而上选原型 + 自上而下验证期望 + 警戒参数 \(\rho\)"解决它的流程,能手算一个小型 ART1 训练。
- 区分 Lyapunov 稳定与渐近稳定,会用 Lyapunov 直接法判断平衡点稳定性,知道它只是充分条件。
- 在 Lyapunov 函数导数只是半负定时,会按 \(V\to G\to Z\to L\) 的顺序使用 LaSalle 不变性定理及其推论。
- 写出连续时间 Hopfield 网络的模型和 Lyapunov 函数,理解高增益极限下网络在最小化二次函数 \(-\tfrac12\mathbf a^T\mathbf W\mathbf a-\mathbf b^T\mathbf a\)。
- 会用 Hebb 规则设计内容寻址存储,解释伪模式和约 15% 的容量限制。
- 会把一个带二值变量的组合问题(如基数约束选股)写成 Hopfield 能量/QUBO 形式,并理解惩罚系数对可解性的影响。
读前导读
本章是选读章。 ART、稳定性理论和 Hopfield 网络在今天的量化流程里几乎不直接使用。第一次读本册时可以只看本导读和 19.4 节,其中第 (3) 点"Hopfield 能量 = QUBO"对做组合优化(基数约束选股、指数复制)的读者最有用。
这一章在解决什么问题。 三个主题各回答一个问题。ART 回答"在线聚类时,怎样让新数据不把旧类别冲掉":先找最像的类,再检查像不像得够(警戒参数 \(\rho\)),不够就开新类。稳定性理论回答"一个按微分方程演化的系统最后会不会停下来、停在哪":找一个随时间只降不升的"能量"函数 \(V\),就能断定系统收敛。Hopfield 网络把这个思路反过来用:先写出想最小化的目标函数,再设计一个网络让它的能量恰好是这个目标,网络自己演化下去就是在做优化。最后这一点就是今天 QUBO(二值变量的二次无约束优化)建模的前身。
需要先想起来的数学。
- 二次型与对称矩阵:\(\mathbf a^T\mathbf W\mathbf a=\sum_{i,j}W_{ij}a_ia_j\)。组合方差 \(\mathbf w^T\boldsymbol\Sigma\mathbf w\) 就是一个二次型,你已经很熟悉。二次型的 Hessian 是 \(2\mathbf W\)(\(\mathbf W\) 对称时)。见 第 00 册第 06 章 线性代数速成。
- 特征值与特征向量:\(\mathbf W\mathbf v=\lambda\mathbf v\) 说的是沿 \(\mathbf v\) 方向矩阵只做伸缩。Hessian 的特征值为负的方向,函数向下弯(凹),为正的方向向上弯(凸),有正有负就是鞍点。见第 06 章。
- 对时间求导的链式法则:若 \(V\) 依赖于 \(\mathbf a(t)\),则 \(dV/dt=\sum_i\frac{\partial V}{\partial a_i}\frac{da_i}{dt}=[\nabla V]^T\frac{d\mathbf a}{dt}\)。Lyapunov 方法的全部计算就是这一步。见 第 00 册第 05 章 多元微积分与优化。
- ε-δ 式的定义:19.2.1 节 Lyapunov 稳定的定义是"对任意……存在……使得……"的句式。读法见 第 00 册第 01 章 函数极限与连续 与 第 08 章 读懂数学证明与符号。
怎么读这一章。 19.1 ART 看 19.1.1 的问题和 19.1.4 的例题即可;19.2 看定义、定理 1 和例 P20.1,LaSalle 部分第一次可以只记结论"能量不再下降的地方里,能留得住的点才是归宿";19.3 重点看 19.3.2 高增益能量和 P21.5 的惩罚项手法;19.4 的 QUBO 代码与解读值得完整读。
19.1 自适应共振理论(ART)
19.1.1 问题:稳定性/可塑性两难
第 15 章(原书第 16 章)的竞争网络和第 18 章的 Grossberg 网络都有一个缺陷:输入不断到来时,权值矩阵不一定收敛。Grossberg 证明,若输入模式不多,或输入形成的簇数相对于第 2 层神经元数不太多,学习最终会稳定;但对任意输入序列,标准竞争网络的学习并不稳定。原因在于网络的可塑性(plasticity):每个新样本都会把获胜原型往自己这边拉,新学习会侵蚀旧学习。这就是稳定性/可塑性两难(stability/plasticity dilemma):系统怎样既能接纳重要的新模式,又对无关的模式保持稳定?
Carpenter 与 Grossberg 提出的自适应共振理论(Adaptive Resonance Theory, ART)给出的答案是引入期望(expectation):每个输入到来时,先找最接近的原型,再把原型当作"期望"回送去与输入比较;匹配不够好,就放弃这个原型改选别的,必要时启用一个全新的原型。旧原型不会被硬拉去迁就一个和它不像的新样本。原书只详细讲 ART1,它只处理二值输入,但足以展示 ART 的全部关键机制。
19.1.2 ART1 的结构与三个子系统的稳态
ART1 在 Grossberg 网络上增加了三部分:第 2 层到第 1 层的期望连接 \(\mathbf W^{2:1}\)、定向子系统(orienting subsystem)、增益控制(gain control)。记号上,\(\mathbf W^{1:2}\) 是第 1 层到第 2 层的权值(每一行是一个归一化原型,用 instar 学习),\(\mathbf W^{2:1}\) 是第 2 层到第 1 层的权值(每一列是一个原型/期望,用 outstar 学习)。原书先写出每个子系统的分流(shunting)微分方程,再求稳态。我们直接给稳态结论,它们就是 ART1 算法的全部内容。
第 1 层(比较层)。 第 2 层不活跃时 \(\mathbf a^1=\mathbf p\);第 2 层神经元 \(j\) 获胜时
原书例题:\(\varepsilon=0.1\),\({}^+b^1=1\),\({}^-b^1=1.5\),\(\mathbf W^{2:1}=\begin{bmatrix}1&1\\0&1\end{bmatrix}\),\(\mathbf p=[0,1]^T\),第 2 层神经元 2 获胜。方程化为 \(dn^1_1/dt=-30n^1_1-5\),\(dn^1_2/dt=-40n^1_2+5\),零初值解 \(n^1_1(t)=-\tfrac16(1-e^{-30t})\),\(n^1_2(t)=\tfrac18(1-e^{-40t})\)。一负一正,所以 \(\mathbf a^1=[0,1]^T=[0,1]^T\cap[1,1]^T\),与稳态结论一致。
第 2 层(竞争层)。 赢者通吃:
定向子系统(判定匹配度)。 稳态下(取偏置为 1)
19.1.3 学习律与子集/超集两难
只有在定向子系统判定匹配充分(不重置)时,两组权值才同时更新,这个"先匹配、再适应"的状态叫共振(resonance),ART 由此得名。快速学习(权值在输入撤走前到达稳态)下:
第二个式子里的归一化是为了解决子集/超集两难(subset/superset dilemma):若原型 \([1,1,0]^T\) 和 \([1,1,1]^T\) 未归一化,输入 \([1,1,0]^T\) 与两者内积都是 2,分不出谁更近;归一化后变成 \([1/2,1/2,0]^T\) 和 \([1/3,1/3,1/3]^T\),内积为 \(1\) 与 \(2/3\),正确的原型胜出。这里的"归一化"不是欧氏单位长度,只是非零元素越多的行,每个元素越小。
注意第 2 层"选谁"和定向子系统"接不接受"用的是两个不同标准:前者是归一化原型与输入的内积,后者是 \(\|\mathbf a^1\|^2/\|\mathbf p\|^2\)。先选最近,再验证够不够近。另外,原型在共振时只会"减少 1"(AND),所以一个类的原型单调收缩,这是稳定性的来源之一。
19.1.4 ART1 算法与例题
初始化:\(\mathbf W^{2:1}\) 全部置 1(未用过的神经元是"白板",第一次获胜必然共振);\(\mathbf W^{1:2}\) 每个元素为 \(\zeta/(\zeta+S^1-1)\)。
每个输入的处理:(1) \(\mathbf a^1=\mathbf p\);(2) 第 2 层取 \(\mathbf W^{1:2}\mathbf a^1\) 最大者 \(j\);(3) 期望 \(\mathbf w^{2:1}_j\);(4) \(\mathbf a^1=\mathbf p\cap\mathbf w^{2:1}_j\);(5) 若 \(\|\mathbf a^1\|^2/\|\mathbf p\|^2<\rho\),抑制神经元 \(j\),回到 (2) 在剩余神经元中竞争;(6) 否则共振,按上式更新第 \(j\) 行和第 \(j\) 列。反复呈现所有输入直到权值不变。Carpenter–Grossberg 证明 ART1 对任意输入集合都能形成稳定聚类。
例题(原书 P19.5、P19.6)。 \(\mathbf p_1=[0,1,0]^T\),\(\mathbf p_2=[1,0,0]^T\),\(\mathbf p_3=[1,1,0]^T\),\(\zeta=2\),\(S^2=3\),初值 \(\mathbf W^{1:2}\) 全为 \(2/(2+3-1)=0.5\)。
- \(\rho=0.4\):\(\mathbf p_1\) 平局取神经元 1,共振,原型 1 变为 \([0,1,0]^T\);\(\mathbf p_2\) 由神经元 2 赢得,原型 2 变为 \([1,0,0]^T\);\(\mathbf p_3\) 输入 \([1,1,1]^T\) 平局取神经元 1,\(\mathbf a^1=[0,1,0]^T\),比值 \(1/2\ge0.4\),共振,权值不变。结果 2 类:\(\{\mathbf p_1,\mathbf p_3\}\)、\(\{\mathbf p_2\}\)。
- \(\rho=0.6\):呈现 \(\mathbf p_3\) 时神经元 1 比值 \(1/2<0.6\) 被重置,神经元 2 同样被重置,神经元 3(白板)获胜,\(\mathbf a^1=[1,1,0]^T\),共振,\({}_3\mathbf w^{1:2}=2[1,1,0]^T/(2+2-1)=[2/3,2/3,0]^T\)。结果 3 类。
警戒越接近 1,聚类越细。原书 P19.7 用 5×5 点阵图形进一步展示了一个微妙现象:某个原型吸收新模式后收缩,原先归在它名下的模式可能不再充分匹配,只好转去占用一个空闲神经元。
其他 ART 结构(了解即可):ART2 处理模拟输入(第 1 层换成负责归一化、去噪、比较的若干子层);ART3 给重置机制加了化学递质的生物模型;ARTMAP 用两个 ART 模块做有监督学习;Fuzzy ARTMAP 引入模糊逻辑,对噪声更稳健。
19.2 动态系统的稳定性
ART 解决了"权值永不稳定"的问题,但还有另一种稳定性问题:实现短期记忆的那组非线性微分方程本身会不会收敛?递归网络 \(d\mathbf a/dt=\mathbf g(\mathbf a,\mathbf p,t)\) 给定输入和初值后,输出可能收敛、振荡、发散,甚至混沌。原书第 20 章给出分析工具。
19.2.1 定义
用有摩擦的钢珠作直观:槽底的钢珠被推开后会回到槽底——渐近稳定;平面上的钢珠被推开后停在新位置、不回也不跑远——Lyapunov 意义下稳定;山顶的钢珠稍一扰动就滚下——不稳定。
设平衡点在原点。
- Lyapunov 稳定:对任意 \(\varepsilon>0\),存在 \(\delta>0\),使 \(\|\mathbf a(0)\|<\delta\) 时对所有 \(t>0\) 有 \(\|\mathbf a(t)\|<\varepsilon\)。
- 渐近稳定:存在 \(\delta>0\),使 \(\|\mathbf a(0)\|<\delta\) 时 \(\mathbf a(t)\to\mathbf 0\)。
- 正定函数:\(V(\mathbf 0)=0\),\(\mathbf a\ne\mathbf 0\) 时 \(V(\mathbf a)>0\);半正定、负定、半负定类似。
使轨迹收敛到某稳定点的初值集合称为该点的吸引域(basin of attraction)。
白话解释:Lyapunov 稳定的定义像一份风险限额协议。风控(对手方)先报一个容忍半径 \(\varepsilon\):"轨迹永远不许离原点超过 \(\varepsilon\)"。系统要能回一个起始半径 \(\delta\):"只要初始扰动小于 \(\delta\),我保证做到"。无论风控把 \(\varepsilon\) 报得多小,系统都能找到相应的 \(\delta\),就叫稳定。它只保证"不跑远",不保证"回得来";渐近稳定额外要求轨迹最终回到原点。平面上的钢珠属于前者,碗底的钢珠属于后者。
19.2.2 Lyapunov 直接法
定理 1(Lyapunov)。 对自治系统 \(d\mathbf a/dt=\mathbf g(\mathbf a)\),若存在正定函数 \(V(\mathbf a)\) 使
直观上 \(V\) 是"广义能量":能量一直下降,系统最终停在某个能量最低的状态。这是充分条件:找到 \(V\) 就能下结论,找不到什么也说明不了。
例(原书 P20.1):\(da_1/dt=-a_1+a_2^2\),\(da_2/dt=-a_2(a_1+1)\)。取 \(V=a_1^2+a_2^2\),
单摆例子暴露的不足。 有阻尼单摆 \(da_1/dt=a_2\),\(da_2/dt=-(g/l)\sin a_1-(c/ml)a_2\),用机械能 \(V=\tfrac12ml^2a_2^2+mgl(1-\cos a_1)\) 作 Lyapunov 函数,得
19.2.3 LaSalle 不变性定理
LaSalle 的思路是:先找出能量不再下降的点(\(dV/dt=0\)),再问系统会不会被困在这些点上。能把轨迹困住、且能量不变的地方,才是轨迹最终的归宿。
- \(G\) 上的 Lyapunov 函数:\(V\) 连续可微,\(dV/dt\) 在集合 \(G\) 上不变号。不再要求 \(V\) 正定。
- \(Z=\{\mathbf a:dV/dt=0,\ \mathbf a\in\overline G\}\)。
- 不变集:从集合中出发的解永远留在集合内。\(L\) 是 \(Z\) 中最大的不变集。
定理 2(LaSalle)。 若 \(V\) 是 \(G\) 上的 Lyapunov 函数,则每条始终留在 \(G\) 中的解在 \(t\to\infty\) 时趋于 \(L\cup\{\infty\}\);轨迹有界则趋于 \(L\)。
推论。 取 \(G\) 为下水平集 \(\Omega_\eta=\{\mathbf a:V(\mathbf a)<\eta\}\) 的一个有界连通分量,且 \(G\) 上 \(dV/dt\le0\),则 \(\mathrm{closure}(L\cap G)\) 是吸引子,\(G\) 落在它的吸引区域内。推论的好处是同时给出"哪些点稳定"和"一部分吸引域"。
单摆的完整论证。 取 \(g=9.8,m=1,l=9.8,c=1.96\),\(V=96.04[\tfrac12a_2^2+(1-\cos a_1)]\),\(dV/dt=-19.208a_2^2\)。取 \(\eta=100\),\(G\) 为 \(\Omega_{100}\) 中含原点的分量;\(Z\) 是 \(a_1\) 轴上 \(|a_1|\lesssim1.6\) 的一段。从这段上任一非零角度、零速度出发,摆会下落、速度变为非零、离开 \(Z\),只有 \(a_1=0\) 能留下,所以 \(L=\{\mathbf 0\}\):原点渐近稳定,\(G\) 在其吸引域内。若把 \(\eta\) 取到 300,\(G\) 变成一个大连通区域,\(L=\{a_1=n\pi,a_2=0\}\) 包含多个平衡点,只能说"收敛到其中之一",信息反而变少。
选 \(V\) 与 \(G\) 的原则:\(G\) 尽量大(吸引域大),\(Z\) 尽量小(吸引子集合小)。\(V\equiv0\) 是全空间上的 Lyapunov 函数,但 \(Z=\mathbb R^n\),毫无信息。两个导数同号的 Lyapunov 函数之和仍是 Lyapunov 函数,且 \(Z=Z_1\cap Z_2\),不会比任何一个差。
19.3 连续时间 Hopfield 网络
19.3.1 模型与 Lyapunov 函数
Hopfield 1984 年的模型来自运放加 RC 电路,转成网络记号为
19.3.2 高增益极限:网络在最小化一个二次函数
增益 \(\gamma\to\infty\) 时,\(f\) 趋于符号函数,积分项在 \((-1,1)\) 的大部分范围趋于 0,得到高增益 Lyapunov 函数
由此产生 Hopfield 设计方法:Hopfield 网络没有学习律,而是选 \(\mathbf W\)、\(\mathbf b\),让高增益 \(V\) 恰好等于想最小化的目标函数。难点在于把问题写成二次形式。
19.3.3 内容寻址存储与伪模式
内容寻址存储(content-addressable memory)就是自联想记忆:给出部分或带噪的内容,网络收敛到最接近的存储原型。原型 \(\mathbf p_q\in\{\pm1\}^S\),\(Q\ll S\)。用 Hebb 规则
伪模式(spurious patterns):\(-\mathbf p_q\) 也在 \(X\) 内,原型的某些线性组合对应的角也是极小。经验规则:Hebb 规则下存储模式数不宜超过神经元数的约 15%。把 \(\mathbf W\) 对角置零(\(\mathbf W'=\mathbf W-Q\mathbf I\))只是把 \(X^\perp\) 方向的曲率由 0 变成正,对性能几乎没有影响。
例题(原书 P21.1)。 \(\mathbf p_1=[1,1,-1,-1]^T\),\(\mathbf p_2=[1,-1,1,-1]^T\),
例题(原书 P21.5,A/D 转换)。 两位 A/D 用 \(a_1+2a_2\) 近似模拟量 \(y\),\(a_i\in\{0,1\}\)。Tank–Hopfield 目标
19.4 量化实战
这三章的模型本身(二值 ART1、模拟电路 Hopfield 网络)在现代量化流程中几乎不直接使用,下面三点是能迁移的思想。
(1) 带警戒阈值的在线状态识别。 做市场状态(regime)识别时,若用普通 k-means 在线更新,近期的新行情会把旧状态的中心慢慢拖走,这正是稳定性/可塑性两难。ART 式做法是:新样本先找最近的状态原型,相似度不够(距离超过阈值)就开一个新状态,而不是硬塞进旧状态;只有"共振"时才更新原型。这与 leader clustering、DP-means 的思路相近。阈值的作用与 \(\rho\) 相同,只是方向相反:距离阈值越小,状态越细。
(2) 稳定性分析。 梯度流 \(d\mathbf x/dt=-\nabla F(\mathbf x)\) 以 \(F\) 本身作 Lyapunov 函数,\(dF/dt=-\|\nabla F\|^2\le0\),LaSalle 定理说明有界轨迹收敛到驻点集合,但不保证是全局最优,不同初值各有吸引域。这是理解组合优化、模型训练中"目标单调下降却停在局部极小"的统一框架。做市商库存控制、均值回复类模型判断是否回到均衡,也常用二次型 Lyapunov 函数论证。
(3) Hopfield 能量 = QUBO。 基数约束选股、指数复制选成分股、整手约束等问题都可写成二值变量上的二次目标(QUBO)。今天一般用整数规划求解器、模拟退火处理,但"把约束写成惩罚项"和"异步单变量更新使能量不增"的思想直接来自本章。下面的代码演示:在 12 只股票中选 4 只等权组合使方差最小,目标为
推导拆解:\(\mathbf Q\)、\(\mathbf c\) 怎么来,以及怎么读出 \(\mathbf W\)、\(\mathbf b\)。
- 展开惩罚项:\(A(\sum_ix_i-K)^2=A\,\mathbf x^T\mathbf 1\mathbf 1^T\mathbf x-2AK\,\mathbf 1^T\mathbf x+AK^2\)。所以 \(\mathbf Q=\boldsymbol\Sigma/K^2+A\mathbf 1\mathbf 1^T\),\(\mathbf c=-2AK\mathbf 1\),常数 \(AK^2\) 不影响最优解。
- 把 \(\mathbf x^T\mathbf Q\mathbf x\) 拆成对角与非对角:\(\sum_iQ_{ii}x_i^2+\sum_{i\ne j}Q_{ij}x_ix_j\)。二值变量满足 \(x_i^2=x_i\),对角部分变成线性项 \(\sum_iQ_{ii}x_i\)。
- 于是 \(E=\mathbf x^T(\mathbf Q-\mathrm{diag}\mathbf Q)\mathbf x+(\mathbf c+\mathrm{diag}\mathbf Q)^T\mathbf x+\text{常数}\)。与 \(-\tfrac12\mathbf x^T\mathbf W\mathbf x-\mathbf b^T\mathbf x\) 逐项对照:\(-\tfrac12\mathbf W=\mathbf Q-\mathrm{diag}\mathbf Q\),\(-\mathbf b=\mathbf c+\mathrm{diag}\mathbf Q\)。
异步更新规则 \(x_i=1\) 当且仅当 \(\mathbf W_i\mathbf x+b_i>0\) 的含义:\(\mathbf W_i\mathbf x+b_i\) 恰好等于"把 \(x_i\) 从 0 翻成 1 时能量下降多少"(因为对角已置零,\(\mathbf W_i\mathbf x\) 不含 \(x_i\) 自己)。下降为正就翻成 1,否则置 0,所以每一步能量都不增。
先用 ART1 实现核对原书例题和 P21.1:
import numpy as np, itertools
def art1(patterns, rho, zeta=2.0, S2=3, max_epochs=10):
"""ART1 快速学习版本(原书 9 步算法)。"""
S1 = len(patterns[0])
W21 = np.ones((S1, S2)) # L2->L1 期望,列为原型
W12 = np.full((S2, S1), zeta / (zeta + S1 - 1)) # L1->L2,行为归一化原型
labels = [None] * len(patterns)
for ep in range(max_epochs):
changed = False
for q, p in enumerate(patterns):
p = np.asarray(p, float)
inhibited = np.zeros(S2, bool)
while True:
a1 = p.copy() # 第 2 层未激活时 a1 = p
n2 = W12 @ a1
n2[inhibited] = -np.inf
if np.all(inhibited):
raise RuntimeError("所有神经元都被重置,需要新增神经元(E19.6)")
j = int(np.argmax(n2)) # 平局取下标最小者
a1 = p * W21[:, j] # a1 = p AND w_j
if a1.sum() / p.sum() < rho: # 定向子系统:失配则重置
inhibited[j] = True
continue
new_row = zeta * a1 / (zeta + a1.sum() - 1)
if not (np.allclose(W12[j], new_row) and np.allclose(W21[:, j], a1)):
changed = True
W12[j], W21[:, j] = new_row, a1 # 共振:两组权值同时更新
labels[q] = j + 1
break
if not changed:
break
return labels, W12, W21
P = [[0, 1, 0], [1, 0, 0], [1, 1, 0]]
for rho in (0.4, 0.6):
lab, W12, W21 = art1(P, rho)
print(f"rho={rho}: 类别={lab}")
print("W12=\n", np.round(W12, 3), "\nW21=\n", W21.astype(int))
# ---- Hopfield 内容寻址存储:P21.1 的 Hebb 设计与特征结构 ----
p1 = np.array([1, 1, -1, -1]); p2 = np.array([1, -1, 1, -1])
W = np.outer(p1, p1) + np.outer(p2, p2)
print("高增益 Hessian -W 的特征值:", np.round(np.linalg.eigvalsh(-W), 6))
V = lambda a: -0.5 * a @ W @ a
corners = [np.array(c) for c in itertools.product([-1, 1], repeat=4)]
minima = [c for c in corners
if all(V(c) <= V(c * np.where(np.arange(4) == i, -1, 1)) for i in range(4))]
print("能量为", V(p1), "的角:",
[tuple(int(v) for v in c) for c in minima if np.isclose(V(c), V(p1))])
关键输出:
rho=0.4: 类别=[1, 2, 1]
W12=
[[0. 1. 0. ]
[1. 0. 0. ]
[0.5 0.5 0.5]]
W21=
[[0 1 1]
[1 0 1]
[0 0 1]]
rho=0.6: 类别=[1, 2, 3]
W12=
[[0. 1. 0. ]
[1. 0. 0. ]
[0.667 0.667 0. ]]
W21=
[[0 1 1]
[1 0 1]
[0 0 0]]
高增益 Hessian -W 的特征值: [-4. -4. 0. 0.]
能量为 -8.0 的角: [(-1, -1, 1, 1), (-1, 1, -1, 1), (1, -1, 1, -1), (1, 1, -1, -1)]
与原书 P19.5、P19.6 完全一致(\(\rho=0.4\) 时第 3 个神经元未被使用,仍是初值 0.5 和全 1 列);P21.1 的稳定点正是 \(\pm\mathbf p_1,\pm\mathbf p_2\)。
再看两个量化场景:
import numpy as np
from itertools import combinations
rng = np.random.default_rng(0)
# ---------- (1) 带警戒阈值的在线状态聚类(ART 思想的连续版本) ----------
# 模拟 3 个市场状态的日度特征:[年化波动, 20日动量, 平均相关性]
centers = np.array([[0.12, 0.04, 0.30], [0.25, -0.06, 0.55], [0.45, -0.15, 0.80]])
regime = np.repeat([0, 1, 0, 2, 1, 0], 120)
X = centers[regime] + rng.normal(0, [0.02, 0.02, 0.04], (len(regime), 3))
Z = (X - X[:250].mean(0)) / X[:250].std(0) # 只用前 250 天统计量做标准化
def vigilance_cluster(Z, rho, lr=0.05):
protos, labels = [], []
for z in Z:
if protos:
d = np.linalg.norm(np.array(protos) - z, axis=1)
j = int(np.argmin(d))
if d[j] <= rho: # 足够像:归入并缓慢更新原型(共振)
protos[j] += lr * (z - protos[j]); labels.append(j); continue
protos.append(z.copy()); labels.append(len(protos) - 1) # 不像:开新状态
return np.array(labels), np.array(protos)
for rho in (1.0, 2.5, 6.0):
lab, pr = vigilance_cluster(Z, rho)
purity = sum(np.bincount(regime[lab == k]).max() for k in np.unique(lab)) / len(lab)
print(f"阈值 {rho:>3}: 簇数 = {len(pr):2d}, 纯度 = {purity:.3f}")
# ---------- (2) Hopfield 能量 = QUBO:基数约束的低方差选股 ----------
N, K = 12, 4
F = rng.normal(size=(N, 2)) * [0.15, 0.08]
Sigma = F @ F.T + np.diag(rng.uniform(0.01, 0.04, N)) # 两因子协方差
def solve(A, restarts=200):
# 目标:等权 K 只的组合方差 x'Σx/K² + 惩罚 A(Σx-K)²,x_i ∈ {0,1}
Q = Sigma / K**2 + A * np.ones((N, N)); c = -2 * A * K * np.ones(N)
E = lambda x: x @ Q @ x + c @ x + A * K**2
# 对照高增益 Hopfield 能量 V = -1/2 x'Wx - b'x:W = -2Q(对角置零),b = -(c + diag Q)
W = -2 * Q; np.fill_diagonal(W, 0); b = -(c + np.diag(Q))
def descent(x): # 异步更新:每次只翻转一位,能量不增
while True:
changed = False
for i in rng.permutation(N):
new = 1.0 if W[i] @ x + b[i] > 0 else 0.0
if new != x[i]: x[i] = new; changed = True
if not changed: return x
brute = min(E(np.isin(np.arange(N), s).astype(float)) for s in combinations(range(N), K))
sols = [descent(rng.integers(0, 2, N).astype(float)) for _ in range(restarts)]
en = np.array([E(x) for x in sols]); k = np.array([x.sum() for x in sols])
return brute, np.mean(np.isclose(en, brute)), np.mean(k == K)
for A in (0.05, 0.003, 0.001):
brute, hit, feas = solve(A)
print(f"惩罚 A={A:<6}: 穷举最优={brute:.5f} 命中全局最优比例={hit:.3f} 满足基数约束比例={feas:.3f}")
关键输出:
阈值 1.0: 簇数 = 13, 纯度 = 1.000
阈值 2.5: 簇数 = 3, 纯度 = 1.000
阈值 6.0: 簇数 = 2, 纯度 = 0.667
惩罚 A=0.05 : 穷举最优=0.00471 命中全局最优比例=0.000 满足基数约束比例=1.000
惩罚 A=0.003 : 穷举最优=0.00471 命中全局最优比例=0.015 满足基数约束比例=1.000
惩罚 A=0.001 : 穷举最优=0.00471 命中全局最优比例=0.000 满足基数约束比例=0.260
读法如下。第一段:阈值太严(1.0)把同一状态切成 13 个碎片,阈值太松(6.0)把两个不同状态并成一个,适中的阈值(2.5)恰好找回 3 个状态;这与 \(\rho\) 控制 ART 类别粒度是同一回事,实践中要在历史样本上校准阈值,并注意标准化统计量只能用训练期数据。第二段说明了 Hopfield 网络最大的实际弱点:异步下降一次只翻转一位,惩罚项 \(A\) 太大时,"换掉一只股票"必须先经过 \(K\pm1\) 的高能量状态,网络被困在局部极小(命中率为 0);\(A\) 太小又满足不了基数约束。这正是原书所说"伪模式""吸引域"问题在优化里的样子,也是今天用模拟退火、分支定界而不用纯下降的原因。
本章小结
ART1 用"自下而上按内积选原型、自上而下用 AND 验证期望、匹配比例低于警戒 \(\rho\) 就重置"的机制,让竞争学习对任意输入序列都能稳定聚类,\(\rho\) 控制类别粒度。分析递归网络是否收敛需要稳定性理论:Lyapunov 直接法给出充分条件;能量导数只半负定时用 LaSalle 不变性定理,在 \(Z=\{dV/dt=0\}\) 中找最大不变集 \(L\),有界轨迹都收敛到 \(L\),推论同时给出部分吸引域。连续时间 Hopfield 网络在 \(\mathbf W\) 对称、\(f\) 递增时以 (21.8) 为 Lyapunov 函数,平衡点都是驻点;高增益下网络最小化二次函数 \(-\tfrac12\mathbf a^T\mathbf W\mathbf a-\mathbf b^T\mathbf a\),由此把任务写成二次目标再读出权值。Hebb 设计的内容寻址存储会产生反相和组合伪模式,容量约为神经元数的 15%。量化中可迁移的是在线聚类的警戒思想、Lyapunov 收敛论证与 QUBO 建模。
| 概念 | 公式 / 要点 |
|---|---|
| ART1 第 1 层 | 第 2 层不活跃 \(\mathbf a^1=\mathbf p\);神经元 \(j\) 获胜 \(\mathbf a^1=\mathbf p\cap\mathbf w^{2:1}_j\);需 \({}^+b^1<{}^-b^1<2\,{}^+b^1\) |
| 定向子系统 | \(|\mathbf a^1|^2/|\mathbf p|^2<\rho\) 时重置,\(\rho=\alpha/\beta\) 为警戒参数 |
| ART1 快速学习 | \(\mathbf w^{2:1}_j=\mathbf a^1\);\({}_j\mathbf w^{1:2}=\zeta\mathbf a^1/(\zeta+|\mathbf a^1|^2-1)\) |
| Lyapunov 定理 | \(V\) 正定,\(\dot V\) 半负定 ⇒ 稳定;\(\dot V\) 负定 ⇒ 渐近稳定(充分条件) |
| LaSalle | \(Z=\{\dot V=0\}\cap\overline G\),\(L\) 为 \(Z\) 中最大不变集,有界轨迹 \(\to L\) |
| Hopfield 模型 | \(\varepsilon\dot{\mathbf n}=-\mathbf n+\mathbf W\mathbf a+\mathbf b\),\(\mathbf a=\mathbf f(\mathbf n)\) |
| Hopfield Lyapunov | \(\dot V=-\varepsilon\sum_i (f^{-1})'(a_i)\,\dot a_i^2\le0\) |
| 高增益能量 | \(V=-\tfrac12\mathbf a^T\mathbf W\mathbf a-\mathbf b^T\mathbf a\),\(\nabla^2V=-\mathbf W\) |
| Hebb 存储 | \(\mathbf W=\sum_q\mathbf p_q\mathbf p_q^T\);正交原型下特征值 \(S\)(\(X\))与 \(0\)(\(X^\perp\));容量约 \(0.15S\) |
练习
基础
- 第 1 层取 \({}^+b^1=2\),\({}^-b^1=3\),\(\mathbf W^{2:1}=\begin{bmatrix}0&1\\1&1\end{bmatrix}\),\(\mathbf p=[1,1]^T\),第 2 层神经元 1 活跃,求稳态 \(\mathbf a^1\)。 提示:参数满足 \(2<3<4\),故 \(\mathbf a^1=\mathbf p\cap\mathbf w^{2:1}_1=[0,1]^T\)(原书 P19.1)。
- 定向子系统 \(\alpha=0.5\),\(\beta=2\),\(\mathbf p=[1,1,1]^T\),\(\mathbf a^1=[1,0,1]^T\),会不会重置? 提示:\(\rho=0.25\),比值 \(2/3>0.25\),不重置(P19.3)。
- 用 \(V=a_1^2+a_2^2\) 判断 \(da_1/dt=-a_1^5\),\(da_2/dt=-5a_2^7\) 原点的稳定性。 答案:\(\dot V=-2a_1^6-10a_2^8\),负定,渐近稳定(P20.2)。
- 原型 \(\mathbf p_1=[1,1]^T\),\(\mathbf p_2=[-1,1]^T\) 用 Hebb 规则设计 Hopfield 网络,写出 \(\mathbf W\) 和 Hessian,说明网络为何"什么都记住了等于没记住"。 提示:\(\mathbf W=2\mathbf I\),Hessian \(-2\mathbf I\),四个角都是极小,每个象限都是一个角的吸引域(P21.3)。
- 对 P21.5 的 A/D 目标展开,验证 \(a_i^2\) 项相互抵消并读出 \(\mathbf W\)、\(\mathbf b\)。 提示:第一项展开含 \(\tfrac12a_1^2+2a_2^2\),第二项含 \(-\tfrac12a_1^2-2a_2^2\),恰好抵消;剩下 \(2a_1a_2+a_1(\tfrac12-y)+a_2(2-2y)\),与 \(-\tfrac12\mathbf a^T\mathbf W\mathbf a-\mathbf b^T\mathbf a\) 对照即得。
进阶
- 一维系统 \(da/dt=-(a-1)(a-2)\),取 \(V=(a-2)^2\),用 LaSalle 推论求 \(a=2\) 的吸引域下界,并解释 \(\eta>1\) 时为何得不出更多结论。 提示:\(\dot V=-2(a-1)(a-2)^2\);\(\eta\le1\) 时吸引域至少含 \(1<a\le3\);\(\eta>1\) 后 \(G\) 含 \(a=1\),\(\dot V\) 在 \(G\) 上变号(P20.5)。
- 证明 Hopfield 网络中若 \(f^{-1}\) 线性,则 \(d\mathbf a/dt\propto-\nabla V(\mathbf a)\)。 提示:由 \(\partial V/\partial a_i=-\varepsilon (f^{-1})'(a_i)\,da_i/dt\),\((f^{-1})'\) 为常数。
- 修改本章的 ART1 代码,在所有神经元都被重置时新增一个第 2 层神经元(原书 E19.6/E19.7),用 \(\rho=0.9\) 重做 P19.5 的三个模式,看需要几个类别。 提示:\(\rho=0.9\) 时 \(\mathbf p_3\) 与前两个原型的匹配比例都是 \(1/2\),三个模式各占一类;若 \(S^2\) 只有 2,就必须新增神经元。
- 在本章 QUBO 代码中,把"单位翻转"改成"在已选与未选中各取一只交换"的邻域搜索(始终保持 \(\sum x_i=K\)),比较命中全局最优的比例。思考这为什么不再需要惩罚项。 提示:交换邻域只在可行集内移动,约束自动满足,惩罚项恒为 0;能量壁垒消失后,多次重启的命中率会大幅上升。
- 用一个梯度流 \(d\mathbf x/dt=-\nabla F(\mathbf x)\),\(F(x)=(x^2-1)^2\),说明以 \(F\) 为 Lyapunov 函数时 \(L\) 是什么、各平衡点的吸引域是什么、\(x=0\) 是否稳定。 答案要点:\(\dot F=-F'(x)^2\le0\),\(Z=L=\{-1,0,1\}\);\(x>0\) 的初值收敛到 1,\(x<0\) 的收敛到 \(-1\),\(x=0\) 是 \(F\) 的局部极大,不稳定,吸引域只有它自己。
原书推荐习题:P19.5、P19.6、P19.7,E19.4、E19.6、E19.7;P20.3、P20.4、P20.5,E20.10、E20.11;P21.1、P21.3、P21.4、P21.5,E21.1、E21.4、E21.11。
原书对照
| 本章小节 | 原书章节 | PDF 页码 |
|---|---|---|
| 19.1 ART | 第 19 章 Adaptive Resonance Theory(第 1 层 19.1、第 2 层 19.2、定向子系统 19.3、学习律 19.4–19.5、算法 19.6、其他 ART 19.7、例题 P19.1–P19.7) | p.755–804 |
| 19.2 稳定性 | 第 20 章 Stability(定义、Lyapunov 定理、单摆、LaSalle 定理与推论、例题 P20.1–P20.5) | p.805–838 |
| 19.3 Hopfield 网络 | 第 21 章 Hopfield Network(模型、Lyapunov 函数、高增益、Hebb 设计、伪模式、对角置零、例题 P21.1–P21.5) | p.839–882 |
注:第 19–21 章正文中引用的演示程序名沿用第一版编号(如 nnd16al1、nnd17ds、nnd18hn),附录 C 中第二版编号为 nnd19al1、nnd20ds、nnd21hn,以附录为准。