简介
“基于函数逼近的同轨策略预测”是强化学习(Reinforcement Learning)中的一个核心概念。简单来说,它的意思就是:用带有参数的模型(如神经网络或线性函数)去估计某个策略的长期收益(价值),而用于训练这个模型的数据,完全是由该策略亲自在环境中“边干边试”采集来的。
把它拆成三个核心部分来看,就非常容易理解了:
1. 预测 (Prediction / 策略评估)
-
目标: 评估一个给定的策略
到底好不好。
-
具体做法: 给定一个策略
(比如“打羽毛球时尽量打到对方后场”),我们需要计算在每个状态
下,按照这个策略一直打下去,预期能拿到多少累积回报,也就是估计价值函数
。
2. 同轨策略 (On-policy)
-
数据来源: “边做边学,用谁的数据学谁”。
-
在收集交互数据(状态、动作、奖励)时所使用的策略(行为策略),与我们正在评估和优化的策略(目标策略)是同一个策略。
-
类比: 如果你自己亲自下场打球,并根据你自己打球时的亲身感受和得分情况来评估你的打法,这就是“同轨策略”;如果是看职业选手的录像来总结评估你的打法,那叫“异轨策略(Off-policy)”。
3. 函数逼近 (Function Approximation)
-
处理大规模状态: 用带参数的函数
来代替“表格”存储价值。
-
当状态空间很小时(比如棋盘游戏),我们可以用一张大表(Tabular)记录每个状态的价值。但如果是连续空间(如自动驾驶的摄像画面、机器人的关节角度),状态是无限多的,不可能为每个状态建一张表。
-
函数逼近就是引入参数向量
(例如神经网络的权重),只要输入状态
,模型就能输出估计的价值
。这赋予了算法对未见过状态的泛化能力。
1.价值函数逼近
价值函数逼近(Value Function Approximation)简单来说就是:用一个带参数的数学模型(如神经网络或线性函数),去“猜”或“推算”某个状态(或动作)的长期价值,而不是逐个去查表。
在强化学习中,价值函数的目标是回答“处于当前状态 s 时,未来预期能拿多少总回报”。
为什么需要“逼近”?(表格法 vs. 逼近法)
为了理解“逼近”的必要性,可以看两个方法的对比:
-
表格法(Tabular Method):
把所有状态和对应的价值记在一个“大字典”里。
-
例子: 井字棋(Tic-Tac-Toe)的状态很少,我们可以建立一张表格,第 1 个状态价值 0.5,第 2 个状态价值 0.8…… 遇到状态直接查表(Table Lookup)。
-
瓶颈: 一旦遇到复杂问题,比如围棋(状态数高达
)或者自动驾驶(摄像头输入的是连续变化的高维图像),我们不可能建立一张包含所有状态的表格——内存会瞬间爆掉,而且绝大多数状态在有生之年都不可能踩到第二次。
-
-
函数逼近法(Function Approximation):
用一个带有参数
的模型
来代替大字典。
-
做法: 把当前的图像、传感器数据作为输入状态
传入模型,模型直接计算出一个估算的价值
。
-
核心优势(泛化能力): 就算遇到了一个从未见过的全新状态,只要它和之前见过的状态类似,模型就能基于学到的通用规律推算出该状态的大致价值。
-
常见的三种逼近架构
在算法设计中,根据输入和输出的形式不同,价值函数逼近通常有以下三种典型架构:

-
状态价值函数
: 输入状态
,直接输出当前状态的总体价值(对应上图左一)。
-
动作价值函数
: 输入“状态
+ 特定动作
”,输出在该状态下执行特定动作的价值(对应上图中间)。
-
多输出动作价值函数
: 只输入状态
,模型一次性并行输出当前状态下所有可能动作的价值(对应上图右一)。经典的 DQN(Deep Q-Network) 采用的就是这种结构,极大提升了决策与评估效率。
常用模型
-
线性函数逼近: 将状态特征提取后乘以权重向量(
)。计算速度快、理论收敛性质好,但对复杂非线性问题的表达能力有限。
-
深度神经网络(Deep Neural Networks): 即深度强化学习(Deep RL)的核心。用多层神经网络作为逼近器,能够直接处理图像、音频等高维原始输入,具有极强的拟合能力。
一句话总结: 价值函数逼近本质上就是从“死记硬背每一个状态的价值”(表格法)升级到了“学会根据特征推算未知状态价值的通用规律”。
2.预测目标 VE
在强化学习的函数逼近预测中,预测目标 VE 是指 (Mean Squared Value Error,均方价值误差)。
简单来说,它就是用来评估“我们模型估算出的价值,距离真实价值到底差了多少”的标尺。在机器学习中,它扮演的角色就相当于损失函数(Loss Function)。
为什么需要这个目标?
在不使用函数逼近(表格法)时,我们可以把每个状态的真实价值都记下来,争取做到 100% 准确。
但使用函数逼近时,参数 的数量远远少于状态的数量。这就意味着我们不可能让模型在所有状态上的预测都完全准确——顾了状态 A 的准确度,可能就会牺牲状态 B 的准确度。
因此,我们需要一个统一的指标来告诉算法:“什么样的参数 才是全局最优的?遇到冲突时应该优先保哪个状态?” 这个指标就是 VE。
数学公式拆解
的数学定义如下:
把它拆成四个要素就非常直观了:
-
误差项
-
:状态
在策略
下的真实价值(Ground Truth)。
-
:我们用模型参数
估计出来的价值。
-
-
平方操作
-
确保误差恒为正数,同时惩罚较大的差距,避免正负误差相互抵消。
-
-
权重分布
(最核心的部分)
-
是状态
的访问频率(平稳分布,Stationary Distribution),满足
。
-
它决定了每个状态的“重要性”:智能体越常踩到的状态,权重
越高。
-
这种设计非常合理——既然模型的容量有限,那就优先保证经常遇到的状态预测准确,而偶尔才遇到的极少数状态允许稍大一点的误差。
-
-
加权求和
-
将所有状态按照各自的出现概率进行加权平均,算出一个全局的“平均平方差距”。
-
它的实际作用是什么?
在算法学习的过程中,我们的目标就是寻找一组最佳参数 ,使得
的值最小。
梯度下降算法就是沿着 对
的负梯度方向去不断微调参数的。可以说,
为整个函数逼近训练指明了优化方向。
3.随机梯度和半梯度方法
这两个概念是强化学习在处理参数化价值函数时,优化更新参数的两种不同手段。
简单来说:
-
随机梯度方法: 算的是真正的、完整的梯度,只是用单个样本的估计代替了全量数据的平均值。
-
半梯度方法: 故意忽略了目标项中的一部分梯度,只对估计值求导,算的是“不完整的梯度”。
1. 随机梯度方法 (Stochastic Gradient Method, SGD)
要理解“随机梯度”,首先来看“传统梯度下降”与“随机”的区别:
-
全量梯度下降: 每次更新参数,都需要把所有可能的状态
全部算一遍。但在强化学习中,状态空间可能无限大,这完全不可行。
-
随机梯度(Stochastic): 每次只抽取一个当前踩到的样本状态
,算出这个状态下的梯度并更新一次参数。只要采样的次数足够多,这些随机单步梯度的平均效果,就等于全量梯度的更新方向。
什么时候能用“真”随机梯度?
当你的更新目标(Target)完全不依赖于当前的参数
时,算出来的就是真正的随机梯度。
最典型的例子是 蒙特卡洛(MC)方法:
它的目标 是从当前状态一直运行到游戏结束实际拿到的总回报。
是由环境和策略产生的真实数值,和当前的参数
无关。
更新公式为:
-
误差项
:
-
告诉我们预估偏高了还是偏低了。如果算出来的预测值偏小(
),误差为正,参数就需要朝着“能让估计值增大”的方向调整。
-
-
梯度项
(敏感度 / 责任分配):
-
告诉我们“调整哪一个参数,能够最有效地改变当前状态
的估计值”。
-
假设模型是线性的:
此时对权重求导,梯度就是特征向量:
-
如果当前状态下特征
(未激活),求导结果为 0。无论误差有多大,w1 的更新量都是 0。因为 w1压根没有参与当前状态的预测,不需要它承担责任。
-
如果特征 x2 = 10(高度激活),求导结果为 10。w2 会分到很高的更新量,因为当前状态的预测值很大程度上是由 w2 决定的。
此时的梯度完全符合数学上的严谨求导,算法具有很好的收敛保障。
2. 半梯度方法 (Semi-gradient Method)
在强化学习中,相比等整局游戏结束的蒙特卡洛,我们更喜欢用时序差分(TD)方法,因为 TD 可以“边做边学”(自举 / Bootstrapping)。
TD 方法的目标是:
注意:这个目标 本身就包含了当前的参数
!
按理说,如果要对平方误差 求真实的完整梯度,你既要对预测项
求导,也要对目标项里面的
求导。
但 TD 方法采取了“假装不知道”的处理方式:
在求导数时,把目标项 当成一个固定的常数标签(Label),直接忽略它对
的导数,只对预测项
求导。
因为数学上只算了一半的导数(丢掉了目标项的梯度),所以这种方法被称为“半梯度方法”。
它的更新公式形式和 MC 极其相似,但本质不同:
两者的核心对比
| 特性 | 随机梯度方法 (SGD) | 半梯度方法 (Semi-gradient) |
| 典型代表 | 蒙特卡洛函数逼近 (MC) | 时序差分函数逼近 (TD) |
| 目标项 | 真实回报 | 估计值 |
| 求导处理 | 计算完整的真实梯度 | 忽略目标项对 |
| 收敛安全性 | 非常高,稳定收敛至局部最优 | 理论收敛保证较弱(结合非线性逼近+异轨策略时可能发散) |
| 学习效率 | 低(必须等待单局结束,方差大) | 高(可实时更新,方差小) |
总结: 强化学习之所以广泛采用“半梯度”,是因为虽然它在数学求导上做了妥协,但换来了 TD 方法无需等待游戏结束、实时学习的高效率。
4.线性方法
在强化学习和机器学习中,线性方法(Linear Function Approximation) 的意思非常直观:预测出来的价值,完全是各个特征的“加权求和”。
它的数学形式只有加法和乘法,没有任何复杂的嵌套或激活函数:
这里包含两个关键部分:
-
特征向量
: 把状态
提取成一组具体数字。例如:
。
-
权重向量
: 模型要学习的参数,代表每个特征对最终价值的重要程度(可正可负)。
一个直观的例子
假设你要评估在一款赛车游戏中,当前赛车状态的“胜率价值”:
-
特征
(速度):
-
特征
(距离终点):
-
特征
(剩余油量):
如果采用线性方法,估算出的价值就是:
如果经过学习后,算法得到的权重是 (速度越快越好),
(距离越长越差),
(油越多越好):
一个非常关键的误区:“对参数线性”
很多人以为“线性”指的是特征本身必须是一条直线。其实不是。
数学上所说的“线性方法”,指的是对参数 是线性的。特征
本身可以是非常复杂的非线性函数。
-
例子: 即使你的特征包含了平方向或者交叉项,比如
,
。
-
只要模型的输出依然是
,参数
没有套在 sin、cos或指数函数里面,它依然属于线性方法。
在深度学习流行之前,强化学习绝大多数理论研究都是基于线性方法的。因为它有两个极其巨大的优势:
1. 求导结果超级简单(责任明确)
在上一轮我们推导的更新公式中,需要求梯度 。
对于线性模型,偏导数极其干净: 对
求导,结果直接就是对应的特征
!
这使得更新公式变得非常简洁:
2. 没有局部最优解(绝对收敛)
线性模型的均方误差损失函数是一个完美的凸函数(Convex Function),像一个碗的形状。这意味着:
-
它只有一个全局最低点,没有各种陷阱(局部最优)。
-
只要学习率
设置得当,无论是蒙特卡洛还是半梯度 TD,保证 100% 收敛。
线性方法 vs. 非线性方法(如神经网络)
| 比较维度 | 线性方法(Linear) | 非线性方法(如深度神经网络) |
| 表达式 | ||
| 特征来源 | 需要人类手动设计特征(Feature Engineering) | 神经网络自动从原始数据提取特征 |
| 计算速度 | 极快,消耗资源极少 | 较慢,需要 GPU 计算 |
| 理论保障 | 极强(必定收敛,有全局最优) | 较弱(可能陷入局部最优、发散) |
| 表达能力 | 受限(上限取决于人工特征设计得好不好) | 极强(几乎可以拟合任何复杂的非线性关系) |
总结: 线性方法就是“加权求和”。虽然它的表达能力不如深度神经网络,但因为它计算快、数学性质好、绝对不发散,在很多特征明确的中小型工程问题中依然被广泛使用。
5.线性方法的特征构造
特征构造(Feature Construction / Feature Engineering) 在线性方法里的意思就是:把原始的、看似简单的状态数字,手动转换或扩充成多维的特征向量 ,从而让简单的“线性加权求和”能够拟合出复杂的非线性关系。
核心痛点:为什么必须做特征构造?
线性模型本身其实很“笨”——它只能做乘法加法 。如果直接把原始状态当作特征,它只能拟合出一条过原点的平直线或平稳平面。
假设一个极简例子:
-
真实的状态价值是一条抛物线曲线:
。
-
不做特征构造: 直接用原始状态
传给模型,特征就是
。线性模型是
。这是一条直线,无论怎么调整
,都绝对不可能拟合出弯曲的抛物线。
做了特征构造: 我们人为将特征升维,构造一个特征向量 。此时线性模型变成了:
神奇的事情发生了: 模型依然是“对特征进行线性加权”,但通过改变 的大小,它现在能够拟合出完美的二次曲线了!
强化学习中 4 种最经典的特征构造方法
在实际的强化学习问题中(比如连续控制、机械臂、赛车等),常见的特征构造手段有:
1. 多项式特征 (Polynomial Features)
直接将原始变量进行乘方或交叉组合。
例如,状态包含位置 和速度
,构造的特征向量可以是:
。这样就能拟合出位置与速度之间复杂的协同效应。
2. 状态聚合 (State Aggregation)
把连续的状态空间切分成若干小区间(分箱)。
例如温度范围 [0, 100],切成:低温 [0, 30)、中温 [30, 70)、高温 [70, 100]。如果当前温度是 20,特征向量就是稀疏的独热码 [1, 0, 0]^T。
3. 瓦片编码 (Tile Coding) — 经典算法
强化学习中最流行的高维连续状态特征构造方法。 它用多套相互交错(偏移)的网格(Tilings)覆在状态空间上。

瓦片编码(Tile Coding)具体是如何把 2D 坐标变成二进制向量的
我们用一个极简的 2D 状态空间(比如赛车的位置 和速度
)来演示这个过程。
场景与网格设置
假设状态的范围是 ,速度
。
我们设计 2 套相互重叠的网格(Tilings):
-
每套网格都是
的划分(包含 4 个小格子/瓦片 Tile)。
-
两套网格一共拥有
个瓦片,所以生成的特征向量维度为 8 维。
网格 1 (Tiling 1,无偏移) 网格 2 (Tiling 2,向右上方偏移 1 单位)
+---------+---------+ +---------+---------+
| Tile 2 | Tile 3 | | Tile 6 | Tile 7 |
| (0-2,2-4)| (2-4,2-4)| | (1-3,3-5)| (3-5,3-5)|
+---------+---------+ +---------+---------+
| Tile 0 | Tile 1 | | Tile 4 | Tile 5 |
| (0-2,0-2)| (2-4,0-2)| | (1-3,1-3)| (3-5,1-3)|
+---------+---------+ +---------+---------+
坐标转换步骤
假设当前赛车的坐标点是 (即位置 2.5,速度 2.5)。
第一步:检查第一套网格 (Tiling 1)
查看 落在了 Tiling 1 的哪个格子:
-
-
-
结论: 落在 Tile 3。
-
生成局部向量:
[0, 0, 0, 1](只有索引 3 位置填 1,其余为 0)。
第二步:检查第二套网格 (Tiling 2)
查看 落在了偏移后的 Tiling 2 的哪个格子:
-
-
-
结论: 落在 Tile 4。
-
生成局部向量:
[1, 0, 0, 0](只有索引 4 位置填 1,其余为 0)。
第三步:拼接成最终的稀疏特征向量
将两套网格的结果串联起来,得到一个 8 维的向量 :
为什么这叫“稀疏向量”?
-
极度稀疏: 整个 8 维向量中,只有 2 个位置是 1,剩下的 6 个位置全是 0。
-
规律: 如果你有
套网格,那么无论特征向量总共有多少维(哪怕是 10,000 维),向量里 1 的个数恒等于
。在计算线性加权
时,计算机只需要把这
个激活位置对应的权重加起来即可,运算速度极快。
瓦片编码最神奇的地方:自动“泛化”
假设紧接着出现了一个非常接近的全新坐标 :
-
在 Tiling 1 里依然落在 Tile 3;
-
在 Tiling 2 里依然落在 Tile 4;
-
生成的向量和
恰好完全相同。
这意味着模型会自动将 学到的经验直接共享给
。
如果出现了一个稍远一点的坐标 :
-
它在 Tiling 1 里落在 Tile 1 :对应位置变了;
-
但在 Tiling 2 里依然落在 Tile 4 :保留了一个相同的
1!
因为共享了 1 个激活位,这两个状态的价值估算就会产生部分关联,这就是瓦片编码平滑泛化能力的来源。
4. 高斯径向基函数 (RBF, Radial Basis Functions)
在状态空间里提前放置 个“锚点”(中心点
)。
每个特征的值由当前状态 距离锚点的远近决定:距离越近,特征值越接近
(呈高斯钟形曲线)。它能产生极度平滑的非线性拟合效果。
6:非线性函数逼近:人工神经网络
在强化学习的价值函数逼近中,人工神经网络(Artificial Neural Network, ANN)就是一个“全自动的非线性拟合器”。
之前我们讲线性方法时,需要人类手动去做特征构造(比如设计瓦片编码)。而神经网络做的事情是:直接把原始状态输入进去(哪怕是游戏画面像素、传感器原始读数),让网络自己去学习如何提取特征,并直接输出估算的价值 。
1. 神经网络是怎么实现“非线性”的?
神经网络能够拟合任意复杂的非线性函数,全靠它的基本单元——人工神经元(Neuron)。

一个神经元的计算过程分为两步:
-
加权求和(线性计算):把输入的特征向量
乘上权重
并加上偏置
,算出一个线性结果
。
-
激活函数(非线性转换):把
传进一个非线性函数
(如 ReLU、Sigmoid、Tanh)。
关键点: 如果没有激活函数,无论你叠加多少层神经网络,本质上都只是多项线性方程的组合,依然只能绘制“直线”或“平直超平面”。正是激活函数的折弯与转折,赋予了网络拟合各种曲线、曲面的能力。
2. 多层网络在强化学习中扮演什么角色?
如果把很多神经元按层堆叠起来,神经网络在强化学习里的分工非常清晰:
-
隐藏层(自动特征构造器):隐藏层其实就在做我们之前手动做的事情——特征工程。前几层提取低阶特征,后几层组合出高阶特征。你可以把隐藏层的输出看作是网络自己帮我们生成的高级特征向量
。
-
输出层(线性评估器):最后一层对隐藏层提取出来的特征进行线性加权,输出最终的估算价值
。
根据通用近似定理(Universal Approximation Theorem),一个包含足够多神经元的隐藏层神经网络,可以以任意精度逼近任何连续函数。
3. 线性逼近 vs 非线性神经网络逼近
| 对比维度 | 线性逼近(如瓦片编码 + 线性模型) | 非线性逼近(人工神经网络) |
| 特征来源 | 依赖人类经验手动设计/分割网格 | 网络自己学习,无需人工设计 |
| 适用状态 | 低维连续状态(2~10 维) | 超高维状态(图像像素、自然语言、复杂传感器) |
| 优化曲面 | 凸优化(Convex):只有一个全局最优解 | 非凸优化(Non-convex):存在大量局部最优和鞍点 |
| 收敛稳定性 | 结合 TD 学习有严格的数学收敛保证 | 结合半梯度 TD 容易产生发散爆掉的风险 |
我们用强化学习里最经典的案例——DeepMind 玩 Atari“打砖块”(Breakout)游戏,来看看神经网络是如何搞定“非线性函数逼近”的。

1. 痛苦的原始输入:只有一堆毫无意义的像素
在打砖块游戏中,算法看到的状态 只是游戏画面截屏。
-
假设图片裁剪并缩小为
的黑白网格,这意味着状态是由
个像素点的亮度数字 组成的超高维向量。
如果用线性模型(或者瓦片编码):
线性模型只能做简单的乘加:
-
线性模型只知道“第 300 个像素点比较亮”,但它根本无法理解“当第 300、301、302 个像素点同时亮起时,它们组合起来代表一颗小球”。
-
你如果要用瓦片编码,就必须人工写代码去识别球的位置、球拍的位置、砖块剩余数量,这在图像面前几乎是不可能完成的人工工程。
2. 神经网络(ANN)是怎么一步步非线性处理的?
神经网络把这 个原始像素数字接进来后,通过多层隐藏层 + 非线性激活函数,把复杂的数据一层层加工:
隐藏层 1:提取低级特征(边缘与局部点)
-
神经元结合 ReLU 激活函数(将负值置 0,保留正值),开始过滤噪声。
-
这一层的神经元激活状态,表示画面里哪里有“横线”、哪里有“孤立的小方块”。
隐藏层 2 & 3:组合高级特征(物体与动态)
-
将低级特征组合起来。几个神经元同时亮起时,网络“意识到”:“底部的横线是球拍,中间的小方块是小球”。
-
如果连续输入 4 帧画面,网络甚至能通过像素的变化算出“小球正在以 45 度角斜着向下掉”。
输出层:线性加权得到最终价值
-
最后一层将前面提取出的高阶概念(如:“球拍在左边”、“球正落向左边”、“砖块还剩一大片”)进行线性汇总。
-
输出一个最终的估计数值,比如
分(表示当前这个局势非常有戏,胜率很高)。
3. 为什么这叫“非线性逼近”?
-
“非线性”在哪里?
单个像素点变亮变暗,对整个局势的价值影响绝不是简单的“正比关系”。比如小球向下跌落时,在距离球拍 5 厘米和距离 1 厘米时,价值估计是陡峭变化的非线性曲线。正是因为网络里加了激活函数(折弯和截断),才能完美勾勒出这种陡峭的变化。
-
“全自动”体现在哪?
人类从来没有在代码里写过“什么是球”、“什么是球拍”。神经网络完全是通过与环境交互,拿到奖励信号后,利用反向传播(Backpropagation)和梯度下降,自动调整网络中成千上万个权重
。
权重调整好的结果就是:网络自己学会了看懂游戏画面,并精准预测当前画面的价值。
7:最小二乘时序差分
别被这个又长又响亮的名字吓到了;它听起来很复杂,但核心思想其实非常直观且优雅——它就是把原本需要一步步摸索的 TD 学习,变成了我们初中就学过的“解方程组”。
1. 普通 TD 遇到了什么痛点?
之前我们学普通的 TD(时序差分)更新时,逻辑是这样的:
每在环境中走一步,算出一个 TD 误差 ,然后乘上一个学习率
,把权重
往正确方向“小迈一步”:
这种方法(渐进梯度下降)有两个明显的痛点:
-
非常浪费数据(样本效率低):每条数据只用来更新一小步,想要收敛,模型必须在环境中重复跑成千上万次。
-
学习率
极难调:
设大了容易震荡发散,设小了半天收敛不了。
2. 最小二乘时序差分(LSTD)的破局点
LSTD 的作者们思考了一个问题:既然我们用的是线性模型,为什么一定要像龟兔赛跑一样,用 一小步一小步去挪呢?
在线性逼近下,TD 学习达到收敛(期望更新量为 0)的时候,在数学上必然满足一个简单的线性方程组:
其中:
-
矩阵
:记录了状态转移过程中,特征与特征之间的统计相关性。
-
向量
:记录了特征与获得的奖励(Reward)之间的关联。
既然是一元一次矩阵方程,何必一步步迭代?直接用线性代数求逆矩阵,一步到位算出最佳权重 :
为什么叫“最小二乘”?
因为推导这个公式时,数学上是在寻找一个权重
,使得在所有收集到的样本上,投影后的 TD 误差平方和最小(和线性回归里的最小二乘法是同一个根基)。
普通 TD 是每看到一条样本,就用 TD 误差 去微调一次
。 而 LSTD 的终极目标是:把所有样本攒在一起,找到一个完美的
,使得所有样本的“加权 TD 误差”总和刚好抵消为 0。

为什么要乘特征 ? 因为特征
相当于“责任权重”。如果当前特征
(说明这个特征根本没激活),那这个样本产生的误差就不应该归咎于它;如果
很长,它就要对这个误差负主要责任。
我们把 TD 误差 的公式代进去:
-
实际拿到的价值(目标):
(其中
是下一个状态的特征)
-
预估的价值:
所以,第 i 条样本的 TD 误差是:
把 乘上它的责任权重
:
我们要让所有样本的这个值加起来等于 0:
把含 的项移到等号右边:
这就变成了标准的一元一次方程:。
3. 一张表看懂:普通 TD vs LSTD
| 对比维度 | 普通 TD(0) | 最小二乘时序差分(LSTD) |
| 更新方式 | 增量式(Incremental):来一条数据,迈一小步 | 批处理/闭式解(Closed-form):解矩阵方程,一步到位 |
| 样本效率 | 低(同一个样本需要看很多遍) | 极高(少量样本就能精准算出收敛解) |
| 超参数 | 需要极其小心地调节学习率 | 完全没有学习率 ,免去调参痛苦 |
| 计算复杂度 | 极低:每步只需要 O(d)(d 是特征数量) | 较高:矩阵求逆需要 O(d^3)(或递推版 O(d^2)) |
我们举个极简的例子,你立刻就能明白普通 TD 和 LSTD 在“干活方式”上的根本区别。
假设有一个只有 2 个关卡的简单游戏,我们要估计关卡的价值 。
为了方便计算,我们用一个参数 的线性模型来表示价值:
(
是关卡的特征数)。
-
关卡 A(特征 x = 1):通过后拿到 3 分奖励,并进入关卡 B。
-
关卡 B(特征 x = 2):通过后拿到 10 分奖励,游戏结束。
-
设定折扣因子
。
我们收集到了这两条真实的通关数据:
-
样本 1:关卡 A
关卡 B,获得奖励 R = 3
-
样本 2:关卡 B
游戏结束,获得奖励 R = 10
我们要找出一个最佳的 w,来估计这两个关卡的价值。
方法一:普通 TD(像盲人摸象,一小步一小步挪)
普通 TD 猜答案的过程是这样的:
-
初始状态:假设
。此时它认为
,
。
-
看到样本 1(A
B):
-
实际拿到 3 分,加上未来的估计
,理想总分是
。
-
但现在估算只有
,产生误差
。
-
乘以学习率(比如
),把权重抬高一点:
。
-
-
看到样本 2(B
结束):
-
实际拿到 10 分,但此时
,产生误差
-
再乘以学习率更新一点点
……
-
结果:普通 TD 必须把这两条数据在代码里反复循环跑几十上百遍,让
像蜗牛一样一点一点挪动,最终才能慢慢收敛到理想值。如果学习率
设得不好,还会一直在附近震荡。
方法二:LSTD(把数据收集起来,一步到位解方程)
LSTD 根本不理会什么“学习率 ”,它把两条样本往桌上一放,直接列方程组:
样本 1:关卡 A 关卡 B
-
当前特征
,下一个关卡特征
,拿到奖励
。
我们来分别计算这一条样本贡献给 和
的数字:
-
贡献给
:
-
贡献给
:
样本 2:关卡 B 结束
-
当前特征
,下一个状态是游戏结束(特征
),拿到奖励
。
计算这一条样本贡献给 和
的数字:
-
贡献给
:
-
贡献给
:
汇总求和,求解
现在把所有样本的贡献加起来:
-
总的 A = A1 + A2 = 0 + 4 = 4
-
总的 b = b1 + b2 = 3 + 20 = 23
列出最终方程:
结果:只需要进行一次普通的除法(求逆),LSTD 瞬间计算出完美结果 w = 5.75。
4. 这么厉害,为什么深度学习/大模型不用它?
LSTD 在传统线性强化学习(比如结合瓦片编码、基函数)时代被誉为“最强样本效率算法”,但在今天的深度强化学习中,大家却很少用它,原因有两个:
-
算不动(维度灾难):
矩阵求逆的计算量是特征维度
的三次方(
)。如果特征数
,求逆瞬间完成;但如果像深度学习那样,特征数或参数量
达到了几百万甚至上百亿,矩阵求逆的计算量会直接让顶级算力瘫痪。
-
只对线性模型有效:
的推导前提是“价值函数是平直的线性组合”。一旦换成人工神经网络这种复杂的非线性模型,就无法直接写出闭式解方程组了。
所以,LSTD 完美展现了经典线性 RL 的“优雅”:在特征维度可控时,它能用纯粹的数学推导,以极致的样本效率和零调参代价算出最优解。
8:基于记忆的函数逼近
1. 先对比:“参数化” vs “基于记忆”
我们之前讲的神经网络、线性模型、瓦片编码,都属于参数化方法(Parametric Methods):
-
做法:模型在训练时看海量数据,把规律“浓缩”进一组固定数量的参数/权重 $\mathbf{w}$ 里。训练完成后,原始训练数据全部扔掉。
-
预测时:输入状态
,直接带入公式
算出一个值。
-
缺点:如果遇到新情况,容易发生“灾难性遗忘”(为了记住新的,把旧的权重冲掉了)。
而基于记忆的方法(Memory-based / Non-parametric Methods) 完全反过来:
-
做法:它根本不训练固定的权重
,而是开辟一个“数据库/记忆库”,把在环境中经历过的真实状态和对应价值直接存起来:
。
-
预测时:当遇到一个新状态
时,它会跑去记忆库里检索:“以前有没有经历过和我现在很像的状态?”然后把最相似的几个旧记忆拿出来做加权平均。
2. 基于记忆的方法是如何工作的?
我们用最经典的核平滑 / 局部加权平均(Kernel Smoothing / Locally Weighted Average) 为例,看看它预测一个新状态价值的完整 4 个步骤。
假设记忆库里已经存了 3 条历史经历:
-
经历 1:状态
,真实价值
-
经历 2:状态
,真实价值
-
经历 3:状态
,真实价值
现在,智能体来到了一个新的未知状态 ,需要估算它的价值
。
第 1 步:计算新状态与记忆库中各个状态的“距离”
距离越小,说明情况越相似。这里我们用最基础的绝对距离 :
-
与经历 1 的距离:
-
与经历 2 的距离:
-
与经历 3 的距离:
第 2 步:将距离转化为“相似度权重”
距离越大,相似度越低,权重应该越小。我们使用最直观的倒数加权(距离倒数 ):
-
经历 1 的权重:
-
经历 2 的权重:
-
经历 3 的权重:
第 3 步:归一化权重(让所有权重加起来等于 1)
这一步是为了做合理的加权平均,必须保证所有权重之和等于 1。
-
先求总权重和:
-
计算归一化后的权重
:
-
(占约 60.9% 的话语权)
-
(占约 30.4% 的话语权)
-
(占约 8.7% 的话语权)
-
第 4 步:加权汇总,得到预测价值
把每个历史经历的价值 乘以对应的归一化权重
,然后相加:
代入具体的数值:
结论:模型估算出状态 的价值约为 18.04。整个过程没有训练任何网络参数,完全依靠记忆库中的局部数据现场计算。
3. 常见种类与强化学习应用
在实际使用中,基于记忆的方法有几种变体:
-
k-近邻法(k-NN):只挑距离最近的前 k个记忆做平均,其他的直接扔掉。
-
局部加权回归(Locally Weighted Regression, LWR):不只是简单平均,而是在新状态附近的这几条记忆上,现场拟合一条局部的小直线/小平面。
-
情景记忆强化学习(Episodic Memory RL):比如 Model-Free Episodic Control (MFEC) 算法。智能体把通关成功的完整状态轨迹和回报存入记忆库,下次遇到相似情境,直接照搬当年成功经验的动作和价值。
| 对比维度 | 参数化逼近(如神经网络) | 基于记忆的函数逼近(如 LWR / 记忆库) |
| 学习速度 | 慢(需要无数次梯度下降去调权重) | 极快(拿到数据直接往数据库里存就行) |
| 预测速度 | 极快(一次前向传播 O(1)) | 慢(每次预测都要在记忆库里搜索近邻 O(N)) |
| 内存开销 | 固定且小(只需要存网络参数 ) | 随时间膨胀(数据越多,记忆库越大) |
| 灾难性遗忘 | 严重(更新新权重会破坏旧记忆) | 几乎没有(旧数据好端端存在数据库里) |
基于记忆的方法就像人类的“肌肉记忆”或“经验检索”——在刚接触新环境、数据量极少时,它能凭借几条关键的成功记忆快速做出明智决定;但在数据量极大、环境极其复杂时,查数据库的成本太高,就需要交给神经网络这种参数化方法了。
9:核函数函数逼近
上一轮我们在算记忆库里两个状态的相似度时,用了最原始的倒数距离 $\frac{1}{d}$。这种做法有两大缺点:一是曲线不够平滑,容易被噪点干扰;二是无法处理复杂的高维非线性关系。
核函数逼近的核心思想是:引入一个数学上严谨、光滑的“核函数(Kernel Function)” K(s, s') 来精准衡量两个状态的相似程度。
1. 什么是核函数?
最经典、最常用的核函数是高斯核函数(Gaussian RBF Kernel):

我们把公式里的每一个变量拆开来看:
-
s:当前需要估计的新状态。
-
s':记忆库里的某个历史状态。
-
:两个状态之间的距离平方。
-
(Sigma,核宽):一个由我们设定的超参数。
越大,平滑范围越广;
越小,模型越关注极近距离的记忆。
-
:计算出来的相似度得分,数值严格限制在 0 到 1之间(距离完全重合时为 1,距离很远时迅速趋向于 0)。
核函数逼近远不止“做光滑加权”这么简单。它在数学上隐藏着一个非常惊艳的物理解释——核技巧(Kernel Trick)。

假设在平面(2维)上有两类点:红点全在圆心附近,蓝点环绕在外面。
在 2 维平面上,你无论怎么画直线的线性切刀,都绝对无法把红点和蓝点分开。
怎么办?数学家想了个办法:把这些点从 2 维映射到 3 维! 比如把每个点 ,通过一个变换函数
,变成 3 维坐标:
映射到 3 维空间后,原本拱起的数据就被“拉高”了,此时我们拿一张平整的纸(3 维平面),就能一刀把它们完美切开!
但是,麻烦来了: 如果我们要算两个点映射后的高维点积,计算量会随着维度暴涨。
我们准备两个简单的 2 维原始坐标,一步步算给你看:
-
状态
(即
)
-
状态
(即
)
我们的目标是:算出它们升维后的高维点积 。
路线 A:硬算(不使用核技巧,老老实实升维)
我们要先分别把 x 和 y 转换成 3 维向量,然后再做点积。
第 1 步:把 x = (2, 3)转换成 3 维向量
所以,。
第 2 步:把 转换成 3 维向量
所以,。
第 3 步:计算 3 维向量的点积
将对应分量相乘后再相加:
相加:529
路线 A 总结:我们算开方、算平方、把数据升到 3 维,折腾了一大通,最后算出的答案是 529。
路线 B:偷懒(使用“核技巧”)
核技巧说:你根本不需要知道 3 维向量长什么样,直接在原本的 2 维数据上套用核函数公式 ,就能拿到一模一样的答案!
我们来看看用核公式怎么算:
第 1 步:在 2 维原始数据上算普通点积
第 2 步:直接套用核函数求平方
理由:
![]()

回到映射:



-
式 A(核公式):
-
式 B(升维点积):
两式逐字逐句完全一致!
默瑟定理(Mercer's Theorem)
看完上面的推导,你可能会问:“这是因为我们刚好凑出了 ,那对于那些复杂的核函数(比如高斯核),我们怎么知道它对应什么高维映射?”
数学家默瑟(Mercer)证明了一个极其伟大的定理(默瑟定理):
只要一个核函数
满足连续性和平移对称半正定(即满足“默瑟条件”),那么数学上就绝对存在某一个高维(甚至是无限维)的映射
,使得
恒成立。
这就意味着:我们根本不需要去关心 到底长什么样、维度有多高。只要我们选用的核函数符合数学规范,我们就敢 100% 保证:直接算 K(x, y),就等于在某个庞大的高维空间里做了一次精准的点积!
136



被折叠的 条评论
为什么被折叠?



