许久没有更新重新拾起,献于小白
这次介绍的是强化学习 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有更深入的了解
欢迎大家一起学习共同提高,
独乐乐不如众乐乐 ^_^