今天看到一道强化学习面试题目,才知道即使自己学了这么多理论,但是肯定是学的倒懂不懂的状态,记录以下。
伪代码介绍
Q-learning: off policy
Sarsa: on policy
主要区别
- Q-learning: off policy, Sarsa: on policy
其实主要区别是他们两个更新Q_table的方式:
Q-Learning:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ max a Q ( S t + 1 , a ) − Q ( S t , A t ) ] Q\left(S_{t}, A_{t}\right) \leftarrow Q\left(S_{t}, A_{t}\right)+\alpha\left[R_{t+1}+\gamma \max _{a} Q\left(S_{t+1}, a\right)-Q\left(S_{t}, A_{t}\right)\right] Q(St,At)←Q(St,At)+α[Rt+1+γamaxQ(St+1,a)−Q(St,At)]
Sarsa:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ] Q\left(S_{t}, A_{t}\right) \leftarrow Q\left(S_{t}, A_{t}\right)+\alpha\left[R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right)-Q\left(S_{t}, A_{t}\right)\right] Q(St,At)←Q(St,At)+α[Rt+1+γQ(St+1,At+1)−Q(St,At)]
区别详解
其实区别我们可以从伪代码就可以看出来。
-
对于Q-Learning来说,在状态 S t S_t St下,根据某个策略( ϵ − g r e e d y \epsilon-greedy ϵ−greedy)执行 S t + 1 S_{t+1} St+1 之后,利用在状态 S t + 1 S_{t+1} St+1 下采取所有动作中最大的那个 Q ( S t + 1 , a ) , Q\left(S_{t+1}, a\right), Q(St+1,a), 来更新 Q ( S t , a ) , Q\left(S_{t}, a\right), Q(St,a), 但是其实不真正采取 ( S t + 1 , a ) \left(S_{t+1}, a\right) (St+1,a) 。对于在状态 S t + 1 S_{t+1} St+1 出选择要执行的动作可以理解为 S t = S t + 1 , S_{t}=S_{t+1}, St=St+1, 即在状态 S t + 1 S_{t+1} St+1 下选择要执行的动作依然要使用相同的某策略(如 ϵ − g r e e d y \epsilon-g r e e d y ϵ−greedy 策略)。
-
对于Sarsa来说:在状态 S t S_{t} St 下,根据某策略 (如 ϵ − g r e e d y \epsilon-g r e e d y ϵ−greedy 策略)执行动作 A t A_{t} At 到达状态 S t + 1 S_{t+1} St+1 之 后,此时用来更新 ( S t , a ) \left(S_{t}, a\right) (St,a) 的 Q Q Q 值的方法依然采用某策略 ( ( ( 如 ϵ − g r e e d y \epsilon-g r e e d y ϵ−greedy 策略 ) , ), ), 并且真正采取 ( S t + 1 , a ) \left(S_{t+1}, a\right) (St+1,a)
-
我们要把选取动作和更新 Q Q Q 表值区分开来,对于两个算法来说,选择动作都是采用某策略 ( ( ( 如 ϵ \epsilon ϵ greedy策略) , 区别就在于 Q − Q- Q− learning更新 Q Q Q 值的方式为贪婪策略,即直接选择最大的 Q ( S t + 1 , a ) , Q\left(S_{t+1}, a\right), Q(St+1,a), 而 S a r s a S a r s a Sarsa 更新 Q Q Q 值的方式依然为某策略 ( ( ( 如 ϵ − g r e e d y \epsilon-g r e e d y ϵ−greedy 策略).
-
Q − Q- Q− learning选取动作和更新 Q Q Q 表值的方法不同,而 S a r s a S a r s a Sarsa 选取动作和更新 Q Q Q 表值的方法相同。
(5) Q − Q- Q− learning每次选取动作和更新 Q Q Q table后就会生成一个 < s , a , r , s ′ > <s, a, r, s^{\prime}> <s,a,r,s′> 序列,成为一个 sample 。 。 。 同理, S a r s a S a r s a Sarsa 每次选取动作和更新 Q Q Q table后会生成另一个 < s , a , r , s ′ > <s, a, r, s^{\prime}> <s,a,r,s′> 序列,成为 另一个sample。
图解
Sarsa
Q-Learning
环境的部分我就不细说了,下面说一说Q-learning和Sarsa在解决这个问题的区别在哪里。
区别在于选择action(当前动作和下一个状态采取的动作)
Q-learning每次使用epsilon-greedy的方法,选择当前状态的action,
在更新Q[state][action]的时候,是使用Q[next_state][next_acion],其中next_action是使Q[next_state][next_action]最大的动作。
然后state=next_state,动作再重新选择,next_acion值用于更新Q值。
Sarsa则不同。使用epsilon-greedy选择next_state的next_action,然后用Q[next_state][next_acion]来更新Q[state][action],更新的时候:
state=next_state, action=next_action
从中就可以看出两个算法的区别,Sarsa是一种on-policy算法,Q-learning是一种off-policy算法。
Sarsa选取的是一种保守的策略,他在更新Q值的时候已经为未来规划好了动作,对错误和死亡比较敏感。而Q-learning每次在更新的时候选取的是最大化Q的方向,而当下一个状态时,再重新选择动作,Q-learning是一种鲁莽、大胆、贪婪的算法,对于死亡和错误并不在乎。
在实际中,如果你比较在乎机器的损害就用一种保守的算法,在训练时,可以减少机器损害的次数。
可以看一下代码的运行结果:
Sarsa:选择的是一条最安全的道路,远离陷阱。
————————————————
版权声明:本文为CSDN博主「赵YN的csdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39004117/article/details/81705845