q更新公式:
∈-greedy策略
在q learning的更新過程中,每一步都要根據當前的state以及q函式確定乙個合適的行動action。這裡有乙個如何平衡「經驗」和「探索」的問題。如果完全按照經驗行動,即每次都在q(state, :)中選擇對應值最大的action,那麼很有可能一直侷限在已有經驗中,難以發現更具價值的新的行為。但如果智慧型體只專注於探索新的行為,即完全隨機地行動,又可能因為大多數行動都沒有價值,導致學習q函式的速度很慢。
一種比較簡單的平衡「經驗」和「探索」的方法是採用∈-greedy策略選擇合適的行動。事先設定乙個較小的∈值(如∈=0.1),智慧型體有1-∈的概率根據學習到的q函式(已有經驗)行動,剩下∈的概率智慧型體會隨機行動,用於探索新的經驗。例如,∈=0.1時,在90%的情況下,智慧型體直接選擇使得q(state, action)最大的action,剩下10%的情況,隨機選擇乙個action。
off-policy和on-policy
強化學習中的方法可以分為off-policy和on-policy兩類。q learning演算法是乙個經典的off-policy方法,而sarsa演算法則是on-policy方法。那麼,如何理解這裡的off-policy和on-policy呢?
在q learning中,q函式的更新和q[new_state, :].max()有關。在q[new_state, :]中選出使得q函式最大的動作,以此來更新q函式。設這個動作為max_action。注意,智慧型體實際有可能並不會執行max_action。因為在下乙個過程中是根據epsilon-greedy方法來選擇策略的,有可能選擇max_action,也有可能並不會選到max_action。而sarsa演算法則不同,它用q[new_state, new_action]結合獎勵等資訊更新q函式。之後,在下一次迴圈時,智慧型體必然會執行new_action。
說q learning是一種off-policy演算法,是指它在更新q函式時使用的動作(max_action)可能並不會被智慧型體用到。又稱sarsa是一種on-policy方法,是指它在更新q函式時使用的動作(new_action)一定會被智慧型體所採用。這也是on-policy方法和off-policy方法的主要區別。
相比q learning演算法,sarsa演算法更「膽小」。q learning演算法會使用q[new_state, :].max()來更新q值,換句話說,它考慮的是新狀態下可以獲得的最大獎勵,而不去考慮新狀態會帶來的風險。因此,q learning演算法會更加的激進。相比之下,sarsa演算法只是使用q[new_state, new_action]來更新q值。在此處的迷宮問題中,sarsa演算法會考慮到接近陷阱可能帶來的負收益,因此更傾向於待在原地不動,從而更加難以找到「寶藏」.
from __future__ import print_function
import numpy as np
import time
from env import env
epsilon = 0.1
alpha = 0.1
gamma = 0.9
max_step = 30
np.random.seed(0)
def epsilon_greedy(q, state):
if (np.random.uniform() > 1 - epsilon) or ((q[state, :] == 0).all()):
action = np.random.randint(0, 4) # 0~3
else:
action = q[state, :].argmax()
return action
e = env()
q = np.zeros((e.state_num, 4))
for i in range(200):
e = env()
while (e.is_end is false) and (e.step < max_step):
action = epsilon_greedy(q, e.present_state)
state = e.present_state
reward = e.interact(action)
new_state = e.present_state
q[state, action] = (1 - alpha) * q[state, action] + \
alpha * (reward + gamma * q[new_state, :].max())
e.print_map()
time.sleep(0.1)
print('episode:', i, 'total step:', e.step, 'total reward:', e.total_reward)
time.sleep(2)
from __future__ import print_function
import numpy as np
import time
from env import env
epsilon = 0.1
alpha = 0.1
gamma = 0.9
max_step = 50
np.random.seed(1)
def epsilon_greedy(q, state):
if (np.random.uniform() > 1 - epsilon) or ((q[state, :] == 0).all()):
action = np.random.randint(0, 4) # 0~3
else:
action = q[state, :].argmax()
return action
e = env()
q = np.zeros((e.state_num, 4))
for i in range(200):
e = env()
action = epsilon_greedy(q, e.present_state)
while (e.is_end is false) and (e.step < max_step):
state = e.present_state
reward = e.interact(action)
new_state = e.present_state
new_action = epsilon_greedy(q, e.present_state)
q[state, action] = (1 - alpha) * q[state, action] + \
alpha * (reward + gamma * q[new_state, new_action])
action = new_action
e.print_map()
time.sleep(0.1)
print('episode:', i, 'total step:', e.step, 'total reward:', e.total_reward)
time.sleep(2)
Q learning和Sarsa的區別
因此對於sarsa來說 1.在狀態s 時,就知道了要採取哪個a 並真的採取了這個動作。2.動作a的選取遵循e greedy策略,目標q值的計算也是根據 e greedy 策略得到的動作a 計算得來,因此為on policy學習。選擇下個動作的存在探索的可能性 而對於q learning來說 只會選擇...
SARSA與Q learning的區別
sarsa與q learning的區別 sarsa 的整個迴圈都將是在乙個路徑上,也就是 on policy,下乙個 state 和下乙個 action 將會變成他真正採取的 action 和 state.和 qlearning 的不同之處就在這.qlearning 的下個乙個 state acti...
強化學習Sarsa
演算法如下 相比q learning而言,sarsa會比較膽小,不希望自己掉進陷阱裡,從而做出的決策都比較謹慎 而q learning會選擇一條雖然比較危險但是可以成功的道路 off policy class qlearningtable rl def init self,actions,learn...