🔍 LSTD-Q 中最小二乘法的体现
LSTD-Q(Least-Squares Temporal Difference
Q-learning) 之所以叫
“Least-Squares”,就是因为它通过最小二乘法(Least
Squares) 来求解最优参数 θ
,从而逼近 Q 函数。
在代码中,最小二乘法体现在: 1
self.theta = np.linalg.solve(self.A, self.b)
📌 数学推导:最小二乘法在 LSTD-Q 中的应用
LSTD-Q 的目标是找到一个 近似 Q 值函数: [ Q(s, a) = (s, a)^T ] 其中: - ( Q(s, a) ) 是 Q 值,我们用特征向量 ( (s, a) ) 的线性组合来逼近它。 - ( ) 是待求解的参数。
1️⃣ 目标:找到最优
θ
使得 LSTD 误差最小
基于 贝尔曼方程: [ Q(s, a) = r + Q(s', a') ]
我们用最小二乘法逼近 Q 值,最优 θ
需要满足: [ {} ( Q(s, a) - (r + Q(s', a')) )^2 ] 展开后可以写成: [
{} ( (s, a)^T - (r + (s', a')^T ) )^2 ]
2️⃣ 线性方程组的构造
如果我们有 N 组数据 ( (s_i, a_i, r_i, s'_i, a'_i) ),记: - ( ) 是所有 ( (s, a) ) 组成的矩阵: [ = \[\begin{bmatrix} \phi(s_1, a_1)^T \\ \phi(s_2, a_2)^T \\ \vdots \\ \phi(s_N, a_N)^T \end{bmatrix}\]] 形状是 ( (N, d) ),其中 ( d ) 是特征维度。
( R ) 是奖励向量: [ R =
\[\begin{bmatrix} r_1 \\ r_2 \\ \vdots \\ r_N \end{bmatrix}\]] 形状是 ( (N, 1) )。
( ' ) 是所有 ( (s', a') ) 组成的矩阵: [ ' =
\[\begin{bmatrix} \phi(s'_1, a'_1)^T \\ \phi(s'_2, a'_2)^T \\ \vdots \\ \phi(s'_N, a'_N)^T \end{bmatrix}\]] 形状也是 ( (N, d) )。
将 Q 值近似公式代入,我们得到线性方程: [ = R + ' ] 整理得到: [ (^T - ^T ') = ^T R ]
3️⃣ 代码如何实现最小二乘法
在代码中,这个方程被表示为: 1
2
3self.A += np.outer(phi, (phi - self.gamma * next_phi)) # 更新 A
self.b += reward * phi # 更新 b
self.theta = np.linalg.solve(self.A, self.b) # 计算 thetaself.A
对应
( (^T - ^T ') ) - self.b
对应 ( ^T R ) -
np.linalg.solve(self.A, self.b)
解线性方程组,求解最优 θ
这就是 LSTD-Q 里最小二乘法的核心! 🎯
🚀 直观理解
- 普通 Q-learning 是直接用 TD 误差来逐步更新 Q 值,但它可能收敛慢,而且受学习率影响大。
- LSTD-Q
是直接求解一个线性方程组,用最小二乘法一次性计算出最优
θ
,收敛快,精度高,适用于高维状态空间。