尧图精选

双向联想记忆BAM实验:Kosko外积规则与MATLAB实现

🕒 发布时间:2026/9/18 19:26:41 📁 来源:尧图网络
简介这份《神经网络导论》实验二双向联想记忆文档面向正在学习神经网络与人工智能课程的高校学生及自学者聚焦 Kosko 型双向联想记忆BAM网络的原理与仿真实现。内容围绕实验目的、实验原理、实验内容与步骤、实验结论及应用前景展开涵盖 BAM 的两层双向连接结构、Hebb 规则下的正反向权矩阵、齐次网络能量函数以及网络对噪声与残缺样本的联想复原能力并给出连接权值矩阵等具体实验数据。资源包为 1 个 docx 文档大小约 21KB结构完整、便于直接参考与整理实验报告。目前已有 141 人学习适合需要完成同类实验、理解稳定状态与能量函数概念、或希望快速掌握 BAM 仿真流程的读者可作为课程实验的参考模板与复习资料。1. 从一次“存不进也取不出”的实验说起做《神经网络导论》实验二的人多半会在双向联想记忆Bidirectional Associative MemoryBAM这一步卡住前一个实验里单层感知机、Hebb 规则都跑通了换成 BAM 之后训练集明明只有四对模式测试时却要么输出全 1要么在两三个模式之间来回跳。问题通常不在代码写错而在于 BAM 是一个双向的异联想网络它的权矩阵由两组模式的外积共同决定稳定性条件、编码方式和单层网络完全不同。这个实验要解决的核心问题是给定若干组“输入模式—输出模式”配对让网络既能由 A 回忆出 B也能由 B 回忆出 A并且对带噪声的输入有一定容错。它适合已经写过 Hebb 学习、Hopfield 网络想进一步理解异联想记忆和能量函数收敛的读者。Kosko 在 1988 年提出的这套结构本质上是把两个 Hopfield 网络用一组共享权重耦合起来所以权矩阵的维度、转置关系和更新顺序是整份实验报告里最容易被扣分的地方。下面按“原理—编码—实现—排错—进阶”的顺序把 MATLAB 里能直接复现的路径讲清楚。2. BAM 的权矩阵与 Kosko 外积规则2.1 为什么 BAM 的权重是一个非方阵Hopfield 网络的权矩阵是方阵因为它的输入输出在同一空间BAM 要连接两个不同维度的空间所以权矩阵必然是长方阵。设输入层有 n 个神经元输出层有 m 个神经元则权矩阵 W 的尺寸是 m×n。正向传播用 W 左乘输入向量反向传播用 W 的转置左乘输出向量这就是“双向”两个字的来源。Kosko 给出的外积学习规则非常直接对每一对训练模式 (a, b)把它们的转置外积累加起来。$$ W \sum_{p1}^{P} b_p , a_p^{T} $$其中 a_p 是第 p 个输入模式n×1b_p 是第 p 个输出模式m×1。如果模式用双极性编码取值 1/-1这个规则天然满足 Hebb 假设如果用二值编码0/1外积结果会偏向正数回忆时容易饱和。这是实验里第一个必须做的选择。2.2 双极性编码与二值编码的差别编码方式取值权矩阵特点回忆稳定性双极性1 / -1零均值正负对称好能量函数单调下降二值0 / 1全正偏置易饱和差需额外阈值处理双极性噪声1 / -1 加翻转与训练同分布可测容错率常见做法是统一用双极性。如果原始数据是 0/1 的矩阵先做一次映射A 2*A - 1。这一步不做后面回忆出来的结果会一直卡在全 1很多人以为是迭代次数不够其实是编码问题。2.3 用 MATLAB 构造权矩阵的最小代码% 输入模式 A每列一个模式n 行 P 列 % 输出模式 B每列一个模式m 行 P 列 % 要求 A、B 均为双极性编码1/-1 function W bam_train(A, B) [n, P] size(A); [m, ~] size(B); if n ~ size(A,1) || P ~ size(B,2) error(A 与 B 的模式数不一致); end W zeros(m, n); for p 1:P W W B(:,p) * A(:,p); % 外积累加 end end逻辑说明循环里B(:,p) * A(:,p)是一个 m×n 的秩一矩阵累加 P 次得到最终权重。参数上P 不能超过 min(n, m) 太多否则模式之间会互相干扰这是 BAM 的容量限制和 Hopfield 的 0.15n 经验值类似但更紧。如果 P 接近或超过 n、m 的较小值建议先降维或改用其他编码。3. 回忆过程异步更新与能量收敛3.1 正向和反向回忆的更新公式训练完之后回忆分两个方向。给定带噪声的输入 a正向回忆function b bam_recall_forward(W, a) % a 为 n×1 双极性向量 net W * a; % m×1 b sign(net); b(b 0) 1; % sign 返回 0 时强制为 1 end反向回忆则用转置function a bam_recall_backward(W, b) net W * b; % n×1 a sign(net); a(a 0) 1; end参数说明sign是硬限幅激活函数BAM 的稳定性证明依赖它。如果换成 sigmoid能量函数不再保证单调下降迭代可能不收敛。b(b0)1这一行不能省因为当 net 恰好为 0 时sign 返回 0会破坏双极性假设后续再乘 W 就全乱。3.2 异步更新为什么比同步更稳同步更新是一次性把所有神经元同时翻转容易在两个状态之间振荡异步更新每次只更新一个神经元能量函数每一步都下降最终必到不动点。MATLAB 里实现异步的常见写法是随机选下标function a bam_async(W, a, steps) n length(a); for t 1:steps i randi(n); % 随机选一个神经元 net W(:,i) * a; % 只算第 i 个的局部场 a(i) sign(net); if a(i) 0, a(i) 1; end end end逻辑说明W(:,i) * a是第 i 个输出神经元接收到的总输入只更新它自己。steps 一般取 5 到 10 倍神经元数即可太多没有额外收益。实验报告里如果要求画能量曲线可以在每次更新后计算 E -a * W * b 并记录。3.3 能量函数与收敛判据BAM 的能量函数定义为$$ E -\frac{1}{2} a^{T} W b - \frac{1}{2} b^{T} W^{T} a $$双极性编码下每次异步更新 E 不增所以迭代一定会停。判断收敛不用算 E直接比较前后两次状态是否相同即可。如果 200 步还没停基本可以断定是编码没转双极性或者 P 太大导致模式串扰。4. 实验里最容易踩的四个坑4.1 模式数超过容量导致“串味”BAM 的稳定记忆容量大约在 min(n, m) / (2 log min(n, m)) 量级比很多人想象的少。实验里如果给了 6 对 8 维模式回忆出错是正常的。验证方法是把 P 从 2 逐步加到 6观察正确回忆率什么时候掉下来这个曲线本身就是实验报告里很有价值的一张图。4.2 噪声比例设得不对加噪声一般用随机翻转一定比例的位。翻转比例 10% 以内通常能恢复超过 30% 基本失效。代码里这样写function a_noisy add_noise(a, ratio) n length(a); k round(n * ratio); idx randperm(n, k); a_noisy a; a_noisy(idx) -a_noisy(idx); % 双极性翻转 end参数说明ratio 是翻转比例k 是翻转位数。注意翻转的是双极性值不是 0/1所以用取负而不是取反。如果数据还是 0/1先转换再调用。4.3 把 W 和 W 用反正向回忆用 W反向回忆用 W这是定义决定的。但实验里经常有人把训练时的 A、B 顺序写反导致 W 的维度变成 n×m后面所有矩阵乘法都错位。检查方法训练完打印size(W)应该等于[m, n]其中 m 是输出维度n 是输入维度。4.4 用二值数据直接训练前面提过0/1 数据不转双极性权矩阵全正回忆时 sign 永远输出 1。这是实验二最高频的错误没有之一。转换只需要一行A 2*A - 1; B 2*B - 1;但漏掉它后面调参调到天亮也没用。5. 从实验到可用批量测试与结果可视化5.1 批量跑正确回忆率的脚本单次回忆看不出网络好坏实验报告里通常要求统计。下面这段把训练、加噪、回忆、比对串起来ratios 0:0.05:0.4; acc zeros(size(ratios)); for r 1:length(ratios) correct 0; for trial 1:50 p randi(size(A,2)); a_noisy add_noise(A(:,p), ratios(r)); b_rec bam_recall_forward(W, a_noisy); if isequal(b_rec, B(:,p)) correct correct 1; end end acc(r) correct / 50; end plot(ratios, acc, -o); xlabel(噪声翻转比例); ylabel(正确回忆率);逻辑说明外层遍历噪声比例内层每个比例跑 50 次随机试验isequal做逐元素比较。参数上50 次是精度和耗时的折中实验报告里写 100 次也可以。这条曲线能直观看出容错边界比只贴一次结果有说服力得多。5.2 用 imagesc 看权矩阵和回忆结果MATLAB 的imagesc适合展示权矩阵的正负分布figure; subplot(1,2,1); imagesc(W); colorbar; title(权矩阵 W); subplot(1,2,2); imagesc([A(:,1), bam_recall_backward(W, B(:,1))]); title(原模式与反向回忆);参数说明imagesc会自动把数值映射到色阶双极性数据下正负颜色分明能一眼看出 W 是否对称、是否有明显偏置。如果整张图偏一个颜色回到 4.4 检查编码。5.3 和 Hopfield、前馈网络的对比写法实验报告里如果要求讨论可以指出Hopfield 是自联想输入输出同维BAM 是异联想能跨维度前馈网络如 BP需要反复迭代调权BAM 一次外积就完成训练代价是容量小、对噪声更敏感。这个对比不用展开成论文两三句话点出适用场景即可比如“模式对少、要求训练快”选 BAM“模式多、要求泛化”选 BP。5.4 一个容易被忽略的验证技巧训练完先做一次“无噪声自检”对每一对训练模式用原始 A 正向回忆看是否等于 B再用原始 B 反向回忆看是否等于 A。两个方向都过才说明权矩阵构造正确。这一步只要几行代码却能挡掉后面 80% 的调试时间。如果自检就不过问题一定在训练阶段不用去调回忆的迭代次数。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →