datawhalechina / easy-rl

强化学习中文教程(蘑菇书🍄),在线阅读地址:https://datawhalechina.github.io/easy-rl/
Other
9.62k stars 1.88k forks source link

/chapter3/chapter3 #38

Open qiwang067 opened 3 years ago

qiwang067 commented 3 years ago

https://datawhalechina.github.io/easy-rl/#/chapter3/chapter3

Description

Voldet commented 3 years ago

在Q-learning: Off-policy TD Control章节,提到了“Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action。这个 action 有可能是 ε-greedy 方法采样出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作,但这是它实际执行的那个动作。”。我想问下,ε-greedy 方法采样出来的值不是就包括了 max Q对应的动作和随机动作吗?

qiwang067 commented 3 years ago

在Q-learning: Off-policy TD Control章节,提到了“Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action。这个 action 有可能是 ε-greedy 方法采样出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作,但这是它实际执行的那个动作。”。我想问下,ε-greedy 方法采样出来的值不是就包括了 max Q对应的动作和随机动作吗?

你可能误解了,这边是指用的策略,可以用 ε-greedy 方法,也可采用 max Q 方法或随机采样方法,这三种策略是并行的。

Voldet commented 3 years ago

在Q-learning: Off-policy TD Control章节,提到了“Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action。这个 action 有可能是 ε-greedy 方法采样出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作,但这是它实际执行的那个动作。”。我想问下,ε-greedy 方法采样出来的值不是就包括了 max Q对应的动作和随机动作吗?

你可能误解了,这边是指用的策略,可以用 ε-greedy 方法,也可采用 max Q 方法或随机采样方法,这三种策略是并行的。

噢噢,理解你的意思了。感谢!

heiheiteng commented 3 years ago

我在实践MonterCarlo和Sarsa代码的过程中,发现了以下几个问题:

johnjim0816 commented 3 years ago

我在实践MonterCarlo和Sarsa代码的过程中,发现了以下几个问题:

  • 在MonterCarlo章节中,train函数中print('Start to eval !')应该换成print('Start to train !')
  • 在Sarsa章节中

    • SarsaConfig中的算法名与环境名有误
    • agent.py中,没有分情况讨论state是否在Q表格的key中,会导致出现新的state时,有Undefined control sequence \epslion1-\epslion的可能选择第一个动作而不是随机
    • 在train函数中,next_state的动作并不是next_action,而是update之后的新的action,这是不是将Sarsa的on-policy变为了off-policy

感谢你的细心指点,MC改了,Sarsa第一点已改,第二点设置了一个defaultdict也就是新的state对应的Q为0,如果还有错误,也麻烦截图一下~,理论上应该可以的,第三点如下: next_action = agent.choose_action(next_state) agent.update(state, action, reward, next_state, next_action,done) 先选取next_action再更新的,不太明白你的意思,可以说得再详细点?

heiheiteng commented 3 years ago

讲义中,Sarsa的的流程我理解是这样的:

1.利用当前策略​,在初始状态S下,选择动作A,得到下一个状态​与奖励R

2.得到下一个状态​与奖励R

3.利用当前策略​,在状态S’,选择下一动作A'

4.利用Q函数的迭代公式更新Q函数

5.把​赋给S,A'赋给A

6.重复上述2~4过程得到最终的结果

但是在代码中流程是这样的:

1.利用当前策略​,在初始状态S下,选择动作A,得到下一个状态​与奖励R

2.利用当前策略​,在状态S’,选择下一动作A'

3.利用Q函数的迭代公式更新Q函数

4.把​赋给S

5.重复上述1~4过程得到最终的结果

也就是说,虽然是先选下一时刻的动作,再更新;但是这个动作是下一时刻肯定会执行的动作,而不应该是根据更新后的策略采样的动作

我不知道我理解的对不对

------------------ 原始邮件 ------------------ 发件人: "datawhalechina/easy-rl" @.>; 发送时间: 2021年7月14日(星期三) 下午5:36 @.>; 抄送: "王腾 @.**@.>; 主题: Re: [datawhalechina/easy-rl] /chapter3/chapter3 (#38)

我在实践MonterCarlo和Sarsa代码的过程中,发现了以下几个问题:

在MonterCarlo章节中,train函数中print('Start to eval !')应该换成print('Start to train !')

在Sarsa章节中

SarsaConfig中的算法名与环境名有误

agent.py中,没有分情况讨论state是否在Q表格的key中,会导致出现新的state时,有Undefined control sequence \epslion1-\epslion的可能选择第一个动作而不是随机

在train函数中,next_state的动作并不是next_action,而是update之后的新的action,这是不是将Sarsa的on-policy变为了off-policy

感谢你的细心指点,MC改了,Sarsa第一点已改,第二点设置了一个defaultdict也就是新的state对应的Q为0,如果还有错误,也麻烦截图一下~,理论上应该可以的,第三点如下“ next_action = agent.choose_action(next_state) agent.update(state, action, reward, next_state, next_action,done) 先选取next_action再更新的,不太明白你的意思,可以说得再详细点?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

johnjim0816 commented 3 years ago

讲义中,Sarsa的的流程我理解是这样的: 1.利用当前策略​,在初始状态S下,选择动作A,得到下一个状态​与奖励R 2.得到下一个状态​与奖励R 3.利用当前策略​,在状态S’,选择下一动作A' 4.利用Q函数的迭代公式更新Q函数 5.把​赋给S,A'赋给A 6.重复上述2~4过程得到最终的结果 但是在代码中流程是这样的: 1.利用当前策略​,在初始状态S下,选择动作A,得到下一个状态​与奖励R 2.利用当前策略​,在状态S’,选择下一动作A' 3.利用Q函数的迭代公式更新Q函数 4.把​赋给S 5.重复上述1~4过程得到最终的结果 也就是说,虽然是先选下一时刻的动作,再更新;但是这个动作是下一时刻肯定会执行的动作,而不应该是根据更新后的策略采样的动作 我不知道我理解的对不对 ------------------ 原始邮件 ------------------ 发件人: "datawhalechina/easy-rl" @.>; 发送时间: 2021年7月14日(星期三) 下午5:36 @.>; 抄送: "王腾 @.**@.>; 主题: Re: [datawhalechina/easy-rl] /chapter3/chapter3 (#38) 我在实践MonterCarlo和Sarsa代码的过程中,发现了以下几个问题: 在MonterCarlo章节中,train函数中print('Start to eval !')应该换成print('Start to train !') 在Sarsa章节中 SarsaConfig中的算法名与环境名有误 agent.py中,没有分情况讨论state是否在Q表格的key中,会导致出现新的state时,有Undefined control sequence \epslion1-\epslion的可能选择第一个动作而不是随机 在train函数中,next_state的动作并不是next_action,而是update之后的新的action,这是不是将Sarsa的on-policy变为了off-policy 感谢你的细心指点,MC改了,Sarsa第一点已改,第二点设置了一个defaultdict也就是新的state对应的Q为0,如果还有错误,也麻烦截图一下~,理论上应该可以的,第三点如下“ next_action = agent.choose_action(next_state) agent.update(state, action, reward, next_state, next_action,done) 先选取next_action再更新的,不太明白你的意思,可以说得再详细点? — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

同学,谢谢你的建议,你的理解是对的,已更正~

Strawberry47 commented 3 years ago

最后一部分,"On-Policy vs. Off-policy",“它只用了一个 policyπ”出现了两遍哦

qiwang067 commented 3 years ago

最后一部分,"On-Policy vs. Off-policy",“它只用了一个 policyπ”出现了两遍哦

感谢您的纠正,错误已修改;

另外,最新版教程可以看我们的pdf版本: https://github.com/datawhalechina/easy-rl/releases

我们后面会慢慢对在线教程进行更新。

ShuhuaGao commented 2 years ago

上面 @johnjim0816 指出的SARSA实现的错误,当前代码并未更新吧?需要PR吗

johnjim0816 commented 2 years ago

上面 @johnjim0816 指出的SARSA实现的错误,当前代码并未更新吧?需要PR吗

谢谢同学提醒,已改~

jzhangCSER01 commented 2 years ago

图 3.32 上面那张图的标号错了,应该是 3.31

qiwang067 commented 2 years ago

@jzhangCSER01 感谢您的纠错,文章已更新 👍

AcademeMaster commented 6 months ago

实验测试结果,Sarsa会考虑安全性,QLearning更加激进。Sarsa 是一个典型的同策略算法,它只用了一个策略 𝜋 π,它不仅使用策略 𝜋 π 学习,还使用策略 𝜋 π 与环境交互产生经验。 如果策略采用 𝜀 ε-贪心算法,它需要兼顾探索,为了兼顾探索和利用,它训练的时候会显得有点“胆小”。它在解决悬崖行走问题的时候,会尽可能地远离悬崖边,确保哪怕自己不小心探索了一点儿,也还是在安全区域内。此外,因为采用的是 𝜀 ε-贪心 算法,策略会不断改变( 𝜀 ε 值会不断变小),所以策略不稳定。

Q学习是一个典型的异策略算法,它有两种策略————目标策略和行为策略,它分离了目标策略与行为策略。Q学习可以大胆地用行为策略探索得到的经验轨迹来优化目标策略,从而更有可能探索到最佳策略。行为策略可以采用 𝜀 ε-贪心 算法,但目标策略采用的是贪心算法,它直接根据行为策略采集到的数据来采用最佳策略,所以 Q学习 不需要兼顾探索。

我们比较一下 Q学习 和 Sarsa 的更新公式,就可以发现 Sarsa 并没有选取最大值的最大化操作。因此,Q学习是一个非常激进的方法,它希望每一步都获得最大的利益;Sarsa 则相对较为保守,它会选择一条相对安全的迭代路线。

Woodman3 commented 4 months ago

图3.25是不是错了,应该是(s_t,a_t)没有出现在前面的序列中。

qiwang067 commented 4 months ago

图3.25是不是错了,应该是(s_t,a_t)没有出现在前面的序列中。

@Woodman3 没错的~

codercmh commented 1 week ago

请问TD(n)就是指n步时序差分吗,那么TD(0)和TD(1)分别代表什么呢?都是一步时序差分?