動作價值函式

使用 Python 的 Gymnasium 進行強化學習

Fouad Trad

Machine Learning Engineer

動作價值函式(Q-values)

  • 期望報酬:
    • 從狀態 $s$ 開始
    • 執行動作 $a$
    • 依循策略
  • 估計各狀態中動作的優劣

用公式計算狀態與動作的 q_value:Q(s,a) 為執行動作後的即時報酬,加上依特定策略計算的新狀態折現價值之和。

使用 Python 的 Gymnasium 進行強化學習

格狀世界

顯示包含兩座山與鑽石的自訂環境圖片。

  • 狀態價值

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

Q-values-狀態 4

顯示代理人在狀態 4 的圖片。

  • 代理人出生於狀態 4

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

Q-values-狀態 4

顯示代理人在狀態 4 可做的 4 個動作與其報酬。

  • 代理人可向上、下、左、右移動

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

狀態 4-動作 down

顯示代理人從狀態 4 向下移動至狀態 7。

  • 報酬:-2,狀態價值:5

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

狀態 4-動作 down

顯示代理人從狀態 4 向下到狀態 7,對應的 q-value 為 3。

  • $Q(4, \text{down}) = -2 + 1 \times 5 = 3$

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

狀態 4-動作 left

顯示代理人從狀態 4 向左到狀態 3,對應的 q-value 為 1。

  • $Q(4, \text{left}) = -1 + 1 \times 2 = 1$

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

狀態 4-動作 up

顯示代理人從狀態 4 向上到狀態 1,對應的 q-value 為 7。

  • $Q(4, \text{up}) = -1 + 1 \times 8 = 7$

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

狀態 4-動作 right

顯示代理人從狀態 4 向右到狀態 5,對應的 q-value 為 9。

  • $Q(4, \text{right}) = -1 + 1 \times 10 = 9$

顯示先前為所有狀態計算的狀態價值。

使用 Python 的 Gymnasium 進行強化學習

所有 Q-values

顯示為所有狀態-動作組合計算出的 q-value。

使用 Python 的 Gymnasium 進行強化學習

計算 Q-values

def compute_q_value(state, action):

if state == terminal_state: return None
_, next_state, reward, _ = env.unwrapped.P[state][action][0] return reward + gamma * compute_state_value(next_state)

用公式計算狀態與動作的 q_value:Q(s,a) 為執行動作後的即時報酬,加上依特定策略計算的新狀態折現價值之和。

使用 Python 的 Gymnasium 進行強化學習

計算 Q-values

Q = {(state, action): compute_q_value(state, action)
     for state in range(num_states) 
     for action in range(num_actions)}

print(Q)
使用 Python 的 Gymnasium 進行強化學習

計算 Q-values

{(0, 0): 0, (0, 1): 1, (0, 2): 7, (0, 3): 0, 
 (1, 0): 0, (1, 1): 5, (1, 2): 8, (1, 3): 7, 
 (2, 0): 7, (2, 1): 9, (2, 2): 8, (2, 3): 8, 
 (3, 0): 1, (3, 1): 2, (3, 2): 5, (3, 3): 0, 
 (4, 0): 1, (4, 1): 3, (4, 2): 9, (4, 3): 7, 
 (5, 0): 5, (5, 1): 10, (5, 2): 9, (5, 3): 8, 
 (6, 0): 2, (6, 1): 2, (6, 2): 3, (6, 3): 1, 
 (7, 0): 2, (7, 1): 3, (7, 2): 10, (7, 3): 5, 
 (8, 0): None, (8, 1): None, (8, 2): None, (8, 3): None}

顯示為所有狀態-動作組合計算出的 q-value。

使用 Python 的 Gymnasium 進行強化學習

改進策略

顯示為所有狀態-動作組合計算出的 q-value。

使用 Python 的 Gymnasium 進行強化學習

改進策略

  • 對每個狀態選取 Q-value 最高的動作

顯示所有狀態-動作的 q-value,並圈出每個狀態的最大值。

使用 Python 的 Gymnasium 進行強化學習

改進策略

顯示舊策略及其對應的 Q-values 舊策略

顯示採用導向最大 q-value 動作後的新策略。

使用 Python 的 Gymnasium 進行強化學習

改進策略

improved_policy = {}


for state in range(num_states-1): max_action = max(range(num_actions), key=lambda action: Q[(state, action)])
improved_policy[state] = max_action
print(improved_policy)
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 1, 
 6: 2, 7: 2}
使用 Python 的 Gymnasium 進行強化學習

一起來練習吧!

使用 Python 的 Gymnasium 進行強化學習

Preparing Video For Download...