强化学习之Q-learning && SARSA 对比

本文深入探讨了Q-learning(on-policy)和SARSA(off-policy)两种强化学习算法,通过理论知识和趣味迷宫例子进行解释。Q-learning在更新Q表时考虑了未来奖励,而SARSA则基于实际选取的动作进行更新。通过不断的Q值迭代,最终Q-learning找到最优路径。SARSA更注重当前选择的动作,适合动态环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q-learning(on-policy)

参考:http://www.mnemstudio.org/path-finding-q-learning-tutorial.htm
http://www.mnemstudio.org/path-finding-q-learning-tutorial.htm

理论知识:

假设一个小学生放学后有两种选择——看电视或者是做作业,这里小学生就是agent,看电视和做作业就是两种action,分别记为a1和a2。然后建立奖惩机制,看电视会扣2分,做作业会加1分,初始化Q表在初始化状态下为0.然后根据我们的奖惩机制可以,更新在S1状态的Q表值。

由于做作业的Q值高,所以我们会选择a2动作,也即Q(s1, a2),这样下一个状态S2也同样会对应两个动作。Q-learning就是在考虑本步状态的同时也会涉及到下一个状态。对于这里S2中a2动作的Q值比a1大,所以在更新Q(s1, a2)时,把大的 Q(s2, a2) 乘上一个衰减值 gamma (比如是0.9) 并加上到达s2时所获取的奖励 R (这里还没有获取到我们的棒棒糖, 所以奖励为 0), 因为会获取实实在在的奖励 R , 我们将这个作为我现实中 Q(s1, a2) 的值,这个现实值会与老值做差,然后以一个学习效率 alpha 累加上老的 Q(s1, a2) 的值 变成新的值,如下图。

### Q-LearningSARSA的差异 在强化学习领域内,Q-LearningSARSA代表两种不同的策略更新机制。Q-Learning是一种off-policy的学习方法,在这种模式下,算法可以依据并非由当前政策产生的动作来改进该政策[^1]。这意味着Q-Learning能够探索环境中的所有可能行动,并基于贪婪原则选择最优路径。 相比之下,SARSA采用on-policy的方式工作,即它仅根据实际经历的动作—奖励序列调整其行为准则。具体来说,当执行某个特定操作并接收到即时反馈之后,SARSA会利用这个确切的结果去修正未来的决策过程[^3]。 #### 更新规则对比 对于状态\(s\)下的动作价值函数\(Q(s,a)\),两者的迭代公式如下: - **Q-Learning**: \[ Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha[r_{t+1}+\gamma\max_a Q(s_{t+1},a)-Q(s_t,a_t)] \] 这里采用了最大预期收益作为下一个时间步的最佳估计值。 - **SARSA**: \[ Q(s_t, a_t) \leftarrow Q(s_t, a_t)+\alpha[r_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)] \] 此表达式反映了采取的实际后续动作\(a_{t+1}\)对未来期望的影响。 上述区别使得Q-Learning倾向于更积极地寻找潜在的最大回报路线;而SARSA则更加保守,因为它依赖于已经发生的事件来进行评估。 ### 应用场景分析 由于各自特性不同,这两种技术适用于不同类型的任务需求: - 当环境中存在大量可用选项时,Q-Learning可能会更快找到全局最优解,因为它是通过考虑每一个可能性来做出最佳选择。然而,在某些情况下这可能导致过度拟合或忽略了一些重要的局部特征。 - 对于那些需要谨慎处理不确定性和风险规避的应用场合(比如自动驾驶汽车),SARSA可能是更好的选择。这是因为它的决策流程紧密跟随历史数据的变化趋势,从而减少了因预测错误而导致严重后果的风险。 ```python import numpy as np def q_learning(env, num_episodes=500, alpha=0.1, gamma=0.99): """Simple implementation of Q-learning algorithm.""" n_states = env.observation_space.n n_actions = env.action_space.n Q_table = np.zeros((n_states, n_actions)) for episode in range(num_episodes): state = env.reset() while True: action = np.argmax(Q_table[state]) next_state, reward, done, _ = env.step(action) best_next_action = np.max(Q_table[next_state]) # Greedy selection Q_table[state][action] += alpha * (reward + gamma*best_next_action - Q_table[state][action]) if done: break state = next_state return Q_table def sarsa(env, num_episodes=500, alpha=0.1, gamma=0.99): """Implementation of SARSA on-policy control""" n_states = env.observation_space.n n_actions = env.action_space.n Q_table = np.zeros((n_states, n_actions)) for episode in range(num_episodes): state = env.reset() action = np.random.choice(n_actions) # Initial random choice while True: next_state, reward, done, _ = env.step(action) next_action = np.argmax(Q_table[next_state]) # Policy derived from Q-table Q_table[state][action] += alpha*(reward + gamma*Q_table[next_state][next_action]-Q_table[state][action]) if done: break state, action = next_state, next_action return Q_table ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值