Q-learning是強化學習中一種經典的無監督學習方法,通過與環境交互來指導學習;
大部分強化學習都是基於馬爾科夫決策(MDP)的。MDP是一個框架,而Q學習是應用了這種框架的一個具體的學習方法。
Q學習的四要素:(agent,狀態 s,動作 a,獎勵 r)
簡而言之,agent從當前狀態選擇一個動作,轉移至一個新的狀態,這個過程會獲得一個即時獎勵 r,agent再據此更新動作值函數Q,並將Q值儲存在Q表中。
這里關鍵的有一個即時獎勵矩陣R,和一個存儲動作值函數值的Q表;兩個表都是二維,行表示狀態,列表示動作;
Q學習中的Q值更新函數(其實基於MDP中的值函數):
α:學習速率; γ:折扣因子 ,表示對未來獎勵的重視程度;
不過我個人而言,常用α=1的情況,因為α的值對於算法對比和優化的效果差別不大(在迭代次數足夠多的情況下);
一下這個小例子用的是動態規划的方法迭代計算Q,因為模型已知;模型未知的情況常采用蒙特卡洛算法 & 時序差分算法(TD,常用);
簡單的一個迷宮例子就是這個走迷宮了~從任意狀態開始,走到房間5就算成功了~
python實現Q學習走迷宮:
1 # an example for maze using qlearning, two dimension 2 import numpy as np 3 4 # reward matrix R 5 R = np.array([[-1, -1, -1, -1, 0, -1], [-1, -1, -1, 0, -1, 100], 6 [-1, -1, -1, 0, -1, -1], [-1, 0, 0, -1, 0, -1], 7 [0, -1, -1, 0, -1, 100], [-1, 0, -1, -1, 0, 100]]) 8 9 Q = np.zeros((6, 6), float) 10 gamma = 0.8 # discount factor 11 12 episode = 0 13 while episode < 1000: 14 state = np.random.randint(0, 6) # from a random start state 15 for action in range(6): 16 if R[state, action] > -1: 17 Q[state, action] = R[state, action] + gamma*max(Q[action]) # this time, action is the next state 18 episode = episode + 1 19 20 print(Q)