本文为Thomas Simonini增强学习系列文章笔记或读后感,原文可以直接跳转到medium系列文章

主要概念为:

Q-Learning,探讨其概念以及用Numpy实现

我们可以将二维游戏想象成平面格子,每个格子代表一个状态,并且对应了不同的动作,例如下图:

Q函数接收状态和动作两个参数并输出Q值,即在一个状态下各种动作各自未来的期望奖励。公式如下:

这里的未来期望奖励,就是当前状态下一直到结束状态(成功或失败)所获取的奖励。

Q-learning算法伪代码

其中,更新Q值为bellman等式,如下描述:

这篇文章总体来说,非常简单,各种步骤也特别详细,告诉了我们如何计算Q-table的算法过程。但是为什么能迭代到最优,并没有给出一个比较明确的证明过程。主要也是因为采用的EE平衡问题,这个过程采用了greedy episolon的启发式算法,每次直接选取的是最大概率的action,而多次重复episode, 其实计算的是对未来的奖励积累的期望。所以从bellman等式到Q(s, a) state-value function 定义如何连接的呢?推导的公式如下:

Numpy具体实现

# -*- coding: utf-8 -*-

# pkg need
import numpy as np
import gym
import random
import time # step 1. create the environment
env = gym.make("Taxi-v2")
env.render() # tick and run it to see # this game enviroment could be found detail documented at:
# https://gym.openai.com/envs/#toy_text
# pick and drop off the passenger right for -20 points,
# fail for either one will lose 10 points
# every step will decrease 1 points # step 2. create the q-table and initialize it.
state_size = env.observation_space.n
action_size = env.action_space.n
qtable = np.zeros((state_size, action_size))
print("state size: %d, action size: %d" % qtable.shape) # tick and run # step 3. create the hyperparameters
total_episodes = 50000
total_test_episodes = 100
max_steps = 99 learning_rate = 0.7
gamma = 0.618 # exploration parameter
epsilon = 1.0 # exploration rate
max_epsilon = 1.0 # exploration probability at start
min_epsilon = 0.01 # minumum exploration probability
decay_rate = 0.01 # exponential rate to decay exploration rate # step 4. The Q learning algorithm
# 2 For life or until learning is stopped
for episode in range(total_episodes):
# reset the environment
state = env.reset()
step = 0
done = False # start the game
for step in range(max_steps):
# 3 choose an action a in the current world state (s)
# first random a number
ee_tradeoff = random.uniform(0, 1) # exploitation, taking the biggest Q value for this state
if ee_tradeoff > epsilon:
action = np.argmax(qtable[state, :])
else:
action = env.action_space.sample() # exploration, randomly sample a action # take action and observe the outcome
new_state, reward, done, info = env.step(action) # Update the Q(s, a)
qtable[state, action] += learning_rate * (
reward + gamma * np.max(qtable[new_state, :]) - qtable[state, action]) # update state
state = new_state # if done: finish episode
if done:
break # reduce epsilon -> we want less and less exploration
epsilon = min_epsilon + (max_epsilon - min_epsilon) * np.exp(-decay_rate * episode) print(qtable) # use q table to play taxi def play(env, qtable, show=True, sec=None):
state = env.reset()
step = 0
done = False
total_rewards = 0 for step in range(max_steps):
# see agent to play
if show:
env.render()
action = np.argmax(qtable[state, :]) new_state, reward, done, info = env.step(action)
total_rewards += reward if done:
break if sec:
time.sleep(sec) state = new_state
return total_rewards # play one test episode
play(env, qtable) env.reset()
rewards = []
for episode in range(total_test_episodes):
total_rewards = play(env, qtable, show=False)
rewards.append(total_rewards) env.close()
print("Score over time: " + str(sum(rewards) / total_test_episodes))

参考文献:

1. bellman equation to state value function,berkeley的增强学习课程,讲的真详细。

【读书笔记】2_增强学习中的Q-Learning的更多相关文章

  1. 【Deep Learning读书笔记】深度学习中的概率论

    本文首发自公众号:RAIS,期待你的关注. 前言 本系列文章为 <Deep Learning> 读书笔记,可以参看原书一起阅读,效果更佳. 概率论 机器学习中,往往需要大量处理不确定量,或 ...

  2. 剑指offer学习读书笔记--二维数组中的查找

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序.请设计一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有这个整数. 1 2 8 9 2 4 9 1 ...

  3. 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误

    题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...

  4. 《EM-PLANT仿真技术教程》读书笔记(持续更新中)

    1.在系统分析过程中,必须考虑系统所处的环境,因此划分系统与环境的边界是系统分析的首要任务 2.模型可以分为物理模型和数学模型.数学模型可以分为解析模型.逻辑模型.网络模型以及仿真模型.模型可以分为离 ...

  5. linq读书笔记2-查询内存中的对象

    上次我们说到了linq对数组内容的检索,自.net2.0以后,泛型成了很常见的一种应用技术,linq对泛型的检索也提供了完善的支持 如对list类型的支持,范例如下: class Program    ...

  6. [读书笔记] 四、SpringBoot中使用JPA 进行快速CRUD操作

    通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...

  7. [读书笔记] Spring MVC 学习指南 -- 第一章

    控制反转(Inversion of Control, IoC)/ 依赖注入: 比如说,类A依赖于类B,A需要调用B的某一个方法,那么在调用之前,类A必须先获得B的一个示例引用. 通常我们可以在A中写代 ...

  8. 剑指Offer读书笔记(持续更新中)

    (1)定义一个空的类型,里面没有不论什么成员变量和成员函数,对该类型求sizeof,得到的结果是多少? 答案是1.空类型的实例中不包括不论什么信息,本来求sizeof应该是0,可是当我们声明该类型实例 ...

  9. 【读书笔记】iOS-属性中的内存管理参数

    一,assign 代表设置时候直接赋值,而不是复制或者保留它. 二,retain. 会在赋值的时候把新值保留.此属性只能用于Object-C对象类型. 三,copy 在赋值时,将新值复制一份,复制工作 ...

随机推荐

  1. ActiveX控件注册不起作用的解决办法

    公司写了一个ActiveX打印插件.其中一个同事的电脑死活不能用.于是我就上网找办法 这位兄弟写的比较清晰. ActiveX交互时浏览器的设置以及ActiveX控件注册的检测 http://blog. ...

  2. JavaScript:改变 HTML 内容

    使用Javascript来处理HTML元素的内容是非常强大的功能. <!DOCTYPE html><html><head><meta http-equiv=& ...

  3. 仿LordPE获取PE结构

    乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很. 当前只是获取到PE结构并打印,仅此而已. PE.h #pragma once #include <stdio.h> ...

  4. baidu 地图 鼠标移上显示标签 鼠标离开隐藏标签

    为了解决 label太多,文字会重叠看不清 所以提出这种办法 核心代码 1,创建的时候 将label设置为隐藏 2,通过百度地图监听事件 ,  mouseover或onmouseover 触发显示 3 ...

  5. Linux运维一定要知道的六类好习惯和23个教训,避免入坑!

    Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...

  6. thinkphp5 前台模板的引入css,js,images

    一:在公共的静态文件夹中建立我们模块的名称用来放置css,js,images 二:在配置文件config中定义需要的路径 三:在视图页面引入

  7. C语言实例解析精粹学习笔记——35(报数游戏)

    实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...

  8. HASH算法小结

    一.简述 HASH算法的本质是特征提取——将某种不太好表示的特征,通过某种压缩的方式映射成一个值.这样,就可以优雅解决一部分难以解决的特征统计问题. 同时考虑到hash算法的本质是个概率算法,因此并不 ...

  9. kudu是什么

    Apache Kudu Overview 建议配合[Apache Kudo]审阅本文(http://kudu.apache.org/overview.html) 数据模式 Kudo是一个列式存储的用于 ...

  10. 4.HBASE数据迁移方案(之snapshot):

    4.HBASE数据迁移方案:  4.1 Import/Export  4.2 distcp  4.3 CopyTable  4.4 snapshot 快照方式迁移(以USER_info:user_lo ...