E.1.3 点积、范数与函数近似
前置知识:E.1.1 向量与矩阵——需掌握向量和向量运算。E.1.2 贝尔曼矩阵形式——需掌握贝尔曼方程的矩阵形式 。
概述
上一篇推导了贝尔曼方程的矩阵形式 和闭式解 。这两个表达式在数学上简洁严谨,但遗留了一个实际困难:当状态空间极大时,价值表无法完整存储。围棋约有 个状态,矩阵 无法显式构造,价值向量 也无法逐个分量写出。
解决方案是用一个函数来近似价值:为状态提取特征,再用特征与权重的点积计算价值估计。本篇的核心公式是:
其中 是状态 的特征向量, 是需要学习的权重向量。点积的结果即为该状态的近似价值。
本篇前半部分用点积构建函数近似框架。引入函数近似后,训练过程需不断更新权重 ——更新的步长如何选择?如何度量"变化的幅度"?后半部分自然引出范数这一工具。以下从查表方法的局限开始展开。
查表方法的局限
先看一个具体对比:
| 环境 | 状态空间大小 | 能否存储 |
|---|---|---|
| 两状态小环境 | 2 | 可存储 |
| GridWorld 10x10 | 100 | 可存储 |
| 围棋棋盘 | ~10^170 | 不可存储 |
| 连续状态(如机器人关节角度) | 无穷 | 不可存储 |
第 3 章介绍的 DP、MC、TD 三类方法——无论是用贝尔曼方程直接求解、用完整轨迹的回报估计、还是每步即时更新——都共享一个前提:为每个状态存储一个 。第 4 章的 Q-Learning 延续了同一思路,只是将存储对象替换为每个 (状态, 动作) 对的 。
状态数量增长到一定程度后,"为每个状态单独存储一个数值"的方案便不再可行。解决路径是:放弃逐状态的独立存储,转用一个函数来统一近似。函数的输入是状态的特征,输出是对该状态价值的估计。
点积:用特征与权重合成预测
最简单的函数近似方案:为状态提取一组特征,通过特征与权重的点积计算价值。
假设一个状态有三个特征:
这些特征可能分别表示"到目标的距离为 ""速度为 ""障碍物数量为 "。一个线性价值函数用三个权重表示:
于是状态价值的估计由点积给出:
点积的实质是:每个特征对最终预测的贡献由其对应的权重决定,所有贡献加总即得预测值。 规定了各特征的相对重要性, 给出了当前状态在各特征上的取值,点积将两者合成一个标量预测。
第 3 章中提到的 可用相同方式近似:
其中 是 (状态, 动作) 对的特征向量。第 4 章的 DQN 将线性近似推广为神经网络——但无论线性还是深度模型,底层运算均为向量运算。
特征如何构造?
特征向量的构造取决于问题本身。以下是几种常见做法。
One-hot 编码(离散状态):
若状态集合为 ,则有:
| 状态 | 特征向量 |
|---|---|
| s_1 | [1, 0, 0]^T |
| s_2 | [0, 1, 0]^T |
| s_3 | [0, 0, 1]^T |
使用 one-hot 特征时, 等价于直接取出 的第 个分量——与查表完全等价。换言之,查表是线性近似的特例。第 3 章的 Q-Learning 表格法,本质上就是采用了 one-hot 特征的线性近似。
手工特征(GridWorld):
在 GridWorld 中,状态 的特征可设计为:
这些特征包含了位置的归一化信息以及到目标的距离。
神经网络学到的特征:
在深度 RL 中,特征不由人工设计,而是由神经网络自动学习。输入图像经过若干卷积层后得到一个向量 ,再由线性层计算 。第 4 章的 DQN 即遵循这一思路。
从查表到深度网络,是一条"特征自动化程度逐步提高"的演进路径:
无论采用何种方法,底层运算均以向量为核心。神经网络每一层执行矩阵乘法(即批量点积的推广),只是中间插入了非线性激活函数(如 ReLU),使整体具备拟合复杂函数的能力。
点积的几何意义
点积不单是"逐元素相乘再求和"的代数运算。在几何上:
其中 为两向量之间的夹角。由此可得:
- 若 与 方向一致(),点积为正。
- 若方向相反(),点积为负。
- 若两者正交(),点积为零。
在 RL 的价值估计中,点积为正表明该状态在当前权重下的评估偏正向,为负则偏负向。 的方向编码了各特征的相对重要性, 的方向编码了该状态在各特征维度上的取值——两向量夹角越小,估值越高。
从预测到学习:权重的来源
至此,已知用点积 可以近似价值。但权重 从何而来?
答案是:通过训练学习。第 3 章中 TD 方法用 TD Error 更新价值估计:
函数近似下的训练逻辑与之完全类似——计算预测值与目标值之间的差距(损失),然后沿梯度方向更新权重:
其中 为梯度向量, 为学习率。
此公式引出一个新问题:梯度 作为一个向量,其大小是多少? 若梯度过大,参数一步跨越过远,训练可能不稳定;若梯度过小,学习又过于缓慢。要定量回答"一个向量的大小",就需要范数——衡量向量长度的数学工具。本节的目标公式是:
范数度量"多大",缩放限制"每步走多远"。以下从最常用的范数开始。
范数:衡量向量的大小
最常用的是 L2 范数,其定义为勾股定理在任意维空间的推广:
对向量 ,其 L2 范数为:
该值与直角三角形的斜边长度一致——二维情形下 L2 范数退化为欧几里得距离。
L1 范数
同一向量 的 L1 范数为:
L1 范数是所有分量绝对值之和。相较于 L2,L1 对大分量的惩罚较轻(不做平方),对小分量则更为敏感。
L1 与 L2:选择依据
| 性质 | L2 范数 | L1 范数 | | ---------- | ---------------------- | -------------------- | --- | --- | | 公式 | \sqrt{\Sigma x_i^2} | \Sigma | x_i | | | 对大值响应 | 敏感(平方放大大分量) | 相对不敏感 | | 在 RL 中 | 梯度裁剪、权重衰减 | 稀疏正则化、特征选择 | | 典型用途 | max_grad_norm | L1 正则化 |
Frobenius 范数(矩阵范数)
向量的范数概念可推广至矩阵。Frobenius 范数是最常用的矩阵范数:
例如:
在 RL 中,Frobenius 范数常用于权重矩阵的正则化以及两矩阵差异的度量。
梯度裁剪:范数在训练中的直接应用
有了范数,就可以定量描述"梯度的大小"。训练神经网络时,若梯度范数过大,参数更新将极为剧烈,可能导致训练不稳定。梯度裁剪即用于限制这一长度。
具体数值示例
假设一次反向传播后,四个参数的梯度为:
其 L2 范数为:
若最大范数设为 ,则将梯度缩放为原来的 倍:
裁剪后的梯度范数恰为 。注意裁剪仅改变向量的长度,不改变其方向——梯度各分量按同一比例缩放。
这就是 RL 代码中 max_grad_norm 参数的数学含义。在 PyTorch 中:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0)RL 中梯度裁剪的必要性
RL 的梯度来自策略梯度和时序差分估计,其噪声水平天然高于监督学习——原因在于数据来自不断变化的采样策略,而非固定的训练集。单条高回报轨迹可能产生极大梯度,导致参数剧烈变化,使下一步的策略与之前截然不同。第 5 章的 REINFORCE 算法即面临这一问题:其梯度估计的方差极大。梯度裁剪为这种波动设置一个硬上限,防止单步更新过度偏离。
小结:从查表到函数近似
本篇的核心转换是:当状态空间过大无法逐项存储时,用特征与点积来近似价值。
| 场景 | 方法 | 本质 |
|---|---|---|
| 状态较少(如 n < 1000) | 查表:为每个状态存储 v(s) | one-hot + 点积 |
| 状态较多但特征已知 | 线性近似:v(s) ≈ w^T x(s) | 手工特征 + 点积 |
| 状态复杂(图像、文本) | 深度网络:v(s) ≈ f_\theta(s) | 自动学习特征 + 非线性 |
无论采用何种方法,底层运算均以向量和点积为基础。神经网络每一层执行矩阵乘法,范数则是度量"大小"的统一工具,在梯度裁剪和正则化中均有应用。
函数近似之后:两个悬而未决的问题
本章解决了"状态空间过大如何存储"的问题:用点积近似价值,用范数量化更新幅度。
但引入函数近似后,尚有两个问题有待回答:
- 无论是查表还是函数近似,反复执行贝尔曼更新 是否会稳定收敛?第 3 章中 DP 方法"反复迭代直至收敛"——其收敛性是否有理论保证,还是可能发生震荡甚至发散?
- 第 3 章路线二的策略梯度更新 ,是否存在单步更新过大导致策略恶化的风险?梯度裁剪限制了步长,但它对所有方向一视同仁——某些方向上移动 可能影响甚微,另一些方向上移动 却可能使策略剧变。
这两个问题的共同本质是:需要分析"变化量"在不同方向上的行为差异。这便引出了特征值、谱半径和加权范数——下一篇的主题。
下一篇:E.1.4 收敛性、特征值与信任域 —— 值迭代为何会稳定?参数更新如何考虑方向敏感度?