强化学习是什么?

简单来说就是通过感知周围环境而行动,以取得最大化收益的一个过程。
其中Q-learning算法的感知状态为离散,无规律。

华丽的分割线---------------------------------------------------------------------------

一. 组成

首先介绍一下强化学习最重要的几个部分:
智能体(agent):可以是一个简单的算法,通常输入为state,输出为policy(规则)
状态集(states): 为智能体的输入
动作集(actions):智能体的动作,比如左右移动
奖励(rewards): 环境根据智能体的动作 反馈回来的一个奖惩信号,可以为正奖励也可以为负奖励
环境(environment): 接收智能体的动作action,回馈reward和state

华丽的分割线---------------------------------------------------------------------------

二.结构

结构简图如下:
这张图表示:智能体agent对环境environment执行一个动作action后,环境接收动作并把当前状态state和奖励reward回馈给智能体;然后智能体agent根据环境返回的状态和奖赏执行下一个动作.

华丽的分割线------------------------------------------------------------------------------------

三. 相关概念

强化学习依据马尔代夫决策过程,智能体的探索(exploration)是向环境发散的,其探索过程不是直接选择,而是随机选择;开发过程(exploitation)则是选择最优解。 马尔达夫决策过程:你下一步的行动与决策取决于你当前状态的行动与决策。


那么怎么理解强化学习呢, 举个例子:
首先你是一个生活在一维平面内的婴儿,也就是智能体agent,你饿了,想吃东西。但你妈站在距离你6米远的地方,你必须找到你妈才能吃到东西(即寻宝过程)。
你只能左右上下移动(这里简化为左右移动),每次只能移动一米,你的移动就是动作action,而你妈刚好站在你右边6米。你所处的位置就是你的输入states。
这时候开始找你妈,往左边移动了一米即你发生了action, 但是与你妈更远了,你妈大喊:“乖宝宝,怎么还不过来呀,你走错啦,真笨”;当你往右移动一米,你妈说:“真聪明”,这时候“真笨”和“真聪明”这两个词恰好你听懂了,放进了心里,也就是reward负奖励和正奖励。
最终你通过不断左右左右移动,来到了你妈这里并吃上了热乎的食物,整个过程就是训练你的过程,也就是训练agent的过程。

华丽的分割线-----------------------------------------------------------------------------------------

四.推导

Q-learning是强化学习中的一种算法,Q即为Q(steat,action)就是在某一时刻的 s 状态下(s∈S),采取 动作action (action∈A)动作能够获得收益的期望,也就是行为值value。该算法的主要思想就是将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。Q是一个列表,我一般当矩阵看,当然实际中由于探索过程的发散,这个表将很大很大,因此需要将表做成神经网络来储存,也就是深度强化学习(DQN),当然这是后话。

直接看一下伪代码:

图是拿来的,所以不是很清晰。
倒数第三行可以看出是贝尔曼函数,即回报累积的过程。也就是更新公式,学习公式。
Q(St,At)表示当前状态的Q表, α表示学习率,Rt+1表示当前奖励,这玩意表示奖励递减率乘以最大Q,加上Rt+1后即为TD目标。

这玩意表示偏差,称为为TD偏差。

这个公式总体解释就是 新Q(s,a)=老Q+学习率*偏差
华丽的分割线----------------------------------------------------------------------------------------------
五. 举例说明(附代码)
-u—T: 看一下这个符号,一共6个字符。有没有想到什么,对如之前所说的,你额你妈距离6米,u是你,T是你妈,即宝藏的位置,你只能左右左右移动,慢慢找到她。

  1. 引入这三个库

    2.设置重要的三个参数

    3.定义你当前的状态与环境
  2. 定义你行动之后,下一状态的状态函数
  3. 定义当前状态的合法动作集合

    总源码如下:(每一步都有笔者自己写的注释)
# 作者:是最强的冰哥
#强化学习 Q—learning算法
# -u---T u是你的位置,T是你的最终目标import pandas as pd
import random
import time#首先设置参数
want = 0.9 #设置你的渴望即贪婪率
efficiency = 0.1 #学习效率
reward_decrease = 0.8 #奖励递减值# 定义你目前所处的状态(位置)和环境
states = range(6) #设置状态集0-6 即你距离你妈6个步长
actions = ['left','right'] #设置动作集,一维只有两个方向,即向左和向右
rewards = [0, 0, 0, 0, 0, 1] #设置奖励集, 即第6位时你爬到你妈那里时,才给你奖励Q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states],index = states,columns = actions)# 创建一个表格
# DataFrame函数创建一个表格,index为行,这里用状态集赋值;columns为列,这里用动作集赋值;Q为某一时刻下状态state中采取动作action能获得收益的期望,即行为值# 定义环境更新函数,实时更新且打印状态
def updata_environment(state): #global states #状态设为全局变量,可以整个环境内引用environment = list('-----T') #环境设为一个6字符长的字符串if state != states[-1]: #如果不在最后一个位置environment[state] = 'u' #确定你所处的位置print('\r{}'.format(''.join(environment)), end='')#打印time.sleep(0.1)#调用线程推迟执行该函数0.1S#你动作之后,定义下一状态函数
def get_next_state(state, action):global states# left,right,none = -1,+1,0if action == 'right' and state != states[-1]: #如果你不在最后一个位置,则向你妈移动一位next_state = state +1elif action == 'left' and state != states[0]: #如果你不在最开始的一个位置,则远离你妈移动一位(elif表示否则如果,如果if步骤执行成功,那么elif步骤就不会执行)next_state = state -1  #如果if和elif都判断失败,则执行else语句else:next_state = state #否则+0,就是你没动的意思return next_state #把下一状态值返回带出#定义当前状态下合法的动作集合函数
def get_vaild_actions(state):global actionsvaild_actions = set(actions)if state == states[-1]: # 如果你在最后一个位置vaild_actions -= set(['right'])  #则不能再向右了if state == states[0]: #如果你在最初的位置vaild_actions -= set(['left'])  #则不能再向左了return list(vaild_actions) #把当前状态值返回带出为一个列表格式for i in range(13):  #i在0-13内依次取值,这里的i是episode,即从action开始到结束的一个过程current_state = 0 #设置Q估计表内的状态位置为0# current_state = random.choice(states)updata_environment(current_state) #与绑定环境相关total_steps = 0while current_state != states[-1]:# 创建一个循环,直到你到达最后一个位置,这里是重复状态动作的执行if (random.uniform(0,1) > want) or ((Q_table.loc[current_state] == 0).all()): #random.uniform(0,1)表示在0-1内随机生成一个随机数,loc通过行/列标签索引到状态矩阵,(iloc通过行/列号索引矩阵这里没用到),all()表示索引到的状态矩阵与0的比对结果再作一次与运算current_action = random.choice(get_vaild_actions(current_state)) #random.choice可以从定义()里随机选取内容,并将选取结果放入赋值中返回# 该if语句意思为:如果你的渴望(贪婪)小于这个随机数或者索引到的估计状态为0,则你目前探索到的状态是正确的行动else:current_action = Q_table.loc[current_state].idxmax()#否则利用你的渴望逼近正确的行动,idmax()表示索引最大值next_state = get_next_state(current_state,current_action) #调用你下一动作后的状态函数,与估计到的正确状态和动作绑定next_state_Q_values = Q_table.loc[next_state,get_vaild_actions(next_state)] # 得到现实QQ_table.loc[current_state, current_action] += efficiency*(rewards[next_state] + reward_decrease*next_state_Q_values.max() - Q_table.loc[current_state,current_action]) #根据贝尔曼方程更新Q,Q为某一时刻下状态state中采取动作action能获得收益的期望,Q_table.loc[current_state,current_action]为估计的Qcurrent_state = next_stateupdata_environment(current_state) #更新环境total_steps += 1 #总步骤加1print('\rEpisode {}: total_steps = {}'.format(i, total_steps), end='')time.sleep(2)print('\r                                                   ',end='')print('\nQ_table:')
print(Q_table)

跑一下:

u在左右左右移动

最终生成状态表

最后重点提一下Q的更新公式:
λ奖励衰变值对Q函数的影响,λ越接近于1代表它越有远见会着重考虑后续状态的的价值,当λ接近0的时候就会变得近视只考虑当前的利益的影响。所以越接近1,算法就会越来越会考虑后续回报reward的影响。

python强化学习之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. 强化学习(二):Q learning 算法

    强化学习(一):基础知识 强化学习(二):Q learning算法 Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action ...

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

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

  6. Python 强化学习实用指南:1~5

    原文:Hands-On Reinforcement Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后 ...

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

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

  8. 自动驾驶前沿综述:基于深度强化学习的自动驾驶算法

    ©作者 | 陈道明 学校 | 布里斯托尔大学 研究方向 | 自动驾驶方向 这是 21 年的一篇综述文章,可以算得上是最前沿的自动驾驶技术综述.这几年随着深度表征学习的发展,强化学习领域也得到了加强.本 ...

  9. 强化学习(RL)算法

    ​​​​​目录 文章目录 前言 一.什么是强化学习? 二.强化学习的基本元素 1.环境Environment 2.主体Agent 3.状态State 4.行动Action 5.收益Reward 三,R ...

最新文章

  1. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf
  2. 可爱的特殊字符集收集
  3. Hyperledger Fabric区块链工具configtxgen配置configtx.yaml
  4. 北妈是谁、谁是北妈?他为何如此帅?
  5. Mysql 数字类型转换函数
  6. 好消息:Dubbo Spring Boot要来了
  7. c语言高精度计算函数库
  8. Android O后台服务限制总结
  9. linux 中文字体 推荐,适合阅读的中文字体
  10. 罗永浩直播带货卖了1.1亿,更高级的自我认知【附直播卖货商业计划书PPT】
  11. 在Mac电脑中忘记管理员密码了如何处理?如何安全的管理自己的密码?
  12. 族谱软件系统的使用介绍
  13. C语言 枚举——熄灯问题
  14. 试问甘心从年少轻狂到一事无成吗?
  15. js实现html图片翻页效果,原生JS实现图片翻书效果
  16. rhce考试试题以及答案_RHCE考试题
  17. word统计纯汉字字数
  18. 日本电产尼得科Nidec研发出超薄直线振动马达
  19. selenium爬堆糖网壁纸
  20. 东西方企业运营的根深蒂固的差异

热门文章

  1. rundll32.exe的用途
  2. 普通计算机怎么改闹铃的音乐,怎么设置闹钟铃声为自己喜欢的音乐
  3. MATLAB实现离散系统Z域分析
  4. Leaflet使用介绍
  5. 二进制安装Kubernetes 单集群
  6. TextView 中文本内容换行
  7. 音频转文字软件有哪些?推荐几个录音转文字工具
  8. 软件项目管理2:开发日志,测试单
  9. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法
  10. tomcat注册windows服务-歪解