強化學(xué)習(xí)的作用在于通過當(dāng)前的環(huán)境做出相應(yīng)的action,得到最大的value
如TensorFlow實戰(zhàn)中的例子:
在5x5的游戲棋盤中,藍色的代表人物。綠色的代表獎勵。紅色的代表懲罰。人物可以選擇向上,下,左,右,四個方向行走,每走到綠色位置加10,紅色位置-10,其余位置不加也不減。我們針對這個原則來制定最佳的行走方案來使獎勵最多。
我們可以把整個Q-learning的學(xué)習(xí)工程寫成下面的這個式子:
即當(dāng)前環(huán)境下某位置的價值Q可以通過原來的Q和下一步能走的位置的最大值之間進行計算后訓(xùn)練獲得。
通俗來講,我們知道某一個位置是綠色,它的價值就會比較大,相同地,它的上,下,左,右,方向的四個位置,由于靠近綠色位置,所以價值也會比普通位置大。
紅色附近的位置,由于靠近紅色位置,價值也會比一般位置小。
而相同的,都是綠色,如圖中第一行的綠色位置由于靠近兩個紅色,所以比較起來第三行的綠色位置,由于附近還有綠色位置。前者的價值將會小得多。
為了求出價值Q,我們首先根據(jù)每個位置的價值初始化矩陣 ,將初始矩陣都設(shè)置為0,reward矩陣設(shè)為:
[[-10,10,-10,0,0],
[0,0,0,0,10],
[0,0,0,0 ,0],
[10,0,0,0,0],
[0,10,0,0,0]]
α為0.01,γ為0.8,進行訓(xùn)練。
import numpy as np
GAMMA = 0.8
ALPHA = 0.01
num_steps = 10000
SIZE = 5
R = np.asarray([[-10, 10, -10, 0, 0],
[0, 0, 0, 0, 10],
[0, 0, 0, 0, 0],
[10, 0, 0, 0, 0],
[0, 10, 0, 0, 0]])
Q = np.zeros([SIZE, SIZE], np.float32)
def getMaxQ(statex, statey):
state = []
if statex > 0:
state.append(Q[statex-1, statey])
if statey > 0:
state.append(Q[statex, statey-1])
if statex < SIZE-1:
state.append(Q[statex+1, statey])
if statey < SIZE-1:
state.append(Q[statex, statey+1])
return max(state[:])
def QLearning():
for statex in range(SIZE):
for statey in range(SIZE):
Q[statex, statey] = (1-ALPHA)*Q[statex, statey] + ALPHA* (R[statex, statey]+GAMMA * getMaxQ(statex, statey))
count = 0
while count < num_steps:
QLearning()
count += 1
print(Q)
得到Q值矩陣:
[[ 12.22179413 27.77730179 12.22179413 17.77730179 22.22174644]
[ 17.77730179 22.22174644 17.77730179 22.22174644 27.77730179]
[ 22.22174644 17.77730179 14.22179413 17.77730179 22.22174644]
[ 27.77730179 22.22174644 17.77730179 14.22179413 17.77730179]
[ 22.22174644 27.77730179 22.22174644 17.77730179 14.22179413]]
有了期望獲取的最大價值Q,我們的最佳策略就是站在每一個state下,選擇Q值最高的action來執(zhí)行。