蒙地卡羅方法

使用 Python 的 Gymnasium 進行強化學習

Fouad Trad

Machine Learning Engineer

回顧:基於模型的學習

 

  • 依賴已知的環境動態
  • 不與環境互動

顯示前一支影片中政策反覆與價值反覆演算法示意圖的圖片。

使用 Python 的 Gymnasium 進行強化學習

無模型學習

 

  • 不依賴環境動態的知識
  • 智能體會與環境互動
  • 透過嘗試錯誤學得政策
  • 較適合真實應用

機器人與西洋棋環境互動的圖片。

使用 Python 的 Gymnasium 進行強化學習

蒙地卡羅方法

  • 無模型技術
  • 依回合估計 Q 值

顯示一次收集到的回合骨架:狀態、動作、報酬與回報的圖片。

使用 Python 的 Gymnasium 進行強化學習

蒙地卡羅方法

  • 無模型技術
  • 依回合估計 Q 值

顯示估計 Q 值第二步與 Q 表外觀的圖片,列數等於狀態數、欄數等於動作數。

使用 Python 的 Gymnasium 進行強化學習

蒙地卡羅方法

  • 無模型技術
  • 依回合估計 Q 值

顯示導出最適政策最後一步的圖片,將每個狀態對應到最適動作。

  • 兩種方法:first-visitevery-visit
使用 Python 的 Gymnasium 進行強化學習

自訂方格世界

自訂方格世界:2 列 3 行共 6 個狀態,從左上角(0)到右下角(5)編號。智能體在狀態 3,山在狀態 4,目標在狀態 5。

使用 Python 的 Gymnasium 進行強化學習

收集兩個回合

第一個回合的狀態、動作、報酬與回報。

第二個回合的狀態、動作、報酬與回報。

使用 Python 的 Gymnasium 進行強化學習

估計 Q 值

兩個回合所收集的狀態、動作、報酬與回報。

  • Q 表:儲存 Q 值的表格

需要填入數值的空白 Q 表。

使用 Python 的 Gymnasium 進行強化學習

Q(4, left)、Q(4, up)、Q(1, down)

兩個回合中(4, left)、(4, up)、(1, down)被標示的狀態、動作、報酬與回報。

  • (s,a)出現一次 → 直接填回報

Q 表中(4, left)、(4, up)、(1, down)的數值已填入。

使用 Python 的 Gymnasium 進行強化學習

Q(4, right)

兩個回合中(4, right)在兩次皆被標示的狀態、動作、報酬與回報。

  • 每回合(s,a)各出現一次 → 取平均

Q 表中(4, right)的數值以兩回合回報的平均填入。

使用 Python 的 Gymnasium 進行強化學習

Q(3, right)-first-visit 蒙地卡羅

兩個回合中(3, right)僅標示第一次出現的位置之狀態、動作、報酬與回報。

  • 取回合內首次造訪(s,a)的平均

Q 表中(3, right)的數值以標示列(首次出現)的回報平均填入。

使用 Python 的 Gymnasium 進行強化學習

Q(3, right)-every-visit 蒙地卡羅

兩個回合中(3, right)每次出現都被標示之狀態、動作、報酬與回報。

  • 取回合內每次造訪(s,a)的平均

Q 表中(3, right)的數值以所有出現列的回報平均填入。

使用 Python 的 Gymnasium 進行強化學習

產生一個回合

def generate_episode():
    episode = []
    state, info = env.reset()

terminated = False while not terminated: action = env.action_space.sample()
next_state, reward, terminated, truncated, info = env.step(action)
episode.append((state, action, reward)) state = next_state
return episode
使用 Python 的 Gymnasium 進行強化學習

First-visit 蒙地卡羅

def first_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))

for i in range(num_episodes): episode = generate_episode() visited_states_actions = set()
for j, (state, action, reward) in enumerate(episode):
if (state, action) not in visited_states:
returns_sum[state, action] += sum([x[2] for x in episode[j:]])
returns_count[state, action] += 1 visited_states_actions.add((state, action))
nonzero_counts = returns_count != 0
Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts] return Q
使用 Python 的 Gymnasium 進行強化學習

Every-visit 蒙地卡羅

def every_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))    

    for i in range(num_episodes):
        episode = generate_episode()  

        for j, (state, action, reward) in enumerate(episode):

            returns_sum[state, action] += sum([x[2] for x in episode[j:]])
            returns_count[state, action] += 1


    nonzero_counts = returns_count != 0
    Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts]
    return Q
使用 Python 的 Gymnasium 進行強化學習

取得最適政策

def get_policy():
    policy = {state: np.argmax(Q[state]) for state in range(num_states)}    
    return policy
使用 Python 的 Gymnasium 進行強化學習

整合結果

Q = first_visit_mc(1000)

policy_first_visit = get_policy()
print("First-visit policy: \n", policy_first_visit)
Q = every_visit_mc(1000)
policy_every_visit = get_policy()
print("Every-visit policy: \n", policy_every_visit)
First-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

Every-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

顯示最適政策:每個狀態對應的最適動作(箭頭)的圖片。

使用 Python 的 Gymnasium 進行強化學習

一起來練習吧!

使用 Python 的 Gymnasium 進行強化學習

Preparing Video For Download...