IGLM(一):把智能量化为最小计算元素集合
说明:本文中的具体实现、数学整理与写作表述均由 GPT 辅助完成,笔者本人主要负责提出核心想法、研究方向与关键判断。
之前我一直想把“学习就是压缩”这句话说得更具体一些。问题在于,这句话虽然常见,但大多数时候只是一个比喻。模型到底压缩了什么,压缩之后为什么会产生泛化,这些问题如果不落到一个明确的对象上,就很难继续往下推。
这也是我重新整理 IGLM(Incrementally-Grown Logic Minimization Model)这一系列想法的起点。
这一篇先不讨论具体实现,也不讨论复杂度优化,只讨论最核心的问题:
如果把学习理解为压缩,那么这个“压缩”的对象到底应该是什么?
我的答案是:
一个任务的智能复杂度,可以用解释该任务所需的最小计算元素集合大小来刻画。
这个定义和常见的参数量、token 数、loss 都不一样。它更接近电路复杂度或直线程序(straight-line program)复杂度,但我这里更关心它在学习问题里的含义:模型不是在连续参数空间里“调出”规律,而是在离散结构空间里“找出”规律。
背景
苏剑林在《基于量子化假设推导模型的尺度定律》里给出了一个很有启发性的视角:模型能力可以看成很多离散“能力量子”的覆盖过程。这个视角很自然,但它还没有回答一个更细的问题:
这些“量子”在计算上究竟是什么?
如果只是说“模型学到了越来越多的能力单元”,那还是比较抽象。为了把这个问题继续往下推,我希望把能力量子落到一个可组合、可枚举、可计数的对象上。
在有限离散任务上,最自然的选择其实是计算元素。对于一个布尔任务或者离散映射任务,所谓“理解规律”,本质上就是找到一套足够小的计算片段,使得这些片段组合起来可以复现目标函数。
问题定义
先考虑最简单的情形。输入空间是有限集合 $X$,目标函数是
\[f: X \to \{0,1\}.\]如果输入是 $n$ 位二进制,那么可以取 $X = {0,1}^n$。
我们给定一组原始元素(primitive set)
\[\mathcal P = \{x_1, x_2, \dots, x_n, 0, 1\},\]以及一组允许使用的二元运算符集合
\[\Omega = \{op_1, op_2, \dots, op_r\}.\]这里的 $x_i$ 表示输入位,$0,1$ 是常量,$\Omega$ 可以是某些布尔运算,也可以是更一般的离散运算。关键不在于具体选什么,而在于:
- 元素是离散的;
- 组合规则是有限的;
- 新元素可以由旧元素迭代构造出来。
最小计算元素集合的定义
为了避免“压缩”停留在口号层面,我这里直接给出定义。
计算序列
称序列
\[S=(g_1, g_2, \dots, g_L)\]为目标函数 $f$ 的一个计算序列,如果对于每个 $g_t$,满足以下两种情况之一:
- $g_t \in \mathcal P$;
- 存在 $i,j < t$ 和 $op \in \Omega$,使得 \(g_t = op(g_i, g_j).\)
并且最后有某个 $g_t = f$。
如果只计入非原始元素,那么这个序列对应的新增计算元素数量为
\[|S \setminus \mathcal P|.\]于是,可以定义目标函数在运算符集合 $\Omega$ 下的元素复杂度:
\[K_\Omega(f;\mathcal P) = \min_{S \leadsto f} |S \setminus \mathcal P|.\]这就是我这里说的“最小计算元素集合的元素数量”。
它的意思很直接:
从原始输入元素出发,在允许的二元运算符集合 $\Omega$ 下,最少还要新增多少个中间计算元素,才能构造出目标函数 $f$。
对于多输出函数
\[F=(f_1,f_2,\dots,f_m), \quad f_i: X \to \{0,1\},\]定义也类似:
\[K_\Omega(F;\mathcal P) = \min_{S \leadsto F} |S \setminus \mathcal P|,\]其中要求所有输出位都能由 $\mathcal P \cup S$ 中的元素表示出来。
为什么这个量适合描述“智能”
如果不做任何压缩,最笨的办法是把所有样本逐条记住。这样当然可以得到一个正确系统,但它的结构复杂度会随着样本数快速增长。
相反,如果很多样本其实共享一套中间结构,那么只要把这套结构提出来,原来的大量样本就可以由少得多的元素统一解释。
于是,$K_\Omega(f;\mathcal P)$ 这个量就天然具有两个性质:
- 它区分“记忆”和“规律”。逐条记忆时,新增元素数量通常接近样本规模;
- 它刻画“压缩程度”。如果能找到更小的元素集,说明模型抓住了更本质的公共结构。
从这个角度看,学习过程不是简单地让训练误差下降,而是让解释任务所需的元素数量下降。
迭代扩展的视角
上面的定义给了一个最终目标,但实际搜索时不会直接从全空间里枚举最优序列,而是通过迭代扩展元素集合来逼近。
定义第 $t$ 轮时已经发现的元素集合为 $E_t$。初始化为
\[E_0 = \mathcal P.\]如果不考虑任何搜索策略,只考虑“理论上可达”的闭包,那么下一轮可以扩展为
\[E_{t+1} = E_t \cup \{ op(g,h) \mid g,h \in E_t,\ op \in \Omega \}.\]这个定义有两个作用:
- 它给出了一个最直接的构造语义:新元素来自旧元素的二元组合;
- 它把学习过程转换成了“不断扩展可达元素集合”的问题。
于是,目标函数 $f$ 的最小深度可写成
\[D_\Omega(f;\mathcal P)=\min \{t \mid f \in E_t\}.\]不过这里的 $D_\Omega$ 只反映“层数”,并不反映“总共引入了多少个元素”。我更关心的是元素总数,也就是前面定义的 $K_\Omega$。两者的关系是:
- $D_\Omega$ 更接近并行深度;
- $K_\Omega$ 更接近总结构复杂度;
- 在 IGLM 里,我更倾向于把 $K_\Omega$ 作为压缩指标。
从样本记忆到结构压缩
有了上面的定义之后,IGLM 的训练目标就可以重新表述。
设训练集为
\[\mathcal D = \{(x^{(1)}, y^{(1)}), \dots, (x^{(N)}, y^{(N)})\}.\]最直接的做法,是为每个样本分别构造一条解释路径。这样做的优点是简单,缺点也很明显:元素集合规模通常接近训练样本规模,几乎没有泛化。
如果系统能够从这些路径中提取公共子结构,那么它就可能找到一个远小于“逐样本记忆”规模的计算元素集合。这个过程就是我这里说的“逻辑坍缩”或者“结构坍缩”:
- 原本分散的解释路径;
- 在更高层级上共享同一组中间元素;
- 整体元素数量下降;
- 由此得到更短的统一解释。
这时,泛化就不再是一个神秘概念了。它只是在说:
训练集中的很多样本已经被同一组中间元素统一解释,因此未见样本也可能落在这组结构的覆盖范围内。
为什么这个定义比“参数量”更接近本质
参数量当然是一个很有用的工程指标,但它并不直接等于任务规律本身的复杂度。两个参数量相同的模型,可能表达的是完全不同层次的结构;同一个任务,也可能被非常冗余地表示。
相比之下,$K_\Omega(f;\mathcal P)$ 这个量更直接回答了一个问题:
如果只允许使用给定的计算原语和组合规则,完成这个任务到底需要多少结构。
所以我更愿意把它看成一种“任务智能复杂度”的近似指标。模型越接近这个最小值,说明它越接近真正的结构性理解;如果始终远高于这个最小值,那大概率还停留在记忆或冗余解释阶段。
一个简单的例子:异或
为了避免这个定义太抽象,这里举一个很小的例子。
考虑两位输入 $x_1, x_2$,目标函数是
\[f(x_1,x_2)=x_1 \oplus x_2.\]假设原始元素集合是
\[\mathcal P = \{x_1, x_2, 0, 1\},\]允许运算符集合是
\[\Omega = \{\land, \lor, \neg\},\]为了适应前面的二元定义,可以把 $\neg a$ 写成 $a \operatorname{NAND} a$ 或者通过常量构造等价形式,这里只讨论结构含义。
异或可以写成
\[x_1 \oplus x_2 = (x_1 \lor x_2) \land \neg(x_1 \land x_2).\]这说明它并不是一个原始元素,但可以由一小组中间元素构造出来。和逐条记忆四个输入输出点相比,这种表示显然更短,也更接近规律本身。
在更复杂的任务里,比如加法器,类似的结构复用会更加明显。不同输入样本并不是完全独立的,它们共享进位、局部组合、重复子模式。如果能把这些共享元素都提出来,整体结构复杂度就会明显下降。
这一篇的结论
到这里,IGLM 的理论起点其实已经够明确了。
我关心的不是“模型能不能把 loss 做低”,而是:
- 给定一组原始元素 $\mathcal P$;
- 给定一组二元运算符 $\Omega$;
- 目标函数 $f$ 的最小计算元素集合大小 $K_\Omega(f;\mathcal P)$ 是多少;
- 学习算法能否逼近这个最小值。
如果这个问题是对的,那么“学习就是压缩”这句话就第一次有了一个可以精确讨论的对象,而不再只是直觉比喻。
下一篇我会继续写迭代扩展这件事本身:如果目标是从原始元素集合出发,一步一步扩展出更复杂的中间元素,那么这个过程应该怎样形式化,为什么它天然对应“先记忆、再压缩”的学习范式。
