《Active Inference: The Free Energy Principle in Mind, Brain, and Behavior》第13章:Appendix C: An Annotated Example of the Matlab Code

附录C:Matlab 代码注释示例

Thomas Parr, Giovanni Pezzulo, Karl J. Friston

出自:Active Inference (MIT Press, 2022)

📖 章节总结

本附录以一个可运行的 Matlab 示例,具体展示了如何将前文关于主动推理的理论形式化为一个离散时间、离散状态的 POMDP(部分可观测马尔可夫决策过程)模型。其核心价值不在于提供复杂算法的新内容,而在于把抽象符号系统逐步转译为 SPM/DEM 框架中的数据结构与索引语法,使读者能够理解生成模型在代码层面的实际组织方式。

这一示例围绕经典的 T-迷宫任务展开:智能体需要在位置与情境不完全可见的条件下,结合线索与奖赏结果进行状态推断和策略选择。附录重点说明四组对象如何在程序中被编码:观测模型 A、状态转移模型 B、偏好 C、初始先验 D,以及由动作序列构成的策略空间 V。通过这些结构,读者可以看到主动推理并非”先写一个决策器、再外接一个世界模型”,而是把感知、行动与偏好统一纳入同一生成模型之中。

附录最后调用 spm_MDP_VB_X 完成变分消息传递、策略评估、状态演化和结果生成,并用标准绘图函数输出信念更新、策略后验、精度动态与试次摘要。换言之,本章的真正主题是:如何从”数学上的生成模型”过渡到”可执行的认知仿真脚本”。对于理解理论与实现之间的映射关系,这一附录具有方法论上的基础意义。

🧩 核心概念

1. 生成模型的代码化表示

附录最重要的概念,是把主动推理的生成模型拆解为几个标准张量或矩阵对象。A 表示隐状态到观测结果的映射;B 表示状态随时间与动作的转移;C 表示智能体对结果的先验偏好;D 表示试次起始时对隐状态的先验信念;V 则定义可供评估的策略。理论中的概率图模型,在 Matlab 中被实现为若干元胞数组与多维数组。

2. 多模态与多因子结构

A 矩阵使用花括号索引不同观测模态,例如位置线索与奖赏反馈;其后续索引则对应隐状态因子的不同取值组合。B 矩阵则以隐状态因子为单位组织,不同因子可以具有不同的可控性。这个区分体现了主动推理模型的一项关键优势:它天然支持多模态观测与多因子隐状态,并允许不同因子具备不同的动力学结构。

3. 可控与不可控状态的区分

在示例中,位置因子是可控的,因此 B{1} 需要第三个索引来标记不同动作所对应的状态转移矩阵;而情境因子不受智能体控制,因此 B{2} 只需一个单位矩阵 eye(2)。这说明动作并非附加在模型外部的控制信号,而是通过选择不同的状态转移映射进入生成模型内部。

4. 偏好以对数概率表示

C 矩阵并不直接存放”奖励值”,而是存放对结果的对数偏好。若两个结果之间差值为6,则偏好更高的结果相对更低者具有 e⁶ 倍的相对倾向。这一表示方式很重要,因为主动推理中的”价值”不是外加的奖励标量,而是被写入智能体对未来感官结果的先验分布之中。

5. 策略是动作序列而非单一步动作

V 的定义表明,策略可以是跨多个时间步的动作序列。也就是说,智能体评估的不是”下一步做什么”这一孤立问题,而是”若沿某一候选行动路径推进,未来观测与偏好满足程度会如何变化”。这体现了期望自由能的前瞻性:策略评估本质上是对未来状态—结果轨迹的结构化推断。

6. 推断对象包括状态、策略与精度

附录结尾的图示不仅显示隐状态的后验信念,也显示策略的后验及其精度动态。精度在此可理解为对策略信念置信度的调节量,它连接了策略竞争与神经动力学解释——如图中以类似多巴胺能放电的形式呈现其变化率。这使代码示例同时具有计算建模与神经解释的双重意义。

🔬 代码结构解析

1. A:观测模型

A{1} 与 A{2} 分别对应不同观测模态。前者编码位置/线索结果与位置状态、情境状态之间的关系;后者编码奖赏结果在不同情境下的条件概率。其一般含义可写为:P(oₘ | s₁, s₂, ⋯)。

示例中 A{1}(:,:,1) 与 A{1}(:,:,2) 代表在两种情境下,位置因子产生何种线索/结果。行代表观测结果,列代表某一隐状态因子的不同水平,第三维用于另一个因子的取值。A{2} 通过参数 a 与 b 表示奖赏结果的条件概率结构,展示了情境如何改变奖赏映射。这里最关键的并非数值本身,而是读者要学会:Matlab 中三维数组的每一维都对应模型图中的一个条件结构。

2. B:转移模型

B{1}(:,:,1) 到 B{1}(:,:,4) 分别对应四个动作,每个动作都把上一时刻的位置状态映射到当前时刻的位置状态。矩阵列表示前一时刻状态,行表示当前状态,因此它实现的是 P(s_τ | s_{τ−1}, u_τ)。

从代码看,某些状态是吸收态,例如进入左臂或右臂后必须停留其中。这种任务结构上的约束直接由 B 的列→行映射编码。B{2} = eye(2) 则表示情境在单次试次中保持稳定,即 P(s_{2,τ} | s_{2,τ−1}) = I。通过这一设计,模型把”可通过行动改变的位置”与”不可通过行动改变的背景情境”清晰分离。

3. C 与 D:偏好与初始先验

C{1}、C{2} 分别定义不同观测模态在各时间步上的偏好。位置模态中,起始位置或某些中性结果可被赋予较低或零偏好;奖赏模态中,正奖赏与负奖赏之间通过 ±c 的差值体现强偏好。由于 C 以列表示时间步,故允许时变偏好,不过本例中主要展示恒定偏好结构。

D{1} 与 D{2} 给出试次开始时隐状态的先验分布。D{1} = [1 0 0 0]′ 表明智能体确信自己起始于起点位置;D{2} = [1 1]′/2 表明对情境的初始信念为均匀分布。这里可以清楚看到:主动推理的起点不是”真实世界状态”,而是智能体对起始状态的先验信念。

4. V:策略空间

V 的第一维表示动作序列中的位置,第二维表示不同候选策略,第三维表示该策略作用于哪个隐状态因子。由于模型为三步时程,因此只需要两个动作位置。示例中,多个候选策略被并列列出,实质上构成智能体可搜索的行动假设空间。

V(2,5,1) = 3 这样的写法说明:第5个策略在第2个动作位置上,对因子1选择第3个动作所对应的转移矩阵。也就是说,策略评估的对象不是抽象标签,而是一个个可被 B 矩阵实例化的动作序列。附录特别提醒:允许哪些策略进入搜索空间,本身就是模型设计的一部分,会影响最终行为模式。

5. mdp 结构体:统一封装

通过 mdp.V、mdp.A、mdp.B、mdp.C、mdp.D、mdp.S 的赋值,前述所有对象被封装到单一结构体中。这里的 S 表示真实初始状态,用于模拟环境中的状态生成,但该信息并不直接暴露给智能体。本质上,mdp 前五项定义了智能体的生成模型,S 则定义了环境实际演化的起点。

这一点非常关键:模型区分了”智能体所信”与”世界所是”。仿真之所以成立,正是因为观测结果的产生依赖真实状态,而后验信念的更新依赖智能体的生成模型。两者并不预设相同,只是在成功推断时趋于一致。

6. spm_MDP_VB_X 与绘图例程

spm_MDP_VB_X(mdp) 是整个示例的计算核心。它在后台完成信念更新、策略选择、状态转移与结果生成。随后,spm_MDP_VB_trial 输出试次摘要;spm_MDP_VB_LFP 则显示不同隐状态因子上与信念更新相关的电生理关联量。

从图C.10的说明可见,输出通常包含六类信息:对隐状态的回溯性后验推断、可行策略、真实结果与偏好、所推断和选择的动作、各时间步的策略信念,以及策略精度的动态变化。尤其是精度的更新,被解释为与类多巴胺能信号相呼应,从而将计算变量与神经生理可观测量联系起来。

💡 实践要点

1. 先理解索引,再理解模型

初学者最容易困惑的并非主动推理的概念,而是 Matlab 中多维数组的索引语法。附录实际上在训练一种”结构阅读能力”:花括号区分模态或因子,冒号表示取整维,第三维常表示情境或动作。只有把索引与概率条件关系一一对齐,代码才会变得透明。

2. A、B、C、D、V 共同定义完整任务

许多读者会把重点放在 B 或策略选择上,但本附录强调,一个可运行的主动推理模型必须同时定义观测、转移、偏好、初始信念与可行策略。缺少任何一项,模型都不完整。因此,建模时应把任务理解为”生成模型设计”,而非单独的决策规则编写。

3. 偏好不是外部奖励,而是结果分布上的先验

C 的写法提醒我们,主动推理中的奖励更准确地说是偏好结果。智能体并非最大化一个独立的奖励寄存器,而是在推断过程中倾向于实现更符合自身先验偏好的感官结果。这种处理方式使认知价值与实用价值可以在统一框架下进入期望自由能。

4. 策略空间的设计具有理论后果

附录明确指出,不同策略是否被纳入候选集合,会影响模型行为。因此,研究者不能把 V 当作无关紧要的技术细节。策略空间的宽窄、深度与结构,决定了智能体能否表现出探索、延迟满足或目标导向搜索等行为特征。

5. 仿真结果要从”推断过程”而非仅从”最终选择”来解读

图形输出不仅用于看智能体最后去了哪里,更重要的是考察它如何更新对情境、位置与策略的信念,以及精度如何变化。换言之,主动推理的解释重点不只是行动—结果的对应关系,更是信念动态。真正值得分析的是:不确定性如何被消除、偏好如何约束搜索、策略竞争如何收敛。

6. 本附录是进入 SPM/DEM 实践的入口

附录最后建议读者进一步运行 DEM 相关演示,并参考更复杂脚本如 DEM_demo_MDP_X.m。由此可见,本章的定位并非终点,而是一个模板:它帮助读者掌握最小可工作的主动推理程序骨架,从而进一步扩展到学习、多试次更新、层级模型与更复杂的任务环境。

总体而言,附录C的学术价值在于把主动推理从”可解释的理论”推进为”可操作的建模语言”。对于研究者而言,真正需要掌握的不是某几行 Matlab 代码,而是代码背后那种以生成模型为中心来组织认知、行动与不确定性的思想方式。

滚动至顶部