YAOTU INSIGHTS

强化学习核心算法解析:MC、TD与Q-learning对比

强化学习核心算法解析:MC、TD与Q-learning对比
1. 强化学习基础概念全景第一次接触强化学习时我被那些缩写字母搞得晕头转向——MC、TD、Q-learning每个算法看起来都像天书。直到真正动手实现了几种算法才明白它们不过是解决同一类问题的不同思路。今天我就用最直白的语言带你看懂这些核心概念的本质区别。强化学习的核心是试错学习。想象训练一只小狗做对动作给零食正向奖励做错就轻拍鼻子负向奖励。经过反复尝试小狗会学会哪些行为能获得最多零食。这就是强化学习的精髓——智能体通过与环境互动学习最优策略。在正式介绍算法前需要明确几个关键术语状态(State)环境当前情况的描述如游戏画面、机器人关节角度动作(Action)智能体可以执行的操作如移动摇杆、施加扭矩奖励(Reward)环境对动作的即时反馈得分增减、任务完成度策略(Policy)从状态到动作的映射规则即在什么情况下该做什么关键理解强化学习不是单纯模仿已有数据而是通过不断试错来自主发现最优策略。这种特性使其在游戏AI、机器人控制等领域具有不可替代的优势。2. 蒙特卡洛(MC)方法完整的经验学习2.1 MC的核心思想蒙特卡洛方法得名于赌城蒙特卡洛核心思路是用大量随机样本逼近真实值。在强化学习中MC通过完整回合(episode)的采样来评估策略价值。具体流程运行完整回合如玩完一局游戏记录该回合中每个状态/动作的奖励序列从后向前计算每个状态的累计回报用多次运行的平均值作为价值估计# 伪代码示例首次访问型MC策略评估 def mc_evaluation(policy, env, episodes): returns defaultdict(list) for _ in range(episodes): episode [] state env.reset() while True: action policy(state) next_state, reward, done, _ env.step(action) episode.append((state, action, reward)) if done: break state next_state G 0 for t in reversed(range(len(episode))): state, action, reward episode[t] G gamma * G reward if state not in [x[0] for x in episode[:t]]: returns[state].append(G) V {s: np.mean(rs) for s, rs in returns.items()} return V2.2 MC的优缺点分析优势无需环境动态模型即不需要知道状态转移概率对非马尔科夫环境更鲁棒概念简单易于实现局限必须等待回合结束才能更新不适合持续任务高方差不同回合的回报可能差异巨大对探索敏感未访问的状态无法评估实战经验在21点游戏等有明确结束节点的场景中MC表现优异。我曾用MC训练一个简单的21点策略约5000次迭代后胜率就能达到45%庄家优势约49%。3. 时序差分(TD)学习渐进式更新艺术3.1 TD的核心创新时序差分方法结合了MC和动态规划的思想其核心公式[ V(S_t) \leftarrow V(S_t) \alpha [R_{t1} \gamma V(S_{t1}) - V(S_t)] ]其中(\alpha) 是学习率(\gamma) 是折扣因子(R_{t1} \gamma V(S_{t1})) 称为TD目标(TD误差 TD目标 - 当前估计)这个看似简单的公式却蕴含着深刻思想用当前估计来改进自身自举法。3.2 TD vs MC 关键区别通过一个迷宫例子说明差异智能体从起点S到终点G中间有陷阱T某次探索路径S-A-B-T获得-10奖励MC处理等整个回合结束后给S、A、B都分配-10的价值TD(0)处理在S→A时立即更新V(S) α[-0 γV(A) - V(S)]A→B时更新V(A) α[-0 γV(B) - V(A)]B→T时更新V(B) α[-10 γV(T) - V(B)]3.3 TD(λ)的优雅扩展λ参数控制信息回溯的程度λ0纯TD(0)只向前看一步λ1等价于MC考虑整个轨迹中间值折中方案通过资格迹(eligibility trace)实现# TD(λ)伪代码实现 def td_lambda(env, episodes, lambda_0.9): V defaultdict(float) for _ in range(episodes): E defaultdict(float) # 资格迹 state env.reset() while True: action policy(state) next_state, reward, done, _ env.step(action) delta reward gamma * V[next_state] - V[state] E[state] 1 # 累积迹或替换迹 for s in V: V[s] alpha * delta * E[s] E[s] * gamma * lambda_ if done: break state next_state return V4. Q-learning价值学习的里程碑4.1 从状态价值到动作价值前述方法主要估计状态价值V(s)而Q-learning直接学习动作价值Q(s,a)其更新规则[ Q(S_t,A_t) \leftarrow Q(S_t,A_t) \alpha [R_{t1} \gamma \max_a Q(S_{t1},a) - Q(S_t,A_t)] ]关键特性异策略(off-policy)学习最优策略而行为策略可以不同如ε-greedy无需环境模型表格法可保证收敛到最优Q函数4.2 经典悬崖行走示例S → → → → → → → → → → → G ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ C C C C C C C C C C CS: 起点G: 终点C: 悬崖每步奖励-1掉悬崖-100并回到起点最优路径紧贴悬崖上方的路径Q-learning能学会这条最优路径而SARSA另一种TD算法会选择更安全的路线因为后者考虑了探索时的风险。4.3 实现要点与技巧class QLearningAgent: def __init__(self, n_states, n_actions): self.q_table np.zeros((n_states, n_actions)) self.epsilon 0.1 def choose_action(self, state): if np.random.rand() self.epsilon: return np.random.choice(self.n_actions) return np.argmax(self.q_table[state]) def learn(self, state, action, reward, next_state, done): target reward (1-done) * gamma * np.max(self.q_table[next_state]) self.q_table[state, action] alpha * (target - self.q_table[state, action])参数设置经验α通常从0.1开始随着训练逐渐衰减γ在0.9~0.99之间远期目标越重要取值越高ε采用线性退火从1.0降到0.01效果通常不错5. 算法对比与工程实践5.1 三大方法特性对比特性MCTDQ-learning更新时机回合结束单步单步偏差/方差无偏高方差有偏低方差有偏中方差是否需环境模型否否否收敛性保证收敛通常收敛保证收敛数据效率低中高实现难度简单中等中等5.2 实际应用选择建议选择MC当环境有明确终止条件需要无偏估计可以承受高方差选择TD当任务持续无终止需要在线学习数据效率很重要选择Q-learning当需要最优策略动作空间离散且不大可以接受较慢收敛5.3 常见陷阱与解决方案问题1Q-learning不收敛检查学习率α是否过大确保探索充分ε不要过早降为0验证奖励设置是否合理存在奖励循环问题2TD估计波动大尝试减小学习率使用资格迹TD(λ)增加批次大小如果是批处理版本问题3MC方差过高增加采样回合数考虑重要性采样使用基准函数减少方差我在实现GridWorld时曾遇到Q-learning持续震荡的问题最终发现是状态编码不充分导致部分状态无法区分。添加位置哈希后问题立刻解决——这个教训让我明白强化学习效果差时首先要检查状态表示是否合理。