CSYS5030 Week 10 信息存储(AIS)讲课总结

CSYS5030 Week 10 讲课总结:Information Storage

课程:CSYS5030 — Information Theory and Self-Organisation 讲师:Associate Professor Joseph Lizier 对应模块:Module 10 - Information storage 来源:讲义 PDF Week 10/Lectures/Lec8-InfoStorage.pdf(标题页为 Information dynamics – Part II – Information storage)+ tutorial notebooks 的 Solutions:AISSyntheticExamples_Solutions.ipynb、AISInCellularAutomata_Solutions.ipynb、AISinWrittenEnglish-Solution.ipynb。本周没有转录稿,不包含讲课现场内容。 本周覆盖:信息存储的直觉 → AIS 定义与解释 → 嵌入参数选择 → CA 中的存储结构 → predictive information / excess entropy

文件说明:Week 6/Lec6-InfoDynamics-PartII-InfoStorage.pdf 与本周讲义内容相同,是旧编号副本,按内容归到 Week 10。


零、本周位置

第三板块的建模顺序(Week 09 已经铺垫):

本周:存储下周:传递剩余

学习目标(讲义):理解信息存储的度量;用 JIDT AutoAnalyser 及其生成代码的扩展分析复杂系统数据中的信息存储。

主要参考:Lizier (2014) JIDT 论文附录 A.2–A.3;Lizier (2013) 专著第 3、4 章;Bossomaier, Barnett, Harré & Lizier (2016) An Introduction to Transfer Entropy 第 4 章 §4.1–4.3、§5.1。


一、信息存储:问的是什么

变量自己的过去,在多大程度上帮助我们预测它的下一个状态?

或者从建模角度:

在为这个变量的动态建模时,作为第一步先考虑它自身过去的影响,模型里因此包含了多少信息存储?

1.1 直觉练习(讲义 + tutorial Item)

讲义给了四条短二值序列 (a)–(d),要求:

  • 预测下一个值;
  • 你做了什么假设?
  • 具体从哪里取的信息?
  • 从过去得到了多少信息?

Tutorial 的合成序列对应这四个例子:

序列 模式
(a) 0,1,0,1,… 周期 2
(b) 0,0,1,1,0,0,1,1,… 周期 4,各半
(c) 0,0,0,1,0,0,0,1,… 周期 4,1/4 为 1
(d) 0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1 没有明显规律

二、Active Information Storage(AIS)

2.1 定义

其中 是长度为 的过去状态。

与熵率的关系:

(由 ,令 即得。)

平均形式与局部形式:

  • AIS:过去状态中被用于预测下一个值的平均信息。
  • 局部 AIS:某个具体过去状态对预测某个具体下一个值所提供的信息。
  • 就是把第 3 周的 MI / pointwise MI 套到「过去 → 下一个值」上。

局部 AIS 为负: —— 过去状态让我们更不期待实际发生的下一个值,即过去是误导性(misinformative)的。动态上意味着这一步打破了过去的模式(例如 CA 里一个 glider 闯进了原本规则的 domain)。

2.2 为什么叫「active」

AIS 只看被用于计算下一个值的那部分存储信息——是「正在使用中」的存储。与之对比的是第五节的 excess entropy(全部存储,包括将来某一时刻才用到的)。

2.3 AIS 捕获了什么(讲义「interpretations」)

  • 捕获总的记忆与非线性效应。
    • 对比:自相关只是线性分量,而且是每个过去值单独地和下一个值的线性关系;AIS 把过去作为一个联合状态,能看到非线性和多个过去值的组合效应。
  • AIS 捕获的存储类型:
    1. 动态中的主动存储(相对于底层结构的被动变化);
    2. 内部(因果上)存储的信息;
    3. 通过反馈、前馈环路的分布式存储——即循环连接(网络效应):信息从 出去、绕一圈又回到 ;
    4. 输入驱动的存储:驱动该变量的输入本身的模式。
  • 对观察者来说,这些在内禀上都被建模为信息存储——只要我们在这里先考虑了自身过去。

理解要点:AIS 是观察者视角的量。只要过去的 能预测下一个 ,就算「存储」,哪怕物理上信息是绕道其他节点回来的、或者来自有规律的外部输入。


三、关键问题:历史长度 k 怎么设?

3.1 嵌入(embedding)

  • 是 过去状态的 Takens 嵌入(Takens 1981):用延迟坐标重构底层动力系统的状态。
  • 还可以加嵌入延迟 τ:

  • 目标:选择嵌入使下一个值的预测最优,即嵌入状态已经包含了全部相关过去,再往前一步不提供额外信息:

3.2 相互竞争的考虑

想要 k 大 想要 k 小
捕获所有潜在记忆 k 每增加 1,状态空间维度增加,欠采样风险上升(Week 7:状态配置数指数增长)

所以存在一个「甜点」(sweet spot):

  • 要么是更早的过去值确实不再有贡献;
  • 要么是数据不够多,无法证实它们的贡献。

讲义用 ECA rule 54 举例:k 应该设成多少?(tutorial 会算出来。)

3.3 三种选法

选项 1:Ragwitz 准则——最小化预测误差(Ragwitz & Kantz 2002)

  1. 对每个嵌入状态 ,找 个最近邻;
  2. 取这些近邻对应的 的均值作为预测;
  3. 计算与实际 的差;
  4. 对所有点取平均误差,对 和 最小化。

选项 2:最大化偏差修正的 AIS(Garland, James & Bradley 2016)

  • 是 surrogate:破坏「过去 → 下一个值」关系后得到的 AIS(Week 7 的思路)。
  • 对 最大化 。
  • 含义:只要新加入的过去值带来的信息增量超过因维度升高带来的偏差增量,就继续加。
  • KSG 估计器本身就内置了偏差修正,所以对 KSG 直接最大化 AIS 即可。

选项 3:非均匀嵌入(non-uniform embedding)(Faes, Nollo & Porta 2011)

  • 从过去中逐个挑选那些在已选点之外仍有统计显著贡献的时间点,不要求等间隔。
  • JIDT 尚未实现,在更高层的 IDTxl 工具箱中实现(Week 12 还会提到)。

3.4 JIDT 中的设置

AutoAnalyser 里选 Active Info Storage:所有底层 MI 估计器都可用,参数与功能(显著性、局部值)相同;注意关键参数 k_HISTORY(以及 TAU)。

选 KSG 或 Gaussian 估计器后,属性 AUTO_EMBED_METHOD(鼠标悬停可看说明):

取值 含义
NONE 手动设 k_HISTORY 和 TAU
RAGWITZ 在 AUTO_EMBED_K_SEARCH_MAX、AUTO_EMBED_TAU_SEARCH_MAX 范围内扫描,最小化预测误差
MAX_CORR_AIS 在同样范围内扫描,最大化偏差修正 AIS

讲义练习:数据 SFI-heartRate_breathVol_bloodOx_extract.txt,设 AUTO_EMBED_METHOD = MAX_CORR_AIS、K_SEARCH_MAX = 10、TAU_SEARCH_MAX = 1,点 Compute——结果中的最优参数会显示在 k_HISTORY 和 TAU 里,代码中可用 getProperty() 读出:

k = int(calc.getProperty("k_HISTORY"))   # 属性以字符串返回

Discrete 估计器没有自动嵌入,tutorial 里要手动扫描 k(见第六节)。


四、例子:CA 中涌现结构的计算角色

元胞自动机里的涌现结构,长期以来被猜想对应三种信息操作(Wuensche 1999;Langton 1990;Mitchell, Crutchfield & Das 1996):

涌现结构 猜想的计算角色
Domain(规则背景区域)、blinker(原地闪烁的结构) 信息存储
粒子:glider、domain wall(移动的边界) 信息传递
碰撞(collision) 信息修改

信息动力学的意义在于:把这些定性猜想变成可量化、可检验的结论。讲义的「剧透」:

Blinker 和 domain 是主要的存储实体!(局部 AIS 在这些地方为强正值。)

(Lizier, Prokopenko & Zomaya 2007, 2012;JIDT 论文 Fig. 4b、§IV.E。)


五、Predictive information 与 excess entropy

5.1 Predictive information

过去状态 中有多少关于整个未来 的信息?

(Bialek, Nemenman & Tishby 2001)

Predictive information / Excess entropy AIS
预测对象 整个未来 只是下一个值
衡量 存储在过去、在未来某时会被用到的全部信息 存储信息中正被用于计算下一个值的部分(一阶分量)
本课侧重 次要 主要:它聚焦于下一个值的计算,和信息传递互补

5.2 Excess entropy

  • 把总结构/记忆量化为:条件熵率估计 逼近其极限值的缓慢程度——逼近越慢,说明越长的历史仍有用,结构越多。
  • 在「块熵 vs n」图上,就是块熵曲线的渐近直线的截距:

  • 对平稳过程,excess entropy 等于 predictive information(Grassberger 1986;Crutchfield & Feldman 2003)。
  • JIDT 中有实现。

六、Tutorial 要点与解答

6.1 合成序列的 AIS(Discrete 估计器)

用 AutoAnalyser 选 Active Info Storage、Discrete、勾 Add stat. signif.?,生成代码后把数据换成下面的短序列,再把历史长度改成变量:

k = 3
calcClass = JPackage("infodynamics.measures.discrete").ActiveInformationCalculatorDiscrete
calc = calcClass(2, k) # (alphabet base, history length k)
calc.initialise()
calc.addObservations(variable)
result = calc.computeAverageLocalOfObservations()
measDist = calc.computeSignificance(100)

各序列的 plug-in AIS(bits;我按同样的样本对齐方式复算,solution 中 (a) k=1 与 (c) k=3 的输出一致):

序列 k=1 k=2 k=3 解读
(a) 0101… 1.00 ≈1.00 1.00 上一个值完全决定下一个值, 全被预测;k=1 已足够
(b) 0011… ≈0.00 1.00 ≈1.00 k=1 时「0 后面是 0 还是 1」各半,几乎无信息;需要 k=2
(c) 0001… 0.09 0.26 0.81 需要 k=3 才能确定位置;0.81 = ,全部熵都被预测
(d) 无规律 0.14 0.16 0.20 很小,且数据太少——看显著性检验,不能断言有存储模式

Solution 输出:(a) k=1 时 AIS = 1.0000 bits (null: 0.0475 ± 0.0767; p = 0.00000);(c) k=3 时 AIS = 0.8113 bits (null: 0.1672 ± 0.1188; p = 0.00000)。注意即使只有十几个样本,surrogate 均值也不为 0(有限样本偏差)。

局部 AIS(序列 (c),k=3):

localAISValues = calc.computeLocalFromPreviousObservations(variable)
# 前 k 个时间步没有足够历史,JIDT 填 0,画图时跳过

为什么某些更新的局部 AIS 更大?

  • 看到 0,0,0 之后下一个一定是 1: ,而 ⟹ bits。罕见事件被过去准确预测,信息量大。
  • 其他状态(001、010、100)之后一定是 0: , ⟹ bits。本来就很可能的事件被预测,信息量小。
  • 平均: bits ✓。

这和 Week 3 的结论一致:局部 MI 在预测到罕见事件时最大。

6.2 AIS in Cellular Automata(rule 54)

数据:ca54.txt,rule 54 从随机初态运行,10,000 个格子 × 600 个时间步,周期边界。用更多格子而不是更多时间步,是为了在到达稳态之前采样暂态动态。

(可以在 NetLogo 的 CA 1D Elementary 里试 rule 2、8、18、30、54、90、110、146、254,看各种动态。)

Step 1:每个格子单独算(AutoAnalyser 勾 All variables?)

每列只有 599 个样本(k=1),结果在 0.11–0.22 bits 之间大幅波动,奇偶列甚至交替出现 ~0.21 和 ~0.12。

Step 2:合并所有格子的样本

calc = calcClass(2, 1)
calc.initialise() # 移到循环外
for v in range(10000):
calc.addObservations(data[:, v]) # 循环内只加样本
result = calc.computeAverageLocalOfObservations() # 移到循环外
print(calc.getNumObservations()) # 5,990,000 = 10000 × 599

结果 0.1426 bits(k=1)。

  • 为什么合并合理? 所有格子用同一条规则更新,是同质的——不同格子可视为同一底层过程的不同实现(Week 8 的同质性讨论)。
  • 什么时候不合理? 变量各自遵循不同规则时,例如 Scissors-Paper-Rock 里不同同学用不同策略;或者脑区各有不同功能时。

Step 3:手动扫描 k,最大化偏差修正 AIS

Discrete AIS 没有内置偏差修正,用解析显著性的零分布均值作为偏差估计:

measDist = calc.computeSignificance()      # 无参数 → 解析(χ²)零分布
bias = measDist.getMeanOfDistribution()
biasCorrected = result - bias

Solution 输出(节选):

k 原始 AIS bias 偏差修正 AIS
1 0.1426 0.0000 0.1426
3 0.5099 0.0000 0.5099
5 0.6624 0.0000 0.6624
10 0.7048 0.0001 0.7047
13 0.7138 0.0007 0.7131
14 0.7156 0.0014 0.7142
15 0.7180 0.0028 0.7152(最大)
16 0.7196 0.0056 0.7140
18 0.7241 0.0225 0.7015
20 0.7306 0.0904 0.6402
  • 原始 AIS 随 k 单调上升(加条件不会减少可用信息,且偏差也在上升)。
  • bias 在 k=15 之后大约每步翻倍——状态数 翻倍,零分布均值也近似翻倍(解析零分布均值 ∝ 自由度 / N)——这是欠采样的开始。
  • 最优 k = 15(偏差修正 AIS 0.7152 bits)。你的数据统计波动可能使结果略有不同。

Step 4:局部 AIS 的时空图

locals = numpy.zeros(data.shape)
for v in range(10000):
locals[:, v] = calc.computeLocalFromPreviousObservations(data[:, v])
plt.imshow(locals[:99, :99], cmap=cm.coolwarm_r, norm=mplcolors.CenteredNorm()) # 蓝正红负
  • 注意:computeLocalFromPreviousObservations 是用已经从所有格子估计好的 PDF 来评估每个格子的局部值。
  • 前 k 个时间步为 0,忽略。

观察与解释:

  • Domain 和 blinker 处局部 AIS 为强正值——过去的规则模式准确预测了下一个值,它们是主要的存储实体,与讲义的猜想一致。
  • Glider 经过的地方局部 AIS 为负——过去状态(规则的 domain 模式)预测的是「继续保持模式」,而 glider 的到来打破了模式,实际发生的值在该过去状态下比平均更不可能 ⟹ 过去是误导性的。这正说明此处的信息不是来自存储,而是来自别处——下周用 TE 看 glider 就是传递实体。

6.3 AIS in Written English(Seinfeld 剧本)

把 Module 2 用过的 Seinfeld 文本当作时间序列(后面的字符时间指标更大)。

预处理:去标点和数字、换行改空格、全部小写;字符映射为整数 0..25(a–z)和 26(空格),字母表大小 27(JIDT 要求符号是 [0, base-1] 的连续整数,并用 int32 以兼容 Java)。

改代码要点:

  • 构造器 calcClass(27, k):base 改成 27;
  • 去掉对变量 v 的循环——只有一条时间序列,一次 addObservations 全部传入;
  • k 只扫到 4:k=5 时状态空间 ,JIDT 处理不了。

Solution 结果(约 271 万个样本):

k 原始 AIS bias 偏差修正 AIS
1 0.7196 0.0001 0.7195
2 1.4587 0.0035 1.4552
3 1.9838 0.0943 1.8895(最大)
4 2.3036 2.5475 −0.2439

讨论题答案思路:

  • 用哪个 k? k=3。
  • 能有把握地说多少个前面的字符对预测下一个字符有影响? 3 个。k=4 时 bias(2.55)超过了原始 AIS,修正值为负——不是说第 4 个字符没用,而是这么多数据无法证实它的贡献(Week 7 的启发式: 个状态配置远超 271 万样本的 1/3)。
  • 误差来源/局限:
    • 欠采样:大 k 下很多状态配置从未出现或只出现几次;
    • 解析零分布是近似,且假设样本独立,而文本是强相关的序列;
    • 预处理丢掉了标点、大小写等信息;
    • 剧本文本可能非平稳(不同角色、不同集数风格不同);
    • 结论只适用于这一语料。

七、本周考点速记 / 易错点

  1. AIS 定义: , ; 。
  2. 局部 AIS ;负值 = 过去误导(模式被打破,信息来自别处)。
  3. AIS = 正被用于计算下一个值的存储;excess entropy / predictive information = 全部存储(关于整个未来);平稳时 excess entropy = predictive information。
  4. AIS vs 自相关:自相关只是每个过去值单独的线性分量;AIS 捕获总记忆与非线性。
  5. AIS 捕获的存储类型:主动存储、内部因果存储、经反馈/前馈环路的分布式存储、输入驱动的存储——对观察者都表现为存储。
  6. 嵌入: 是 Takens 嵌入;目标是 。
  7. k 的权衡:大 k 捕获更多记忆 vs 欠采样;甜点在「更早值不再贡献」或「数据不足以证实贡献」处。
  8. 三种选法:Ragwitz(KNN 预测误差最小)、最大化偏差修正 AIS( ;KSG 内置偏差修正)、非均匀嵌入(IDTxl,JIDT 没有)。
  9. JIDT:AUTO_EMBED_METHOD ∈ {NONE, RAGWITZ, MAX_CORR_AIS},配合 AUTO_EMBED_K_SEARCH_MAX、AUTO_EMBED_TAU_SEARCH_MAX;结果写回 k_HISTORY、TAU,用 getProperty() 读取。仅 KSG/Gaussian。
  10. 周期序列需要的最小 k:0101 → k=1;0011 → k=2;0001 → k=3。(样题第 15 题就考 0011!)
  11. 合并样本:同质变量(CA 格子)可以合并:initialise() 在循环外、addObservations() 在循环内、compute 在循环外;用 getNumObservations() 检查样本数。
  12. CA rule 54:最优 k≈15;domain/blinker = 存储(局部 AIS 正),glider 处局部 AIS 为负。
  13. 英文文本:k=3;k=4 时偏差超过原始值——欠采样,不是「无影响」。

八、下周预告

Week 11 — Module 11: Information transfer:

  • Transfer entropy :在目标过去的语境下,源提供的信息;
  • 为什么要条件于目标过去(与存储对照、状态转移、协同);
  • TE ≠ 因果效应;
  • 嵌入、源嵌入、源-目标延迟的设置;条件 TE;
  • Heartbeat 过程的解析 TE(0.3735 bits)、glider 是传递实体、睡眠呼吸暂停数据。