从Thorndike的猫到Bellman方程:强化学习史前史与核心概念解析

发布时间:2026/10/8 15:46:49
从Thorndike的猫到Bellman方程:强化学习史前史与核心概念解析 1. 从一只猫和一台跳棋机说起强化学习到底从哪儿来的很多人第一次接触强化学习是从Q-Learning、DQN、PPO这些算法名字开始的一上来就是神经网络、经验回放、策略梯度公式一坨接一坨看得人头大。但如果你把时间轴往前拨一百年会发现这套东西的起点根本不在计算机里而在生物学和心理学实验室里——一只猫、一台跳棋机还有一个叫Bellman的人写下的一个方程。这篇东西我想聊的是1911到1957年这段“史前史”。为什么值得聊因为今天你在调PPO的clip系数、在纠结on-policy还是off-policy、在思考reward怎么设计的时候很多底层直觉其实在这几十年里就已经被那批人想清楚了。理解了这段历史你再回头看深度强化学习算法、离线强化学习比如IQL、基于模型的强化学习这些现代分支会发现它们不是凭空冒出来的而是对当年那些问题的不同回答方式。这段历史适合谁看我觉得有三类人。第一类是刚入门强化学习、被公式劝退的先看故事建立直觉再回去啃数学会顺很多。第二类是做了几年工程、想补一补理论脉络的知道每个概念“为什么长这样”比死记硬背有用。第三类是做因果强化学习、多智能体路径规划这类交叉方向的因为你们遇到的问题——比如信用分配、环境建模——本质上和一百年前那批人纠结的是同一件事。我会按时间线拆但不会写成流水账。重点讲三件事Thorndike的猫和效果律怎么埋下了“试错学习”的种子Samuel的跳棋机怎么第一次让机器自己变强Bellman的方程怎么把“长期回报”这件事变成了可以计算的数学对象。中间穿插一些我自己的理解和踩过的坑尽量说人话。2. 1911Thorndike的猫和“试错”这个概念的诞生2.1 一只猫怎么教会我们“奖励”的意义1911年美国心理学家Edward Thorndike发表了他的动物实验研究。他把猫关进一个“迷箱”里箱子里面有个机关猫只要踩到踏板或者拉动绳子门就会打开猫就能跑出去吃到箱子外面的鱼。一开始猫在里面乱抓乱撞纯靠运气碰到机关但重复几次之后猫打开门的时间越来越短最后几乎是放进去就直奔机关。Thorndike从这个实验里总结出了一条规律他叫它“效果律”Law of Effect如果一个行为之后跟着一个满意的结果这个行为被重复的概率就会增加如果跟着一个不满意的结果这个行为被重复的概率就会降低。这句话今天看起来平平无奇但你仔细想想它其实就是强化学习最核心的那句话的心理学版本。我们后面所有的算法不管多复杂本质上都在做同一件事让“好结果”前面的行为概率变大让“坏结果”前面的行为概率变小。区别只在于“怎么定义好”“怎么把好结果分配到具体行为上”“怎么在探索和利用之间平衡”。我个人的体会是很多初学者卡在reward设计上其实是因为没想清楚“效果律”这件事。你给的reward就是你在告诉agent“什么行为之后跟着满意结果”。如果reward设计得和你的真实目标不一致agent就会学出一个“钻空子”的策略——这在今天叫reward hacking但Thorndike的猫其实已经演示过了猫学的不是“理解机关”而是“踩踏板”这个动作本身。它不关心为什么只关心踩了有鱼吃。2.2 效果律和现代强化学习的对应关系把Thorndike的话翻译成今天的术语大概是这样的Thorndike的说法现代强化学习术语行为之后跟着满意结果动作后获得正reward行为被重复的概率增加策略中该动作的概率提升行为之后跟着不满意结果动作后获得负reward或零reward行为被重复的概率降低策略中该动作的概率下降猫通过试错逐渐学会智能体通过与环境交互学习这张表看起来简单但它解释了一个很多人一开始不理解的问题为什么强化学习需要“大量交互”因为效果律是一个统计规律不是一次就能学会的。猫不是第一次踩到踏板就记住了它是踩了很多次、每次都有鱼吃才慢慢把“踩踏板”和“有鱼吃”关联起来。强化学习里的采样、探索、经验回放本质上都是在加速这个统计过程。注意效果律有一个隐含前提——行为和行为的结果之间要有足够短的时间间隔。如果猫踩了踏板十分钟后才给鱼它很难把两者关联起来。这在强化学习里对应的是“信用分配”问题也是后面Bellman方程要解决的核心问题之一。2.3 从猫到算法试错学习的三个关键问题Thorndike的实验其实提出了三个问题这三个问题贯穿了整个强化学习发展史第一个是信用分配猫做了很多动作到底是哪个动作导致了门打开是踩踏板还是之前那个转身这个问题在强化学习里就是“哪个动作应该为最终的reward负责”。时间越长、动作越多这个问题越难。第二个是探索与利用猫如果一直踩那个已经知道的踏板就永远发现不了更好的方法但如果一直乱试又浪费时间和精力。这个权衡今天叫exploration-exploitation dilemma是所有强化学习算法都要面对的。第三个是泛化猫在迷箱A里学会了踩踏板换到迷箱B里还管用吗如果机关位置变了呢这对应的是强化学习里的泛化能力也是后来函数逼近、神经网络被引入的原因。这三个问题1911年就被提出来了但直到今天也没有被完全解决。你去看深度强化学习算法、因果强化学习、基于模型的强化学习它们各自在某个问题上做了改进但没有一个能同时完美解决三个。所以我说理解这段历史不是为了怀旧是为了知道你现在用的算法到底在解决哪个问题、又牺牲了什么。3. 1950年代Samuel的跳棋机第一次让机器自己变强3.1 跳棋机到底做了什么时间跳到1950年代。Arthur Samuel在IBM工作他写了一个跳棋程序。这个程序最厉害的地方不是它下得多好而是它会自己变好——它通过和自己下棋来提升水平最后甚至能赢过Samuel本人。这件事在今天是常识但在当时是颠覆性的。因为在那之前机器要么是执行固定规则要么是穷举搜索。Samuel的跳棋机第一次展示了“机器可以通过经验改进策略”这件事。它用的方法叫“rote learning”和“learning by generalization”简单说就是记住哪些局面导致赢、哪些导致输然后推广到没见过的局面。Samuel还提出了一个很重要的概念用当前策略的估计值来更新策略。这句话听起来绕但其实就是今天“策略迭代”和“值迭代”的雏形。他让程序评估每个局面的“好坏”然后选择让评估值最高的动作。评估值怎么来通过和自己下棋、看结果来调整。3.2 跳棋机里的“值函数”思想Samuel的跳棋机里有一个关键设计它不直接学“这个局面该走哪步”而是学“这个局面的价值是多少”。这个价值是一个标量表示从当前局面出发最终赢的概率有多大。然后策略就是在所有合法动作里选那个能到达“价值最高”的后续局面的动作。这个思路就是今天值函数方法的核心。你去看Q-Learning、DQN、DDPG本质上都在学一个值函数Q值或者V值然后用它来指导动作选择。Samuel在1950年代就已经用这个思路了只是当时没有神经网络他用的是线性函数和查表。我自己的经验是理解“值函数”这个概念比理解任何具体算法都重要。因为值函数把“长期回报”这件事变成了一个可以逐层传播的量。你不需要一次性算出整盘棋的结果你只需要知道“下一步之后那个局面的价值”然后选价值最高的那步。这个“递归”的思想就是后面Bellman方程的核心。3.3 跳棋机留下的两个坑Samuel的跳棋机虽然厉害但它留下了两个坑这两个坑后来被Bellman填了一个另一个到现在还在填。第一个坑是值函数怎么更新。Samuel用的是启发式的方法没有严格的数学保证。他知道“这个局面的价值应该等于下一步局面的价值加上即时奖励”但他没有把这个关系写成一个方程来解。这个方程就是Bellman方程1957年被提出来。第二个坑是泛化怎么做。Samuel用线性函数来近似值函数但跳棋的状态空间太大了线性函数不够用。这个问题直到2013年DQN用深度神经网络才算是有了一个比较实用的解法。但即使到今天泛化仍然是强化学习最难的问题之一尤其是在连续状态空间和部分可观测环境下。提示如果你现在在做基于模型的强化学习其实你是在同时处理这两个坑——你既要学一个模型对应泛化又要用这个模型来做规划对应值函数更新。这也是为什么基于模型的方法样本效率高但实现复杂。4. 1957Bellman方程把“长期回报”变成可计算的东西4.1 Bellman方程到底在说什么1957年Richard Bellman提出了动态规划里的核心方程后来被称为Bellman方程。它的形式很简单V(s) max_a [ R(s,a) γ * Σ P(s|s,a) * V(s) ]翻译成人话就是一个状态的价值等于你在这个状态下选一个最好的动作拿到即时奖励然后加上折扣后的下一个状态的价值。这个方程的伟大之处在于它把一个“无限步”的问题变成了一个“递归”的问题。你不需要考虑未来所有步你只需要考虑当前这一步和下一步的价值。下一步的价值又可以用同样的方式展开以此类推。这就是动态规划的核心思想。Bellman方程有两个版本一个是值函数的一个是Q函数的。Q函数版本是Q(s,a) R(s,a) γ * Σ P(s|s,a) * max_a Q(s,a)这个版本更常用因为它直接告诉你每个动作的价值不需要再单独做一步max。4.2 为什么需要“折扣因子”Bellman方程里有一个γ叫折扣因子通常取0.9到0.99之间。这个东西不是随便加的它有两个作用。第一个作用是数学上的如果γ小于1那么无限步的回报求和会收敛。如果γ等于1在某些情况下回报会发散方程无解。所以γ保证了方程有唯一解。第二个作用是物理上的它表示“未来的奖励不如现在的奖励值钱”。这符合直觉——今天的100块和一年后的100块你肯定选今天的。在强化学习里γ越小agent越短视γ越大agent越有远见。我自己的经验是γ的选择非常关键而且没有万能值。如果你做的是episodic任务有明确终止状态γ可以设得大一点比如0.99如果是continuing任务没有终止γ要设小一点否则值函数会发散。另外如果reward的尺度很大γ也要相应调整否则值函数会爆炸。4.3 Bellman方程和现代算法的关系Bellman方程是几乎所有值函数方法的基础。Q-Learning的更新公式Q(s,a) ← Q(s,a) α * [r γ * max_a Q(s,a) - Q(s,a)]这个公式里的“r γ * max Q(s,a)”就是Bellman方程右边那一项叫TD目标。整个更新就是在让Q(s,a)逼近这个目标。DQN也是同样的思路只是用神经网络来近似Q函数然后用经验回放和target network来稳定训练。PPO虽然直接学策略但它的优势函数估计GAE也是基于Bellman方程的。甚至离线强化学习里的IQL它的核心也是Bellman方程只是它不直接用max而是用expectile回归来避免分布外动作的高估。所以你看从1957年到今天Bellman方程一直是强化学习的数学基石。注意Bellman方程有一个前提——环境是马尔可夫决策过程MDP。也就是说下一个状态只取决于当前状态和动作和历史无关。如果环境不满足马尔可夫性比如部分可观测Bellman方程就不完全适用需要引入历史信息或者belief state。这也是为什么部分可观测环境下的强化学习更难。5. 从历史到实践这段历史对今天做强化学习的启发5.1 信用分配问题从猫到GAEThorndike的猫遇到的问题今天依然存在。你在做一个多AGV路径规划的任务10个AGV同时移动最后只有一个AGV到达了目标你怎么知道是哪个AGV的哪个动作导致了成功这就是信用分配。现代的做法是用优势函数来估计每个动作的相对好坏。GAEGeneralized Advantage Estimation就是一种常用的方法它通过TD误差的加权和来估计优势。但本质上它还是在解决“哪个动作应该为最终reward负责”这个问题。我自己的经验是信用分配做得好不好很大程度上取决于reward的设计。如果你能给中间步骤一些密集的reward信用分配会容易很多。但密集reward又容易导致reward hacking所以这是一个权衡。5.2 探索与利用从猫的乱撞到熵正则Thorndike的猫一开始乱撞这就是探索。后来它直奔机关这就是利用。现代强化学习里探索的方法有很多ε-greedy、Boltzmann探索、熵正则、噪声注入等等。PPO里有一个entropy coefficient就是用来控制探索的。熵越大策略越随机探索越多熵越小策略越确定利用越多。这个系数的调节本质上就是在平衡探索和利用。我试过的一个技巧是在训练初期把entropy coefficient设大一点让agent多探索训练后期逐渐减小让策略收敛。这个叫entropy annealing实测下来比固定值稳定很多。5.3 泛化从跳棋机到神经网络Samuel的跳棋机用线性函数做泛化不够用。今天我们用深度神经网络泛化能力强了很多但依然不是万能的。尤其是在分布外OOD状态下神经网络的值函数估计会非常不准。离线强化学习里的IQL就是为了解决这个问题。它不直接用max来更新Q函数而是用expectile回归避免对分布外动作的高估。这个思路其实和Samuel的“用当前策略的估计值来更新策略”是一脉相承的只是数学上更严谨了。因果强化学习CRL则是另一个方向。它试图把因果推断的工具嵌入强化学习流程区分“相关”和“因果”。比如agent发现“按按钮”和“门打开”经常一起出现但真正导致门打开的是“拉绳子”按按钮只是巧合。因果强化学习就是要让agent学到真正的因果关系而不是表面的相关性。这个方向我觉得很有意思因为它直接对应了Thorndike的猫遇到的问题猫可能学会了“转身”而不是“踩踏板”因为转身和踩踏板经常一起出现。因果推断可以帮助agent区分这两者。6. 常见问题与排查技巧实录6.1 值函数不收敛怎么办这是最常见的问题。你跑DQN或者Q-Learning发现Q值越来越大最后变成NaN。原因通常有几个第一学习率太大。Q-Learning的更新是自举的学习率太大会导致正反馈Q值爆炸。解决办法是减小学习率或者用Adam这种自适应优化器。第二γ太大。如果γ接近1而且reward没有归一化Q值会累积得很大。解决办法是归一化reward或者减小γ。第三没有target network。DQN用target network来稳定训练如果你不用Q值会震荡。解决办法是加target network定期更新。第四环境有终止状态但你没处理。如果episode结束后你继续自举Q值会发散。解决办法是在终止状态把TD目标设为即时reward不加γ * max Q。6.2 策略不探索怎么办如果你的agent很快收敛到一个次优策略而且不再探索通常是entropy coefficient太小或者ε太小。解决办法是增大探索参数或者在reward里加一个探索奖励。另一个可能的原因是reward设计有问题。如果agent发现某个动作能稳定拿到小reward它就不愿意冒险去尝试可能拿到大reward的动作。解决办法是调整reward尺度或者用curriculum learning先从简单任务开始。6.3 训练不稳定怎么办训练不稳定是深度强化学习的老大难问题。常见的原因和解决办法问题可能原因解决办法奖励曲线震荡学习率太大减小学习率用梯度裁剪性能突然崩溃策略更新太大用PPO的clip或者TRPO的信任域不同seed结果差异大初始化敏感多跑几个seed取平均训练后期性能下降过拟合加正则化或者早停样本效率低探索不足增大entropy或者用优先经验回放我自己的经验是深度强化学习对超参数非常敏感同一个算法在不同环境上可能需要完全不同的超参数。所以不要指望一套参数打天下该调就得调。6.4 怎么判断Bellman方程是否适用Bellman方程的前提是MDP。如果你不确定环境是不是MDP可以做一个简单的测试同样的状态和动作重复执行多次看下一个状态的分布是否一致。如果一致基本可以认为是MDP如果不一致可能是部分可观测需要引入历史信息。另外如果环境有延迟奖励Bellman方程依然适用只是信用分配会更难。这时候可以用n-step return或者GAE来缓解。7. 我个人在实际操作中的一些体会这段历史我反复看过几遍每次都有新的理解。最早的时候我觉得这就是一堆故事和实际调参没关系。后来做项目多了才发现很多问题其实一百年前就被提出来了只是换了个名字。比如reward hackingThorndike的猫其实就演示过了——猫学的是“踩踏板”不是“理解机关”。你今天做强化学习如果reward设计得不好agent也会学出一个“钻空子”的策略而不是你真正想要的策略。比如信用分配Samuel的跳棋机其实就遇到了——一盘棋几十步到底是哪一步导致了赢他用值函数来传播信用今天我们用GAE和TD误差来传播信用本质上是一样的。比如探索与利用Thorndike的猫一开始乱撞后来直奔机关这个权衡今天依然存在。PPO的entropy coefficient、DQN的ε-greedy都是在做同一件事。所以我的建议是如果你在学强化学习不要一上来就啃PPO的论文。先花点时间理解这几个核心概念值函数、Bellman方程、信用分配、探索与利用。这些概念理解了再看具体算法会发现它们只是在不同的假设下对这些概念的不同实现。最后分享一个小技巧如果你在调强化学习算法卡住了不妨回到Bellman方程看看你的更新目标是不是写对了。很多时候问题不在超参数而在更新公式本身。比如termination handling、reward scaling、discount factor这些细节很容易写错而且写错了很难发现。我踩过好几次坑最后都是回到Bellman方程才找到问题。