1 Q-Learning算法简介

1.1 行为准则

我们做很多事情都有自己的行为准则,比如小时候爸妈常说:不写完作业就不准看电视。所以我们在写作业这种状态下,写的好的行为就是继续写作业,知道写完他,我们还可以得到奖励。不好的行为就是没写完就跑去看电视了,被爸妈发现,后果很严重。小时候这种事情做多了,也就变成我们不可磨灭的记忆。这和我们提到的Q-Learning有什么关系呢?原来Q-Learning也是一个决策过程,和小时候的这种情况差不多。我们举例说明。
假设现在我们处于写作业的状态,而且我们以前没有尝试过写作业时看电视,所以现在我们有两种选择:1,继续写作业,2,跑去看电视。以为以前没有被惩罚过,所以我选看电视,然后现在的状态变成了看电视,我又选了看电视,接着我还是看电视,最后爸妈回家,发现我没写完作业就去看电视了,狠狠的惩罚了我一次,我也深刻地记下了这一次的经历,并在我脑海中将“没写完作业去看电视”这种行为更改为负面行为,我们接下来看看Q-Learning根据很多这样的经历是如何决策的。

1.2 Q-Learning决策

假设我们的行为准则已经学习好了,我们现在处于状态s1,我在写作业,我有两个行为a1,a2,分别是看电视和写作业,根据我的经验,在这种s1状态下,a2写作业带来的潜在奖励要比a1看电视高,这里的潜在奖励我们用一个有关于s和a的Q表格代替。在我的记忆Q表格中,Q(s1, a1)=-2要小于Q(s1, a2)=1,所以我们判断要选择a2作为下一个行为。现在我们的状态更新为s2,我们还是有两个同样的选择,重复上面的过程,在行为准则Q表中寻找Q(s2,a1)Q(s2,a2)的值,并比较他们的大小,选取比较大的一个。接着根据a2我们到达s3并在此重复上面的决策过程。Q-Learning的方法就是这样决策的。看完决策我们在来研究一下这张行为准则Q表是通过什么样的方式更改,提升的。

1.3 Q-Learning更新

所以回到之前的流程,根据Q表的估计,因为在s1中,a2的值比较大,通过之前的决策方法,我们在s1采取了a2,并到达s2,这是我们开始更新用于决策的Q表,接着我们并没有在实际中采取任何行为,而是再想象自己在s2上采取了每种行为,分别看看两种行为哪一个的Q值大,比如说Q(s2,a2)的值比Q(s2,a1)的大,所以我们把大的Q(s2,a2)乘上一个衰减值γ(比如是0.9)并加上到达s2时所获取的奖励R(这里我们还没有获取到棒棒糖,所以奖励为0)因为会获取实实在在的奖励R,我们将这个作为我现实中Q(s1,a2)的值,但是我们之前是根据Q表估计Q(s1,a2)的值。所以有了现实和估计值,我们就能更新Q(s1,a2),根据估计与现实的差距,将这个差距乘以一个学习效率α累加上老的Q(s1,a2)的值变成新的值。但时刻记住,我们虽然用maxQ(s2)估算了一下s2的状态,但还没有在s2上做出任何的行为,s2的行为决策要等到更新完了以后再重新另外做。这就是off-policy的Q-Learning是如何决策和学习优化决策的过程。

2 Q-Learning整体算法


上图概括了之前所有的内容。这也是Q-Learning的算法,每次更新我们都用到了Q现实和Q估计,而且Q-Learning的迷人之处就是在Q(s1,a2)现实中,也包含了一个Q(s2)的最大估计值,将对下一步的衰减的最大估计和当前所得到的奖励当成这一步的现实。最后描述一下这套算法中一些参数的意义。ε-greedy是用在决策上的一种策略,比如ε=0.9时,就说明有90%的情况我会按照Q表的最优值选择行为,10%的时间使用随机选行为。α是学习率,来决定这次的误差有多少是要被学习的,α是一个小于1的数。γ是对未来reward的衰减值。我们可以这样想:

重写一下Q(s1)的公式,将Q(s2)拆开,因为Q(s2)可以像Q(s1)一样,是关于Q(s3)的,所以可以写成这样,然后以此类推,不停地这样写下去,最后就能携程这样,可以看出Q(s1)是有关于之后所有的奖励,但这些奖励正在衰减,离s1越远的状态衰减越严重。可以想象Q-Learning的机器人天生近视眼,γ=1时,机器人有了一副合适的眼镜,在s1看到的Q是未来没有任何衰变的奖励,也就是机器人能清清楚楚看到之后所有步的全部价值,但是当γ=0,近视机器人没了眼镜,只能摸到眼前的reward,同样也就只在乎最近的大奖励,如果γ从0变到1,眼镜的度数由浅变深,对远处的价值看得越清楚,所以机器人渐渐变得有远见,不仅仅只看眼前的利益,也为自己的未来着想

3 代码解析

可运行的代码地址如下(免费下载):https://download.csdn.net/download/shoppingend/85186697

3.1 Q-Learning算法更新


上面将的整个算法就是一直不断的更新Q-table里的值,然后再根据新的值来判断要在某个state采取怎样的action。Q-Learning是一个off-policy的算法,因为里面的max action让Q-table的更新可以不基于正在经历的经验(也可以是现在学习着很久以前的经验,甚至是学习他人的经验)。不过本例子我们没有运用到 off-policy,而是把Q-Learning用在了on-policy上,也就是现学现卖,将现在经历的直接当场学习并运用。
下面的代码,我们可以根据上面的图片中的算法对应起来,这就是整个 Q-Learning 最重要的迭代更新部分。

def update():# 学习 100 回合for episode in range(100):# 初始化 state 的观测值observation = env.reset()while True:# 更新可视化环境env.render()# RL 大脑根据 state 的观测值挑选 actionaction = RL.choose_action(str(observation))# 探索者在环境中实施这个 action, 并得到环境返回的下一个 state 观测值, reward 和 done (是否是掉下地狱或者升上天堂)observation_, reward, done = env.step(action)# RL 从这个序列 (state, action, reward, state_) 中学习RL.learn(str(observation), action, reward, str(observation_))# 将下一个 state 的值传到下一次循环observation = observation_# 如果掉下地狱或者升上天堂, 这回合就结束了if done:break# 结束游戏并关闭窗口print('game over')env.destroy()if __name__ == "__main__":# 定义环境 env 和 RL 方式env = Maze()RL = QLearningTable(actions=list(range(env.n_actions)))# 开始可视化环境 envenv.after(100, update)env.mainloop()

3.2 主结构

class QLearningTable:# 初始化def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):# 选行为def choose_action(self, observation):# 学习更新参数def learn(self, s, a, r, s_):# 检测 state 是否存在def check_state_exist(self, state):

3.3 预设值

import numpy as np
import pandas as pdclass QLearningTable:def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):self.actions = actions  # a listself.lr = learning_rate # 学习率self.gamma = reward_decay   # 奖励衰减self.epsilon = e_greedy     # 贪婪度self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)

3.4 决定行为

    def choose_action(self, observation):self.check_state_exist(observation) # 检测本 state 是否在 q_table 中存在(见后面标题内容)# 选择 actionif np.random.uniform() < self.epsilon:  # 选择 Q value 最高的 actionstate_action = self.q_table.loc[observation, :]# 同一个 state, 可能会有多个相同的 Q action value, 所以我们乱序一下action = np.random.choice(state_action[state_action == np.max(state_action)].index)else:   # 随机选择 actionaction = np.random.choice(self.actions)return action

3.5 学习

我们根据是否是terminal state(回合终止符)来判断应该如何更新Q-table。更新的方式:update = self.lr * (q_target - q_predict)
这可以理解成神经网络中的更新方式,学习率 ×(真实值 - 预测值)。将判断的误差传递回去,有着和神经网络更新的异曲同工之妙。

    def learn(self, s, a, r, s_):self.check_state_exist(s_)  # 检测 q_table 中是否存在 s_ (见后面标题内容)q_predict = self.q_table.loc[s, a]if s_ != 'terminal':q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # 下个 state 不是 终止符else:q_target = r  # 下个 state 是终止符self.q_table.loc[s, a] += self.lr * (q_target - q_predict)  # 更新对应的 state-action 值

3.6 检测state是否存在

这个功能就是检测Q-table中有没有当前state的步骤了,如果还没有当前的state,那么我们就插入一组全0数据,当做这个state的所有action初始values。

    def check_state_exist(self, state):if state not in self.q_table.index:# append new state to q tableself.q_table = self.q_table.append(pd.Series([0]*len(self.actions),index=self.q_table.columns,name=state,))

文章来源:莫凡强化学习https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

【强化学习】Q-Learning算法详解相关推荐

  1. 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】

    Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...

  2. 【强化学习】Q-Learning算法详解以及Python实现【80行代码】

    强化学习 在文章正式开始前,请不要被强化学习的tag给吓到了,这也是我之前所遇到的一个困扰.觉得这个东西看上去很高级,需要一个完整的时间段,做详细的学习.相反,强化学习的很多算法是很符合直观思维的. ...

  3. 【强化学习】Actor-Critic算法详解

    https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/6-1-actor-critic/ htt ...

  4. [联邦学习] FedAvg聚合算法详解及代码实现

    该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...

  5. 初学者的强化学习q learning和sarsa

    Reinforcement learning is a fast-moving field. Many companies are realizing the potential of RL. Rec ...

  6. PyTorch 迁移学习 (Transfer Learning) 代码详解

    PyTorch 迁移学习 代码详解 概述 为什么使用迁移学习 更好的结果 节省时间 加载模型 ResNet152 冻层实现 模型初始化 获取需更新参数 训练模型 获取数据 完整代码 概述 迁移学习 ( ...

  7. 直播 | 256核CPU实现每秒一百万帧的Atari!强化学习并行模拟器EnvPool详解

    近日,新加坡Sea AI Lab提出了一个全新的环境模拟并行执行库EnvPool,使用C++的线程池以及异步执行的机制优化了大规模RL环境的并行,能够兼容已有的gym与dm_env API以及几乎所有 ...

  8. 强化学习Q-learning(超详解)

    如何估计Vπ(s)V^{\pi}(s)Vπ(s) Vπ(s)V^{\pi}(s)Vπ(s)代表我们的主体是π\piπ在当前局面sss得分的期望值. Monte-Carlo(MC) based appr ...

  9. OpenCV学习(21) Grabcut算法详解

    grab cut算法是graph cut算法的改进.在理解grab cut算之前,应该学习一下graph cut算法的概念及实现方式. 我搜集了一些graph cut资料:http://yunpan. ...

最新文章

  1. activemq 连接mysql_ActiveMQ 内存配置,ActiveMQ 和mysql
  2. DNS RR字段含义
  3. 北京理工大学 python专题课程-Python语言程序设计
  4. 第96:SVM简介与简单应用
  5. 手把手教你使用Numpy、Matplotlib、Scipy等5个Python库
  6. 使用HTML5开发手机离线应用
  7. 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI
  8. 条件渲染-v-if // v-else // v-else if // v-show
  9. python学习-python学习笔记(一)python简介和基础
  10. 可扩展的通用异常检测系统 EGADS
  11. 拆分工作簿为多个文件_能不能将总表快速拆分为多个工作簿?当然!
  12. 中职学校计算机专业课程设置,中职学校计算机专业课程设置的几点思考
  13. cdr添加节点快捷键_CDR常用快捷键有哪些
  14. 一步步用python制作游戏外挂【转】
  15. appstore app 下载地址
  16. Kylin Linux V10升级gcc操作
  17. 鸿蒙手机会在千元机吗,鸿蒙OS升级计划表曝光,华为千元机也有份!
  18. 打造现代应用的利器,VMware Tanzu显露王者风范 (1)
  19. 项目风险应对策略总结
  20. 极品特效HTML5动画推荐,不看的程序员后悔一辈子

热门文章

  1. 数据结构的六大排序算法详解
  2. UWB 厘米级定位技术全新升级汽车数字钥匙,NXP NCJ29D5 将助力手机无感进出
  3. WinMerge比较时未显示出全部文件
  4. DCB学习之三(CN)
  5. 【Python数据分析】波士顿房价分析小例子
  6. 曾轶可16首原创歌词 小生整理完整版
  7. android的发音功能实现,Android 使用 ToneGenerator 编写按键发声功能
  8. 程序员不同方向入门路线全解
  9. 已解决FutureWarning: The default value of regex will change from True to False in a future version. In
  10. 开源中国iOS客户端学习——(十二)用户登陆