我的Github:   Github

强化学习之Q-learning ^_^

许久没有更新重新拾起,献于小白

 

这次介绍的是强化学习  Q-learning,Q-learning也是离线学习的一种

关于Q-learning的算法详情看 传送门

下文中我们会用openai gym来做演示

 简要

q-learning的伪代码先看这部分,很重要

 

简单的算法语言描述就是

开始执行任务:

  随机选择一个初始动作

  执行这些动作

  若未达到目标状态,则执行一下几步

    在当前状态s所有可能的行为中选择一个a

    利用a得到下一个状态s_

    计算Q(s,a) (对当前的行为进行学习)

    下一个状态等于当前状态

    开始下一个循环

 

 

有重要的几个参数,GAMMA(gamma 是对未来 reward(分数) 的衰减值),ALPHA(学习率),EPSILON(策略)

GAMMA是什么意思呢,就是对获取过的奖励为了防止再次获取后得到的分数一样,于是对reward进行一个衰减,这样就会有长远的眼光,机器人就不只专注于眼前的奖励了

EPSILON 是一种策略,0.8代表的意思就是我们有80%的概率来选择之前的经验剩下的20%的概率来进行新的探索

 

游戏开始

首先我们初始化环境

import numpy as np
import gym

GAME = 'FrozenLake-v0'
env = gym.make(GAME)

MAX_STEPS=env.spec.timestep_limit
EPSILON=0.8
GAMMA=0.8
ALPHA=0.01
q_table=np.zeros([16,4],dtype=np.float32)

q_table就是Q-Learning的Q表了,里面有所有我们进行学习的经验,程序的动作选择都是从Q表中选择

 

def action_choise(obervation):
    if np.random.uniform()<EPSILON:
        action=np.argmax(q_table[obervation])
    else:
        action=env.action_space.sample()
    return action

上面代码为策略选择,80%的概率总Q表中选择最优策略,20%的概率进行随机操作

 

 

 

def learn(state,action,reward,obervation):
    q_table[state][action]+=ALPHA*(reward+GAMMA*max(q_table[obervation])-q_table[state,action])

此部分为学习部分,重要部分用红线标示出来了

Q表的更新方式为   学习率 * (真实值 - 预测值)  将判断误差传递回去 以此来进行学习

 对应算法部位为

 

GAME OVER

以上就是Q-learning的简单介绍

下面是全部的代码

 1 import numpy as np
 2 import gym
 3 
 4 GAME = 'FrozenLake-v0'
 5 env = gym.make(GAME)
 6 
 7 MAX_STEPS=env.spec.timestep_limit
 8 EPSILON=0.8
 9 GAMMA=0.8
10 ALPHA=0.01
11 q_table=np.zeros([16,4],dtype=np.float32)
12 
13 def action_choise(obervation):
14     if np.random.uniform()<EPSILON:
15         action=np.argmax(q_table[obervation])
16     else:
17         action=env.action_space.sample()
18     return action
19 
20 def learn(state,action,reward,obervation):
21     q_table[state][action]+=ALPHA*(reward+GAMMA*max(q_table[obervation])-q_table[state,action])
22 
23 
24 SCORE=0
25 for exp in xrange(10000):
26     obervation=env.reset()
27     EPSILON+=0.001
28     for i in xrange(MAX_STEPS):
29         # env.render()
30         action=action_choise(obervation)          #动作选择
31         obervation_,reward,done,info=env.step(action)    #学习
32         SCORE+=reward
33         if reward==0:
34             if done:
35                 reward=-1
36             else:
37                 reward=-0.001
38         learn(obervation,action,reward,obervation_)
39         obervation=obervation_
40         if done:
41             break
42     print 'esp,score (%d,%d)'%(exp,SCORE)
43 print 'score is %d'%SCORE

 

 

大家把Q表的信息打印出来,断点执行一下,相信会对Q-learning有更深入的了解

欢迎大家一起学习共同提高,

独乐乐不如众乐乐 ^_^

posted @ 2018-01-10 15:10  寂夜云  阅读(5715)  评论(0编辑  收藏  举报