許久沒有更新從新拾起,獻於小白算法
此次介紹的是強化學習 Q-learning,Q-learning也是離線學習的一種dom
關於Q-learning的算法詳情看 傳送門
學習
下文中咱們會用openai gym來作演示spa
q-learning的僞代碼先看這部分,很重要code
簡單的算法語言描述就是orm
開始執行任務:blog
隨機選擇一個初始動做遊戲
執行這些動做ip
若未達到目標狀態,則執行一下幾步get
在當前狀態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表的更新方式爲 學習率 * (真實值 - 預測值) 將判斷偏差傳遞回去 以此來進行學習
對應算法部位爲
以上就是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有更深刻的瞭解
歡迎你們一塊兒學習共同提升,
獨樂樂不如衆樂樂 ^_^