5D Library › 沙盘、宿命与主动推理 · English
第三章 马尔可夫毯与个体的边界
一个统计学概念
「马尔可夫毯」最早是一个纯粹的统计学概念。珀尔(Judea Pearl)在关于贝叶斯网络的著作中定义:一个变量的马尔可夫毯,是这样一组变量,一旦知道了它们,网络中其余的变量就不再为该变量提供任何额外信息 (Pearl 1988)。在有向图中,它由该变量的父节点、子节点以及子节点的其他父节点组成。用式子写,若 是内部状态 的马尔可夫毯, 是其余的外部状态,则
弗里斯顿把这个概念用于生命系统:一个细胞、一个有机体乃至一个人,都可以描述为被一层马尔可夫毯与环境隔开的内部状态 (Friston 2013)。这层毯由两类状态组成:感官状态(环境影响它们,它们影响内部)和主动状态(内部影响它们,它们影响环境)。内部状态与外部状态不直接相连,只通过毯相互作用。基尔霍夫等人进一步讨论了这种边界与生物自主性的关系 (Kirchhoff et al. 2018)。
一个可以检验的玩具模型
下面的程序构造一个线性高斯回路:外部状态 产生感官状态 ,内部状态 由 和自身的过去决定,主动状态 由 决定,再反过来推动 。如果马尔可夫毯的说法在这里成立,那么在控制了毯之后, 与 的相关应当消失。
推导
用回归残差计算偏相关,检验条件独立。
# A Markov blanket in a linear-Gaussian loop (a toy model). External state eta, sensory state s,
# internal state mu, active state a:
# s_t = eta_t + e1; mu_t = 0.9 mu_{t-1} + 0.3 s_t + e2; a_t = mu_t + e3;
# eta_{t+1} = 0.95 eta_t - 0.5 a_t + e4 (action pushes back on the world)
# Test: is mu_t independent of eta_t once the blanket (s_t and mu's own past) is known?
import random, math
rng = random.Random(7)
T = 60000
eta, mu = 0.0, 0.0
rows = []
for t in range(T):
s = eta + rng.gauss(0, 0.5)
mu_prev = mu
mu = 0.9 * mu + 0.3 * s + rng.gauss(0, 0.5)
a = mu + rng.gauss(0, 0.5)
eta_next = 0.95 * eta - 0.5 * a + rng.gauss(0, 0.5)
rows.append((eta, s, mu_prev, mu, a, eta_next))
eta = eta_next
rows = rows[1000:]
col = {k: [r[i] for r in rows] for i, k in enumerate(("eta", "s", "mu_prev", "mu", "a", "eta_next"))}
def residual(y, xs):
"""Ordinary least squares of y on xs (with intercept); returns the residuals."""
X = [[1.0] + [x[i] for x in xs] for i in range(len(y))]
p = len(X[0])
XtX = [[sum(r[i] * r[j] for r in X) for j in range(p)] for i in range(p)]
Xty = [sum(r[i] * yy for r, yy in zip(X, y)) for i in range(p)]
for i in range(p): # Gauss-Jordan elimination
piv = XtX[i][i]
XtX[i] = [v / piv for v in XtX[i]]; Xty[i] /= piv
for j in range(p):
if j != i:
f = XtX[j][i]
XtX[j] = [vj - f * vi for vj, vi in zip(XtX[j], XtX[i])]; Xty[j] -= f * Xty[i]
return [yy - sum(b * v for b, v in zip(Xty, r)) for r, yy in zip(X, y)]
def corr(x, y):
mx, my = sum(x) / len(x), sum(y) / len(y)
sxy = sum((a - mx) * (b - my) for a, b in zip(x, y))
return sxy / math.sqrt(sum((a - mx) ** 2 for a in x) * sum((b - my) ** 2 for b in y))
def pcorr(x, y, given):
g = [col[k] for k in given]
return corr(residual(col[x], g), residual(col[y], g)) if g else corr(col[x], col[y])
print(f"samples: {len(rows)}")
for x, y, given in (("mu", "eta", []), ("mu", "eta", ["s"]), ("mu", "eta", ["s", "mu_prev"]),
("mu", "eta_next", []), ("mu", "eta_next", ["a", "eta"])):
label = f"corr({x}, {y}" + (f" | {', '.join(given)})" if given else ")")
print(f"{label:34s} = {pcorr(x, y, given):+.3f}")
# samples: 59000
# corr(mu, eta) = +0.228
# corr(mu, eta | s) = -0.045
# corr(mu, eta | s, mu_prev) = -0.001
# corr(mu, eta_next) = -0.174
# corr(mu, eta_next | a, eta) = -0.002内部状态与外部状态原本有 0.228 的相关:内部「知道」外部的一些事情。只控制当前的感官状态还不够(偏相关 ),因为内部状态的过去携带着过去外部状态的信息;把内部状态自身的过去也算进毯里,偏相关降到 。另一侧也一样:内部状态与下一时刻的外部状态相关 (行动在推回世界),控制了行动和当前外部状态之后几乎为零。这说明两件事:在这个模型里,毯确实把内外隔开;而在动态系统中,「毯」必须包括时间,不能只看某一瞬间的感官输入。
证据
马尔可夫毯在自由能原理中的用法存在实质性争论。布勒伊内贝格等人指出,文献中混用了两种概念:一种是珀尔意义上的、属于某个统计模型的「推断工具」,另一种是被当作物理系统真实边界的「形而上学」概念;从前者并不能直接推出后者,而且许多真实系统的动力学并不满足所需的条件独立结构 (Bruineberg et al. 2022)。这篇文章附有数十篇同行评论与作者回应,争论至今没有结束。
注
所以本章的用法是谨慎的:马尔可夫毯在这里是一个建模工具,用来清楚地说出「内部状态只能通过哪些通道了解和影响世界」。它不证明人的心灵有一道物理意义上的边界,更不证明「自我」可以被归结为一组统计量。
改变输入的通道
如果内部状态只能通过感官状态了解世界,那么改变感官状态的来源,就会改变内部状态。下面的程序在同一个回路里,把一部分感官输入换成一个低质量的来源:它有偏(均值 ),噪声大,而且与真实世界无关。
推导
感官输入中来自低质量来源的比例从 0 增加到 80%。
# Same loop as before, but part of the sensory channel now comes from a low-quality source n
# (biased and noisy: mean -1, sd 1.5) instead of the world: s_t = (1 - w) eta_t + w n_t + e1.
# The internal state's long-run distribution depends on what crosses the blanket (a toy model).
import random, math, statistics as st
def run(w, T=40000, seed=11):
rng = random.Random(seed)
eta = mu = 0.0
mus, etas = [], []
for t in range(T):
n = rng.gauss(-1.0, 1.5)
s = (1 - w) * eta + w * n + rng.gauss(0, 0.5)
mu = 0.9 * mu + 0.3 * s + rng.gauss(0, 0.5)
a = mu + rng.gauss(0, 0.5)
if t > 1000:
mus.append(mu); etas.append(eta)
eta = 0.95 * eta - 0.5 * a + rng.gauss(0, 0.5)
return st.fmean(mus), st.pstdev(mus), st.correlation(mus, etas), st.fmean(etas)
print("share of input from the low-quality source | internal mean sd corr(internal, world) | world mean")
for w in (0.0, 0.2, 0.4, 0.6, 0.8):
m, sd, r, me = run(w)
print(f"{w:42.0%} | {m:+13.2f} {sd:4.2f} {r:+21.2f} | {me:+10.2f}")
# share of input from the low-quality source | internal mean sd corr(internal, world) | world mean
# 0% | +0.01 1.31 +0.22 | +0.00
# 20% | -0.01 1.27 +0.18 | +0.24
# 40% | -0.05 1.24 +0.13 | +0.63
# 60% | -0.13 1.24 +0.04 | +1.39
# 80% | -0.33 1.27 -0.09 | +3.43结果有两个方面,第二个比第一个更重要。第一,随着低质量输入的比例增加,内部状态与真实世界的相关从 0.22 降到零以下:内部模型逐渐与世界脱钩。第二,内部状态的均值只移动了一点(从 0.01 到 ),因为这个系统在用行动维持内部状态的稳定;代价是世界本身被推开了:外部状态的均值从 0 漂到 。在一个闭合的回路里,有偏的输入不只是造成错误的看法,还会通过依据错误看法而采取的行动,系统性地改变环境。
这是一个简化的类比,但它指向一个实际的问题:一个人每天接收的信息中,有多少来自与他所处的真实环境有关的来源?第八章的审计表把它列为第三步。
假说 · 尚未验证
尚未确立。 在接收大量低信息量、高情绪性信息流(如评论区和推荐短视频)的人中,对自身直接环境的预期(例如对同事、邻居的信任程度)与该环境的客观指标之间的一致性较低;减少这类输入两周后,一致性提高。该假说预测:随机分配到「减少信息流」组的受试者,其预期与客观指标(如同事实际的合作行为记录)之间的相关,比对照组提高至少 0.15。如果两组没有差别,假说就被推翻。
边界的两个用途
把这一章与上一章合起来,可以看到改变一个自我维持的循环有两类入口。一类在毯的外侧:改变环境,例如换一个不再强化旧模式的环境。另一类在毯本身:改变进入的信息(感官状态),或改变向外的行动(主动状态)。第二章的模型里,「沙盘中坚持敞开」是对主动状态的干预;本章的模型里,「更换信息来源」是对感官状态的干预。两者都不直接改写内部信念,而是改变信念赖以更新的证据。
参考文献
Fan, Y. (2026). The Sandbox, Determinism and Active Inference: Markov Blankets, Variational Free-Energy Minimisation, Exploration-Exploitation Trade-offs and East Asian Causality in Computational Neuroscience [沙盘、宿命与主动推理] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23738794 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).