注:该系列文章为学习笔记,欢迎指正!

文章目录

前言

一、Q-learning

1. FrozenLake 环境

2.Q-Learning的简单实现

二、Q-Table Learning 代码实现

1. 调用FrozenLake 环境

2.Q-Table Learning 算法代码实现

3.Q-Table Learning 整体代码

三、Q-Learning with Neural Networks

1.Q-network Learning简单实现

2. 拟合 Q 迭代 算法

3.Q-network Learning代码实现(Tensorflow)


前言

大家听说的可以玩 Atari 游戏的 Deep Q-Networks 是 Q-Learning 算法的更大、更复杂的实现。所以在学习DQN之前,我们需要对Q-learning有一定的了解。本篇文章将从 基于 Table 的 Q-Learning 和 基于神经网络的 Q-Learning 两方面了解Q-Learning。

一、Q-learning

概述:Q-learning为一种针对表格环境的表格方法 。

与试图学习如何通过函数定义将观察值直接映射到动作的策略梯度方法不同,Q-Learning 试图学习处于给定状态(State)的价值(Value),并在那里采取特定的动作(action)。 虽然这两种方法最终都是学习如何在特定情况下让智能体(Agent)在特定情况下采取明智的行动,但采取行动的方式却大不相同。 我们将通过一个简单的实现来讲解 Q-Learning 算法。

1. FrozenLake 环境

我们通过 OpenAI gym 构建 FrozenLake 环境来模拟 Q-learning 算法的交互环境。OpenAI gym 为我们提供了一系列用于训练agent的简单环境。FrozenLake 环境由一个 4x4 的块网格组成,分别为起始块、目标块、安全的冻结块以及一个危险的悬崖。其目标是让 agent 学会从起点安全的到达目标,而不会掉入悬崖。在任何给定时间,agent可以选择向上、向下、向左或向右移动。环境中还设置了一阵风,其目的是偶尔将 agent 吹到他们没有选择的网格上。因此,每次都完美的实现目标是不可能的,但训练 agent 避开悬崖并达到目标是可行的。环境中设置每一步的奖励都是 0,达到目标设置奖励为1 。因此,我们需要一个学习长期预期汇报的算法。而 Q-learning 就是这样的一个算法。FrozenLake 环境的规则如图1所示。

图1  FrozenLake 环境的规则

2.Q-Learning的简单实现

在最简单的实现中,Q-Learning 是环境中可能的每个状态(行)和动作(列)的值表。 在表格的每个单元格中,我们学习在给定状态下采取各个给定动作的价值。 在 FrozenLake 环境的情况下,我们有 16 种可能的状态(每个块一个)和 4 种可能的动作(四个运动方向)。 我们首先将一个 16x4 的 Q 值表格初始化为统一的(全为零),然后通过观察采取不同动作获得的奖励,我们相应地更新表格。使用贝尔曼方程来更新我们的 Q 表,贝尔曼方程证明给定动作的预期长期奖励等于当前动作的即时奖励加上在接下状态采取的最佳未来动作的预期奖励。贝尔曼方程的等式如下所示:

其中 是 s,a 为状态,动作的一般表示, 为折扣标量(衰减因子),其决定未来可能的奖励与当前奖励相比的重要性。 通过以这种方式更新,该表开始慢慢获得在给定状态下给定动作的预期未来奖励的准确度量。 折扣变量允许我们决定未来可能的奖励与当前奖励相比的重要性。 通过以这种方式更新,该表开始慢慢获得在给定状态下给定动作的预期未来奖励的准确度量。

注:贝尔曼方程(Bellman equation)和马尔科夫决策过程(MDPs)是强化学习的基础,大家应有所了解。

二、Q-Table Learning 代码实现

1. 调用FrozenLake 环境

代码如下:

import gym
env = gym.make('FrozenLake-v1')

2.Q-Table Learning 算法代码实现

代码如下:

#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):#Reset environment and get first new observations = env.reset()rAll = 0d = Falsej = 0#The Q-Table learning algorithmwhile j < 99:j+=1#Choose an action by greedily (with noise) picking from Q tablea = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))#Get new state and reward from environments1,r,d,_ = env.step(a)#Update Q-Table with new knowledgeQ[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])rAll += rs = s1if d == True:break#jList.append(j)rList.append(rAll)

3.Q-Table Learning 整体代码

代码如下:

import gym
import numpy as np
env = gym.make('FrozenLake-v1')#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):#Reset environment and get first new observations = env.reset()rAll = 0d = Falsej = 0#The Q-Table learning algorithmwhile j < 99:j+=1#Choose an action by greedily (with noise) picking from Q tablea = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))#Get new state and reward from environments1,r,d,_ = env.step(a)#Update Q-Table with new knowledgeQ[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])rAll += rs = s1if d == True:break#jList.append(j)rList.append(rAll)
print "Score over time: " +  str(sum(rList)/num_episodes)
print "Final Q-Table Values"
print Q

三、Q-Learning with Neural Networks

构建一个简单的 Q 表是比较简单的,但任何游戏或者现实世界中的环境的状态数量几乎无限大,使用表格的方法表示 Q 函数处理大规模数据空间(如原始像素输入)的任务时将十分低效,处理具有连续数据的控制任务更是几乎不可能。针对以上问题,结合神经网络是Q-Learning被提出。其通过神经网络充当函数逼近器,可以将任意数量的可能状态表示为向量,并学习如何将成向量映射成 Q 值。


1.Q-network Learning简单实现

还是以 FrozenLake 环境模拟 Q-network Learning 的交互环境,使用一层神经网络将状态表示为 one-hot 编码向量 (1x16),并生成一个包含 4 个 Q 值的向量来表示动作。与 Q-Table Learning 不同,Q-network Learning 可以轻松地通过添加层、激活函数和不同的输入类型来扩展神经网络实现大规模状态空间的表示。更新方法也略有不同,Q-network Learning 使用大家熟悉的深度学习中的反向传播和损失函数进行更新。Q-network Learning 使用参数  进行函数拟合,更新公式如下:

其中 L 代表 loss,如均方误差。

2. 拟合 Q 迭代算法

3.Q-network Learning代码实现(Tensorflow)

代码如下:

import gym
import numpy as np
import random
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
from tensorflow.python.framework import ops
ops.reset_default_graph()#函数用于清除默认图形堆栈并重置全局默认图形。 #These lines establish the feed-forward part of the network used to choose actions
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
inputs1 = tf.placeholder(shape=[1,16],dtype=tf.float32)
W = tf.Variable(tf.random_uniform([16,4],0,0.01))
Qout = tf.matmul(inputs1,W)
predict = tf.argmax(Qout,1)#Below we obtain the loss by taking the sum of squares difference between the target and prediction Q values.
nextQ = tf.placeholder(shape=[1,4],dtype=tf.float32)
loss = tf.reduce_sum(tf.square(nextQ - Qout))
trainer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
updateModel = trainer.minimize(loss)#Training the network
nit = tf.initialize_all_variables()# Set learning parameters
y = .99
e = 0.1
num_episodes = 2000
#create lists to contain total rewards and steps per episode
jList = []
rList = []
with tf.Session() as sess:sess.run(init)for i in range(num_episodes):#Reset environment and get first new observations = env.reset()rAll = 0d = Falsej = 0#The Q-Networkwhile j < 99:j+=1#Choose an action by greedily (with e chance of random action) from the Q-networka,allQ = sess.run([predict,Qout],feed_dict={inputs1:np.identity(16)[s:s+1]})if np.random.rand(1) < e:a[0] = env.action_space.sample()#Get new state and reward from environments1,r,d,_ = env.step(a[0])#Obtain the Q' values by feeding the new state through our networkQ1 = sess.run(Qout,feed_dict={inputs1:np.identity(16)[s1:s1+1]})#Obtain maxQ' and set our target value for chosen action.maxQ1 = np.max(Q1)targetQ = allQtargetQ[0,a[0]] = r + y*maxQ1#Train our network using target and predicted Q values_,W1 = sess.run([updateModel,W],feed_dict={inputs1:np.identity(16)[s:s+1],nextQ:targetQ})rAll += rs = s1if d == True:#Reduce chance of random action as we train the model.e = 1./((i/50) + 10)breakjList.append(j)rList.append(rAll)
print "Percent of succesful episodes: " + str(sum(rList)/num_episodes) + "%"

注:下一篇更新DQN

使用tensorflow进行简单的强化学习 1—Q-learning相关推荐

  1. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(简单迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(简单迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  2. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(复杂迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  3. mdp框架_强化学习中q learning和MDP的区别是什么?

    MDP通常是指一种用转移概率描述连续不确定概率过程的数学框架,是强化学习中最基础的概念,很多强化学习的算法都是在把问题抽象为一个MDP之后再想办法求解的. 而q-learning是求解强化学习问题的算 ...

  4. python——实现简单的强化学习

    文章目录 强化学习 Q-Learning算法 代码实现 算法参数 状态集 动作集 奖励集 Q table Q-learning算法实现 更新状态 完整代码 强化学习 强化学习(Reinforcemen ...

  5. Q学习(Q learning) 强化学习

    Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化_Morty 的挖坑记录-CSDN博客 强化学习(MATLAB) - 叮叮当当sunny - 博客园

  6. 学习笔记|强化学习(Reinforcement Learning, RL)——让AlphaGo进化得比人类更强

    文章目录 1. 题外话:人类棋手的最后赞礼 2. 强化学习概述 2.1 强化学习的目标也是要找一个Function 2.2 强化学习的三个基本步骤 2.2.1 定义一个function 2.2.2 定 ...

  7. 强化学习(Reinforcement learning)综述

    文章目录 Reinforcement learning 综述 强化学习的分类 环境(Model-free,Model-based) Based(Policy-Based RL & Value- ...

  8. 强化学习(Reinforcement Learning)是什么?强化学习(Reinforcement Learning)和常规的监督学习以及无监督学习有哪些不同?

    强化学习(Reinforcement Learning)是什么?强化学习(Reinforcement Learning)和常规的监督学习以及无监督学习有哪些不同? 目录

  9. 强化学习之Q学习与SARSA

    ** Q学习路径规划与SARSA法路径规划 ** Q学习与SARSA学习简介 强化学习的历史可以用两条各自独立但丰富多彩的主线来追溯..一条主线聚焦 于研究最优化控制,以及使用价值函数动态规划等算法来 ...

最新文章

  1. qt designer启动后不显示界面问题的原因与解决办法
  2. 晨读打卡(2018.1)
  3. ubuntu下安装拼音输入法ibus
  4. 容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额
  5. 字符串查找strpos()函数用法
  6. 使用 Redis 实现自动补全功能
  7. RabbitMQ 消息队列
  8. Delphi多媒体设计之TMediaPlayer组件(三)
  9. 重复insmod同一个模块导致段错误
  10. 从单张图重建三维人体模型综述(五)
  11. Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装GPT磁盘。
  12. 计算机显示时区怎么更改,电脑时区自动改怎么办
  13. 【数据结构/leetcode】背包问题部分代码
  14. 华为机试真题 Python 实现【不含 101 的数】【2022.11 Q4新题】
  15. SHELL对接国际验证码接口
  16. 解决无法打开B站网页问题
  17. javascript检查移动设备是否支持重力方向感应
  18. java附魔_给你的Swagger文档换套附魔皮肤吧
  19. stc8a--mpu6050---dmp--x角度,y角度。z旋转角度不准确,缺少前面矫准环节程序。。
  20. 软工之404 Note Found团队

热门文章

  1. oracle arm服务器_Oracle和ARM合作优化嵌入式Java
  2. 我的世界java1.15更新了什么动物_我的世界:原来1.15版本的更新“主题”不是蜜蜂,而是这些东西?...
  3. 全新的Lync 2013为我们带来了什么?
  4. 超简单的对接第三方API的微信支付(jsapi)。
  5. Oracle中的TIMESTAMP类型解读(TIMESTAMP存储格式)
  6. kubeadm快速部署一套K8S集群
  7. nginx笔记1:nginx指令与上下文
  8. 2011年10月买到Incredible S G11山寨,大家警惕!
  9. 数据库候选关键词怎么求_数据库中主键、主码、主属性、关键字、候选关键字、码的区别...
  10. mysql候选关键字_MySQL(三)之SQL语句分类、基本操作、三大范式