1. 强化学习策略评估与改进的核心逻辑
在强化学习领域,策略评估与改进构成了一个完整的迭代优化闭环。这个过程的本质是通过不断测量当前策略的表现(评估)和基于测量结果优化策略(改进),最终逼近最优决策方案。就像教练观察运动员的训练表现后调整训练计划一样,这种循环让智能体在环境中逐步提升决策能力。
策略评估阶段的核心工具是贝尔曼期望方程(Bellman Expectation Equation),它建立了状态价值函数与后续状态价值之间的递归关系。具体来说,对于给定策略π,状态s的价值Vπ(s)可以表示为:
Vπ(s) = Σ π(a|s) * Σ p(s',r|s,a)[r + γVπ(s')]
其中γ是折扣因子,体现了未来奖励的当前价值。这个方程告诉我们,一个状态的价值等于从该状态出发,按照策略π行动所能获得的即时奖励加上后续状态的折扣价值。
2. 策略评估的三种经典方法
2.1 动态规划法:精确但计算量大
动态规划法直接求解贝尔曼方程组成的线性方程组。对于有n个状态的问题,我们需要解n个方程的线性系统。这种方法在状态空间较小时非常有效,但当状态数量增加时,计算复杂度会呈指数级增长。
实际操作中,我们可以将贝尔曼方程表示为矩阵形式: V = R + γPV 其中P是状态转移矩阵。解这个方程得到: V = (I - γP)^(-1)R
注意:矩阵求逆的复杂度是O(n^3),当n很大时(比如10^6个状态),这种方法就不可行了。
2.2 迭代策略评估:实用且稳定
迭代策略评估采用逐步逼近的方式,通过以下更新规则反复计算: V_{k+1}(s) = Σ π(a|s) * Σ p(s',r|s,a)[r + γV_k(s')]
这个过程会收敛到真实的Vπ,因为贝尔曼算子是一个压缩映射。在实际编程实现时,通常设置一个阈值θ(如0.0001),当两次迭代的价值函数变化小于θ时停止迭代。
def iterative_policy_evaluation(env, policy, gamma=0.9, theta=1e-4): V = np.zeros(env.nS) while True: delta = 0 for s in range(env.nS): v = 0 for a, action_prob in enumerate(policy[s]): for prob, next_state, reward, done in env.P[s][a]: v += action_prob * prob * (reward + gamma * V[next_state]) delta = max(delta, np.abs(v - V[s])) V[s] = v if delta < theta: break return V2.3 蒙特卡洛方法:无模型评估
当环境模型未知时,我们可以采用蒙特卡洛方法,通过采样轨迹来估计状态价值。具体步骤是:
- 使用策略π生成多条完整轨迹(从开始到终止)
- 对每个状态s,计算所有首次访问s时的回报G的均值
- 用这个均值作为Vπ(s)的估计
蒙特卡洛方法的优势是不需要知道环境动力学,但方差较大,需要大量采样才能获得准确估计。
3. 策略改进的理论基础与算法实现
3.1 策略改进定理
策略改进的核心依据是一个简单但强大的定理:对于任意两个策略π和π',如果在所有状态s下都有qπ(s,π'(s)) ≥ vπ(s),那么π'一定不比π差,即对所有s,vπ'(s) ≥ vπ(s)。
这个定理告诉我们,只要新策略在每个状态都选择相对于旧策略更优的动作,那么整体策略一定会改进。基于此,我们可以定义贪婪策略:
π'(s) = argmax_a qπ(s,a)
3.2 策略迭代算法
策略迭代将评估和改进交替进行:
- 初始化随机策略π0
- 重复直到收敛: a. 策略评估:计算Vπi b. 策略改进:π_{i+1} = greedy(Vπi)
def policy_iteration(env, gamma=0.9, theta=1e-4): # 初始化随机策略 policy = np.ones([env.nS, env.nA]) / env.nA while True: # 策略评估 V = iterative_policy_evaluation(env, policy, gamma, theta) # 策略改进 policy_stable = True for s in range(env.nS): old_action = np.argmax(policy[s]) action_values = np.zeros(env.nA) for a in range(env.nA): for prob, next_state, reward, done in env.P[s][a]: action_values[a] += prob * (reward + gamma * V[next_state]) best_action = np.argmax(action_values) policy[s] = np.eye(env.nA)[best_action] if old_action != best_action: policy_stable = False if policy_stable: break return policy, V3.3 值迭代算法
值迭代将评估和改进步骤合并,直接迭代最优价值函数:
V_{k+1}(s) = max_a Σ p(s',r|s,a)[r + γV_k(s')]
当价值函数收敛后,最优策略可以通过一步前瞻得到:
π*(s) = argmax_a Σ p(s',r|s,a)[r + γV*(s')]
值迭代的代码实现与策略评估类似,但取的是最大值而非期望值:
def value_iteration(env, gamma=0.9, theta=1e-4): V = np.zeros(env.nS) while True: delta = 0 for s in range(env.nS): action_values = np.zeros(env.nA) for a in range(env.nA): for prob, next_state, reward, done in env.P[s][a]: action_values[a] += prob * (reward + gamma * V[next_state]) best_value = np.max(action_values) delta = max(delta, np.abs(best_value - V[s])) V[s] = best_value if delta < theta: break # 提取最优策略 policy = np.zeros([env.nS, env.nA]) for s in range(env.nS): action_values = np.zeros(env.nA) for a in range(env.nA): for prob, next_state, reward, done in env.P[s][a]: action_values[a] += prob * (reward + gamma * V[next_state]) best_action = np.argmax(action_values) policy[s, best_action] = 1.0 return policy, V4. 实际应用中的挑战与解决方案
4.1 大规模状态空间的处理
当状态空间很大时,精确的价值函数表示变得不可行。这时可以考虑:
- 函数逼近:使用线性函数或神经网络近似价值函数
- 状态聚合:将相似状态聚类处理
- 特征工程:提取状态的关键特征,降低维度
4.2 探索与利用的平衡
纯粹的贪婪策略可能导致过早收敛到次优解。常见解决方案包括:
- ε-贪婪策略:以ε概率随机选择动作
- 乐观初始化:给价值函数设置较高初始值,鼓励探索
- UCB(Upper Confidence Bound):选择具有最高置信上限的动作
4.3 收敛速度优化
几种加速收敛的技术:
- 广义策略迭代(GPI):不等待策略评估完全收敛就开始改进
- 异步更新:不按顺序更新所有状态
- 多步自举:结合TD(λ)算法
5. 典型问题排查与调试技巧
5.1 价值函数不收敛
可能原因及解决方案:
- 折扣因子γ过大:尝试减小γ值(如从0.99降到0.9)
- 学习率过高:在增量式实现中降低学习率
- 环境模型错误:检查状态转移概率和奖励函数
5.2 策略振荡
当策略在两个或多个次优解之间来回切换时:
- 引入策略滞后:保留旧策略一段时间
- 使用随机策略:如softmax策略代替纯贪婪
- 增加批次大小:在批量更新中使用更多样本
5.3 实现中的常见错误
- 错误处理终止状态:忘记在终止状态设置V(s)=0
- 同步更新问题:在迭代过程中错误地覆盖了价值函数
- 动作选择错误:在ε-贪婪策略中未正确处理探索动作
调试建议:从小型网格世界开始验证算法,使用确定性环境测试,逐步增加复杂度。可视化价值函数和策略的变化过程能帮助发现问题。