莫烦python
Deep-reinforcement-learning-with-pytorch

一:Q learning

image.png
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 这一步估算的动作也是接下来要做的动作.
image.png
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】
image.png

三:Sarsa(lambda)-Sarsa改进版

—回合更新 && 单步更新

lambda 是脚步衰减值, 都是一个在 0 和 1 之间的数.
当 lambda 取0, 就变成了 Sarsa 的单步更新, 当 lambda 取 1, 就变成了回合更新, 对所有步更新的力度都是一样. 当 lambda 在 0 和 1 之间, 取值越大, 离宝藏越近的步更新力度越大. 这样我们就不用受限于单步更新的每次只能更新最近的一步, 我们可以更有效率的更新所有相关步了.
image.png

  1. #Q table 更新 :不同的地方是我们考虑了 eligibility_trace
  2. self.q_table += self.lr * error * self.eligibility_trace

image.png

四:DQN

传统的表格形式的瓶颈:我们使用表格来存储每一个状态 state, 和在这个 state 每个行为 action 所拥有的 Q 值. 而当今问题是在太复杂, 状态可以多到比天上的星星还多(比如下围棋). 在机器学习中, 神经网络对这种事情很在行.

image.png
整个算法乍看起来很复杂, 不过我们拆分一下, 就变简单了. 也就是个 Q learning 主框架上加了些装饰.
这些装饰包括:

  • 记忆库 (用于重复学习)
  • 神经网络计算 Q 值
  • 暂时冻结 q_target 参数 (切断相关性)

练习:
1.q_learning、sarsa玩gym游戏
2.dqn改为pytorch

参考
知乎