强化学习Q-learning

强化学习方法汇总

分类方法

不理解环境(Model-free RL): 没有任何先验感受,只是在不断地尝试中进行反馈理解

  • Q-learning
  • Sarsa
  • Policy Gradients

理解环境(Model-based RL): 建立模型模拟现实世界的反馈,从而对虚拟世界进行反馈

  • 和Model-free的有相似之处,只不过是多了一个建模
  • 根据想象来预判实际情况,从而根据最好的情况来选择下一步的动作(alpha go)

基于概率(Policy-based RL): 根据感官来判断下一步行动的概率,每种动作都可能被选中
优点是在连续的情况下可以利用概率分布的情况

  • Policy Gradients

基于价值(Value-based RL): 根据感官来选择下一步价值最高的行动

  • Q-learning
  • Sarsa

通过结合概率和价值的两个方法,得出Actor-Critic方法,actor表示agent的动作,而critic是对做出动作进行打分

回合更新(Monte-Carlo update): 从游戏开始到结束,然后再对每个转折点进行更新

  • 基础版Policy Gradients
  • Monte-Carlo Learning

单步更新(Temporal-Difference update): 游戏的每一步都在更新,边玩边学习

  • Q-learning
  • Sarsa
  • 升级版Policy Gradients

在线学习(On-Policy): 必须是本人学习

  • Sarsa
  • Sarsa( λ \lambda )

离线学习(Off-Policy): 可以选择看着别人学习从而自己学习,可以不是同步学习

  • Q-learning
  • Deep Q Network

Q Learning

在这里插入图片描述

  1. 其中比较重要的一点就是 Q ( s 1 , a 2 ) Q(s_1,a_2) 的现实值中后面的 m a x a Q ( s , a ) max_{a'}Q(s',a') 为最佳 Q ( s 2 ) Q(s_2) 的最大估计,也是Q-learning中比较著名的一点
  2. α \alpha 为<1的值,叫做学习效率,决定误差有多少将被学习; γ \gamma 为学习折扣,对未来奖励的衰减值,即当 γ \gamma 为0~1之间时,机器人将变得有远见

代码实现参考github链接
部分截图如下,最终Q表如下:

Maze二维迷宫的Q-learning应用

在这里插入图片描述

  1. Q-learning的标准代码格式,可以和gym做结合
    for episode in range(100):
            # 对环境做初始化
            observation = env.reset()
    
            while True:
                # 更新环境内容
                env.render()
    
                # RL基于环境做出动作选择
                action = RL.choose_action(str(observation))
    
                # RL经过下一步,计算得到下一个环境,得到反馈值,如果进入黑洞或者抵达目的地就返回done
                observation_, reward, done = env.step(action)
    
                # RL根据现在的环境进行学习,包括动作,反馈,环境
                RL.learn(str(observation), action, reward, str(observation_))
    
                # 更新环境
                observation = observation_
    
                # break while loop when end of this episode
                if done:
                    break
    
        # end of game
        print('game over')
        env.destroy()
    
  2. 上述代码的学习方法和之前的基础算法有点儿类似,其中比较重要的一点改变就是,如果其中有两个大小相同的概率去选择不同的动作那么就需要对相同的动作进行随机选择
     # some actions may have the same value, randomly choose on in these actions
                action = np.random.choice(state_action[state_action == np.max(state_action)].index)
    
  3. 还多了一个检查是否重复的操作,如果没有这个state那么就需要将新的state添加到现在的Q-table中
    def check_state_exist(self, state):
        if state not in self.q_table.index:
            # append new state to q table
            self.q_table = self.q_table.append(
                pd.Series(
                    [0]*len(self.actions),
                    index=self.q_table.columns,
                    name=state,
                )
            )
    

猜你喜欢

转载自blog.csdn.net/JasonSparrow_1/article/details/86742922