
预测编码与反向传播的关系这几年我在反复阅读核心文献时发现很多讨论都停在“预测编码比反向传播更生物合理”这句话上却说不清两边到底在什么条件下等价、在什么地方分道扬镳。这篇报告想做的事就是把这条线索重新捋一遍从神经科学里的预测编码到机器学习里的反向传播再到两者之间的数学桥梁和实验分歧。我会用编号代替具体文献出处重点拆解核心推导、常见误读和一份可以照做的最小复现思路。适合两类人看一类是做深度学习但想了解类脑算法的另一类是做神经科学但好奇怎么用工程验证理论的。1. 问题的源头为什么要把预测编码和反向传播放在一起看1.1 反向传播的基本假设与局限反向传播解决的是“给定输入和损失如何更新网络所有权重”的集中式计算问题。它的核心是链式法则从损失函数出发先算最后一层的梯度再一层层往回传。每一层的梯度都依赖后一层的梯度这意味着误差信号必须被精确地全局传播。生活里可以这样类比一个公司所有部门的绩效都由总部统一考核总部要把业务偏差一层层分解到每个部门部门主管才能知道怎么改进。这个体系看起来高效但它有两个硬约束一是总部和每个部门之间必须存在清晰的双向沟通通道二是这种沟通必须被集中调度。一旦某个环节断了所有部门的更新都会停摆。对计算机来说这些约束可以靠保存计算图来满足但对大脑来说就不太现实。大脑没有全局损失函数没有一层层反向传播精确梯度的明确“总控”。这是早期研究者持续批评反向传播的主要原因也是预测编码这类局部学习规则受到重视的起点。1.2 预测编码的核心主张预测编码最初是为了解释感知现象提出的。它的想法非常直观大脑不直接读取外界图像而是维护一套自顶向下的生成模型用高层的抽象预测低层的输入。与预测不一致的部分形成“预测误差”这个误差继续向上传递并反过来修正模型本身。关键在于每一层只需要知道本层的预测和相邻层传入的误差整个更新是局部的。用刚才的类比说就是各部门不用等总部发KPI而是根据与自己直接合作的上下游之间的差异来调整。预测编码把“全局损失最小化”替换成了“让每一层的预测都尽可能正确”而预测正确的标准不再是外部标签而是生成模型自身的自洽。这个主张听起来温和实际上是颠覆性的它意味着学习可以不依赖一个显式的标签损失即使没有监督信息预测误差也能驱动表示和权重的改变。这种能力让预测编码同时适配无监督、有监督和强化学习场景。1.3 为什么两者关系值得做成核心文献分析近几年陆续有研究发现在特定条件下预测编码的稳态更新和反向传播的梯度计算是等价的。但也有同样多的文献指出两者在动态过程、反馈连接形式、训练稳定性上差异巨大。同样是“误差传播”一个来自全局损失函数一个来自生成模型的局部预测误差不把条件拆清楚很容易被“预测编码推翻反向传播”这类标题带偏。我这次重读文献时的主线可以压缩成三个问题第一预测编码的误差信号如何一步步变成权重更新第二它在什么数学条件下与反向传播重合第三重合之外的部分到底贡献了什么新东西。下面几节就按这条主线展开。2. 核心文献的演进脉络从神经科学到机器学习2.1 第一代理论感知中的预测编码这一阶段的核心文献把大脑建模成分层生成模型。高层神经元的活动负责预测底层神经元的输入底层神经元将预测误差传回高层。学习目标很朴素最小化所有层预测误差的平方和。早期推导里最重要的不是某个深度结果而是它第一次给出了“局部可实现的误差传播”框架。我概括一下当时的推导逻辑假设某一层有一个预测值下一层有一个实际表示两者做差得到误差误差向上传递的路径与正向预测路径相邻但方向相反。这样的误差信号不需要从网络末端统一计算每一步只发生在相邻节点之间。正因如此这个框架天然可以映射到神经回路里哪怕没有全局调度者也能工作。在这里有一个很容易被忽略的点预测编码不等于“输入压缩”。虽然消除冗余是它的副产品但它真正的目标不是把编码变短而是让生成模型更好地解释输入。换句话说它在意的不是“存得少”而是“猜得准”。2.2 第二代文献预测编码与目标传播逐步接近反向传播第二波工作开始解决一个工程问题预测编码能不能用来训练深度网络。研究者把每一层的表示也看成变量和权重一起优化。这样训练变成了两个阶段的交替推断阶段固定权重更新各层表示学习阶段固定表示更新权重。这种两阶段格局和反向传播非常像。到这一步文献的关键突破是给出了一个数学结论当推断过程收敛到稳态时对满足高斯误差假设的确定性网络来说预测编码的权重更新等价于反向传播的梯度下降。等价性的含义不是“性能接近”而是“同样一组输入稳态下的权重梯度与BP计算的梯度在理想条件下相等”。与此同时研究者发现预测编码和目标传播之间存在亲缘关系。目标传播允许网络为每一层设定一个目标表示再让权重向目标靠拢反向传播则可以看作目标传播的一个极限特例。预测编码恰好站在两者中间它有明确的生成模型也有可学习的目标表示所以能同时容纳这两条线索。2.3 第三次争论时间动态、大规模实现与开放问题最近几年的文献不再满足于回答“等价还是不等价”而是追问三个更细的问题第一预测编码能不能解释真实神经记录第二当网络规模达到视觉任务需要的深度和宽度时预测编码训练是否仍然可行第三连续时间版本的预测编码会不会产生完全不同的动态行为。这些文献里一部分认为预测编码的大规模训练已经被验证另一部分指出推断步骤的成本太高、中间表示自由度太大离替代反向传播还很远。我的阅读结论是两边其实在讨论不同的“预测编码”。前者讨论的是一类带局部误差的梯度近似算法后者讨论的是一种完整的认知过程理论。因此读文献时先确认作者在哪个层面说话比急着站队重要得多。我把这次分析使用的核心文献按代号列在下面方便读者追踪问题线代号文献定位核心贡献我在分析中关注的重点文献A分层预测误差的奠基性文章提出感知即预测误差最小化局部误差的定义与传递方式文献B预测编码用于深度网络训练验证两阶段学习可扩展推断稳态与梯度等价性的实验条件文献C等价性推导与争议综述系统对比预测编码与BP等价条件、反例、常见误解文献D连续时间动力学分析将预测编码扩展到动态系统时间演化与在线学习的可能性3. 关键技术细节误差传播的两种形式3.1 反向传播的核心推导与全局依赖反向传播的数学核心是链式法则。考虑一个逐层线性网络损失函数为 L第 l 层输出为 h_l f(W_l h_{l-1})。误差项定义为 delta_l dL/dh_l从最后一层向前递推delta_l (W_{l1}^T delta_{l1}) * f(W_l h_{l-1})权重的梯度是∂L/∂W_l delta_l h_{l-1}^T仔细看这个公式第 l 层的误差同时依赖于上层权重的转置和上层误差。也就是说误差信号必须先经过全网络计算再逐层向下分发。这带来一个工程后果训练过程中必须保存每一层的前向激活才能在后向时算出权重梯度。对显存不友好对硬件设计也提出了很高要求。从学习理论的角度看反向传播不关心网络内部表示是否稳定它只关心损失函数关于权重的偏导数。表示只是计算的中间变量没有自己独立的“演化过程”。这个特点让BP方法干净高效但同时也让离开计算图后的推理变得困难。3.2 预测编码的目标函数与稳态预测编码的典型目标函数如下E Σ_l (1/2) || μ_l - f(W_l μ_{l-1}) ||^2 (1/2) || x - μ_0 ||^2这里 μ_l 是第 l 层的表示估计x 是输入。注意它没有显式的标签损失。如果要做有监督学习一种做法是把最高层的表示 μ_L 固定在标签向量附近或者在目标函数里加上标签约束。但在形式上驱动学习的主要误差来自“本层预测”和“相邻层表示”之间的差异。推断阶段固定权重对 μ_l 做梯度下降让表示趋向于平衡。学习阶段固定表示对 W_l 做梯度下降。这两步反复交替。核心特征在这里显现权重更新只涉及本层预测误差和相邻层表示不依赖跨越多层的全局梯度。这也是预测编码名称的由来——网络不传递“损失梯度”而是传递“预测误差”。预测误差实际上是一种信息信号它告诉上层“你预测得还不够准”告诉下层“你该往哪个方向调整表示”。3.3 等价性成立的三个关键条件文献中证明“预测编码等于反向传播”的时候几乎没有例外都依赖以下几个条件目标函数是高斯误差假设下的二次预测误差网络是确定性逐层映射且每层变换可微推断过程在每个样本上迭代到稳态且权重更新速度远慢于推断收敛速度在这三个条件下可以证明稳态表示处的权重梯度与BP梯度相同。为什么因为当 μ_l 收敛到最优值时关于 μ 的梯度为零这个零梯度条件本身包含了相邻两层的预测误差关系。把它代入权重更新公式后得到的正是链式法则给出的梯度形式。更形象地说预测编码把BP中“需要外部计算的梯度”变成了“通过内部动力学自然达到的稳态”的副产品。这个视角很迷人但它的成立也暗示了等价性的脆弱一旦推断没有收敛或者目标函数不是二次形式稳态就不成立梯度自然也不再等价。3.4 两者真正不同在哪里等价性有条件差异性却非常普遍。我在整理文献时做了这样一个对照维度反向传播预测编码误差来源外部损失函数内部生成模型的预测误差信号传递全局递归依赖层级顺序局部迭代可并行收敛反馈矩阵严格使用权重转置可允许任意反馈连接时间维度静态前向与反向动态驰豫表示随时间演化对表示的要求只是中间变量有独立信息意义参与学习无监督能力需要额外设计天然支持这张表说明预测编码的卖点不是“另一种梯度算法”而是“一种更通用的误差传播框架”。它牺牲了BP的简洁性和保证但换来了更高的局部性、更强的生物解释力以及无监督学习方面的天然适配性。4. 实操视角复现一个最小预测编码网络4.1 模型定义与代码骨架为了看清等价性到底长什么样最有效的办法是抛开复杂库用 numpy 写一个最小预测编码网络。我先用线性网络做演示公式干净且能直接对比BP。网络结构只包含输入层 μ_0隐藏层 μ_1顶层 μ_2。损失为E (1/2)|| μ_1 - W_1 μ_0 ||^2 (1/2)|| μ_2 - W_2 μ_1 ||^2在推断阶段μ_0 固定为输入 xμ_2 固定为标签 y只有 μ_1 是自由的。计算 μ_1 的梯度∇E_{μ_1} (μ_1 - W_1 μ_0) - W_2^T (μ_2 - W_2 μ_1)这个公式值得反复看前一项来自底层输入对隐藏层的预测误差后一项来自顶层误差通过 W_2^T 的反向反馈。它和BP的 delta 公式结构几乎一致但这里不是一次性计算而是一步一步迭代出来的。一个可运行的简化骨架如下import numpy as np def train_pc(x, y, hidden_dim8, steps200, infer_steps50, rho0.05, lr0.005, seed0): rng np.random.default_rng(seed) batch_dim, input_dim x.shape output_dim y.shape[1] W1 rng.normal(0, 0.1, (hidden_dim, input_dim)) W2 rng.normal(0, 0.1, (output_dim, hidden_dim)) for step in range(steps): mu0 x.copy() mu1 rng.normal(0, 0.1, (batch_dim, hidden_dim)) mu2 y.copy() # 监督学习顶层表示固定为标签 for _ in range(infer_steps): e1 mu1 - W1 mu0 e2 mu2 - W2 mu1 grad_mu1 e1 - W2.T e2 mu1 - rho * grad_mu1 e1 mu1 - W1 mu0 e2 mu2 - W2 mu1 W1 lr * e1 mu0.T W2 lr * e2 mu1.T这短短几十行已经包含了预测编码的全部要素初始化表示、迭代推断、用局部误差更新权重。实际运行时你会发现只要 infer_steps 足够大PC 的权重更新轨迹会非常接近BP。4.2 两阶段更新的直觉为什么需要两阶段因为权重和表示是耦合在一起的。如果同时更新网络很容易震荡。推断阶段可以看作在回答一个问题在给定当前权重的情况下什么样的隐藏表示最合理学习阶段回答另一个问题在给定当前表示的情况下什么样的权重能让预测更准两者交替恰好是一种坐标下降法目标就是最小化全局能量 E。这就像两个人配合搬东西一个人先调姿势另一个人再调发力反复几次才找到最稳的平衡。如果同时动大概率会一起摔倒。4.3 实验对比设计要直观看到等价性可以设计一个回归任务用随机生成的 W_true 产生数据再用同一个初始权重分别跑BP和PC记录每一步权重与 W_true 的距离。BP实现就是常规的梯度下降PC用上面代码。关键设置包括控制变量初始权重一致数据一致学习率一致读取内容每轮结束后的 train loss以及 W1 与真实权重的余弦距离变换条件把 infer_steps 分别设为 5、20、100观察梯度差异我在本地跑这类实验时infer_steps100 时PC的收敛曲线几乎和BP重合infer_steps5 时PC会频繁震荡。这个结果说明所谓等价性不是“免费的午餐”而是需要付出迭代代价才能换来的。4.4 需要关心的超参数和细节推断步数 infer_steps太大会慢太少会不收敛。常见范围是20到100复杂任务可能需要更多。推断学习率 rho通常比权重学习率大一个量级。太小收敛慢太大则发散。表示初始化μ_1 不能全零否则梯度对称训练会卡死。用随机初始化或从输入数据里复制一层都可以。顶层固定有监督任务里必须把 μ_2 固定为标签否则网络会自动退化成无监督重建模型分类准确率上不去。非线性激活换成 tanh 或 ReLU 后权重的梯度要乘以激活函数的雅可比公式不再像线性网络那么干净但等价性的主干仍然成立。这些细节在论文里通常一句话带过但自己动手跑一遍就会明白它们才是决定实验成败的关键。5. 阅读核心文献的常见误区与排查技巧5.1 误区一认为预测编码不需要任何形式的反向传播很多文献标题会让人以为预测编码彻底绕开了反向误差传播实际操作后你会发现并不完全如此。在预测编码的推断过程中误差从顶层反馈到低层时用到了 W_2^T 这样的转置矩阵本质上还是一种反向投影。区别在于BP把这个过程当作显式计算步骤预测编码则用迭代动力学隐式地实现了它。因此我更愿意把预测编码理解为“把反向传播的计算过程重新实现为迭代动力系统”而不是“没有反向传播”。这样理解就不会在复现时被“反向传播”这个词吓住也不会错误宣传预测编码能彻底摆脱误差回传。5.2 误区二把预测误差等同于损失函数预测误差和损失函数是两个层面的东西。预测误差描述的是生成模型内部各层之间的不一致性损失函数则是外部任务给定的评价指标。哪怕没有分类标签预测误差照样存在照样可以驱动权重更新。很多文章把顶层加上标签误差只是为了把无监督学习框架改造成有监督分类器。区分不清会导致两个问题一是读不懂预测编码为什么能做无监督学习二是在设计算法时容易丢掉内部误差结构直接用损失函数替换掉所有预测误差。实际上预测编码的力量恰恰来自内部误差的持续存在。5.3 误区三以为等价性意味着性能一定一样数学等价在理想条件下成立但实际网络几乎永远偏离理想推断不收敛、表示初始化不对称、非线性的雅可比会变、学习率不够小。更关键的是预测编码每个样本都要迭代到稳态训练成本比BP高很多。近期一些“预测编码失败”的工作多半是实验设置本身没有满足稳态条件而不是理论有问题。因此拿到一篇“PC beats BP”或者“PC fails”的论文第一件事不是记结论而是查三个数字infer_steps 多少、网络宽度多少、学习率多少。这三个数字往往决定了结论成立的范围。5.4 给想深读的读者一份文献阅读路线图我自己带过不少人读这个方向发现以下顺序比按时间线读更高效先补目标传播的数学基础知道“层目标”是什么意思再读预测编码奠基性文章只看目标函数和前几行推导不啃全部细节接着读等价性综述在手边画一张“误差传播路径对比表”然后找一个最小PC代码仓库把 infer_steps 从大到小调一遍最后再回到争议文章这时候你已经有能力分辨对方批评的是哪一层含义按这个路线三小时左右就能抓住主线而不是被十篇论文的不同角度弄得晕头转向。6. 我的实操心得与下一步可以做什么6.1 踩过的坑我第一次写预测编码网络时忘记固定顶层表示结果分类准确率一直上不去。后来才发现网络在无监督地重建输入标签完全没有进入学习循环。这个错误很隐蔽因为训练 loss 看起来会下降但验证准确率几乎不动。还有一次为了加速训练我把推断步数从 50 降到 5结果每一轮的梯度噪声变得非常大。用同一份数据和初始化BP已经收敛PC还在原地抖动。后来我先跑了一条“推断步数 vs. 梯度误差”曲线才真正理解稳态假设不是可有可无的摆设。另一个容易踩的坑是非线性激活。线性网络公式干净一换成 ReLU 或 tanh权重梯度里必须加入激活函数的导数。如果沿用线性公式整个梯度方向都会偏。最后我调试时会把每一层的梯度打印出来和BP的实现做逐层对比很快就能定位问题。6.2 可扩展方向预测编码和反向传播的关系研究远没到盖棺定论的程度。我比较看好的扩展方向有以下四个连续时间版本把离散的迭代推断改成微分方程预测编码就变得更像真实神经网络动力学也有机会推导出在线学习规则。非高斯误差建模把二次误差换成分布假设更灵活的误差项可能会自然衍生出类似自然梯度的学习算法。大规模模型验证目前大多数实验停留在浅层网络预测编码在Transformer规模上的推断成本和中层表示约束问题都还是开放问题。硬件实现局部误差更新不依赖保存全图计算图这对脉冲神经网络和边缘计算设备很有吸引力但需要一个稳定的模拟框架支撑。我近期做了一组对照实验把同一套权重分别用BP和PC训练打印每一层的梯度范数发现两者稳态下几乎一致但中间表示的运行轨迹却完全不同。这让我意识到预测编码带给我们的不是又一种梯度求解器而是对“学习”这件事的不同建模方式。以后再看到“等价”类结论我第一反应不是去背推导而是去问这里讨论的是稳态还是动态轨迹是监督损失还是生成模型的误差把这两个问题想清楚文献就不容易误读。最后建议有条件的读者自己动手把最小PC网络跑一遍比读十篇论文更有用。