莫烦python
Deep-reinforcement-learning-with-pytorch
一:Q learning
qpredict = self.q_table.loc[s, a]
if s != ‘terminal’:
qtarget = r + self.gamma * self.q_table.loc[s, :].max() # next state is not terminal
else:
q_target = r # next state is terminal
self.q_table.loc[s, a] += self.lr * (q_target - q_predict) # update
二:Q learning 与 Sarsa
—off policy && on policy
如果你用的是 Q learning, 你会观看一下在 s2 上选取哪一个动作会带来最大的奖励, 但是在真正要做决定时, 却不一定会选取到那个带来最大奖励的动作, Q-learning 在这一步只是估计了一下接下来的动作值. 而 Sarsa 是实践派, 他说到做到, 在 s2 这一步估算的动作也是接下来要做的动作.
Q learning:(学习时使用的maxa,不一定是下次采取的a)
当前a获得的:observation, reward, done = env.step(action)
没有确定下一个a
learn = qtarget = r + self.gamma * self.q_table.loc[s, :].max()
下一个action = RL.choose_action(str(observation))【choose_action=90%选max() =90%选学习时使用的a】
Sarsa :(学习时使用的 a就是下次采取的 a)
当前a获得的:observation, reward, done = env.step(action)
直接确定下一个action = RL.chooseaction(str(observation))
learn = r + self.gamma * self.qtable.loc[s, a]
下一个action = action 【action =100%选a =100%选学习时使用的a】
三:Sarsa(lambda)-Sarsa改进版
—回合更新 && 单步更新
lambda 是脚步衰减值, 都是一个在 0 和 1 之间的数.
当 lambda 取0, 就变成了 Sarsa 的单步更新, 当 lambda 取 1, 就变成了回合更新, 对所有步更新的力度都是一样. 当 lambda 在 0 和 1 之间, 取值越大, 离宝藏越近的步更新力度越大. 这样我们就不用受限于单步更新的每次只能更新最近的一步, 我们可以更有效率的更新所有相关步了.
#Q table 更新 :不同的地方是我们考虑了 eligibility_trace
self.q_table += self.lr * error * self.eligibility_trace
四:DQN
传统的表格形式的瓶颈:我们使用表格来存储每一个状态 state, 和在这个 state 每个行为 action 所拥有的 Q 值. 而当今问题是在太复杂, 状态可以多到比天上的星星还多(比如下围棋). 在机器学习中, 神经网络对这种事情很在行.
整个算法乍看起来很复杂, 不过我们拆分一下, 就变简单了. 也就是个 Q learning 主框架上加了些装饰.
这些装饰包括:
- 记忆库 (用于重复学习)
- 神经网络计算 Q 值
- 暂时冻结
q_target
参数 (切断相关性)
练习:
1.q_learning、sarsa玩gym游戏
2.dqn改为pytorch
参考
知乎