許久沒有更新重新拾起,獻於小白
這次介紹的是強化學習 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有更深入的了解
歡迎大家一起學習共同提高,
獨樂樂不如眾樂樂 ^_^