強化學習(Reinforcement Learning) — 案例分析 CartPole-v1

John Hu
No silver bullet
Published in
6 min readJul 17, 2020
CartPole-v1 遊戲畫面

上次我們討論了Reinforcement Learning 運作流程,這次我們用 OpenAI Gym 裡的一個遊戲來進行學習。OpenAI Gym 裡面有很多設計好的遊戲跟問題,他們都非常適合做 AI 的練習。同時,他們也都實作常見的 Reinforcement Learning 遊戲環境(env)的 API 界面,對我們初學者來說是個很好的開始。

如果大家還沒有看過我們之前的Reinforcement Learning 運作流程的話,建議大家先看過,會比較知道這篇的各項參數跟名詞。

遊戲分析

CartPole v1 是 OpenAI Gym 裡面的一個挑戰,它的目的是確保車上的一個已經傾倒的柱不會倒下。所以它有下面的幾個參數:

State — 遊戲輸出

  • 車子的位置 — 值域:-4.8 ~ 4.8
  • 車子的加速度 — 值域:-Inf ~ Inf
  • 柱子對車子的角度 — 值域:-24 deg~ 24 deg
  • 柱子倒下的加速度 — 值域:-Inf ~ Inf

Action— 遊戲輸入

  • 0:向左推動
  • 1:向右推動

Rewards — 每個 step 評分方式

  • 結束:0 分
  • 活著:1 分

終止條件

  • 柱子對車子的角度 > 12 deg
  • 柱子對車子的角度 < -12 deg
  • 車子位置 > 2.4
  • 車子位置 < -2.4
  • 執行 500 次

程式設計

由於這是第一次執行訓練,我們將採用最簡單的設定來訓練:

1. Init env & agent

本次訓練的模型

遊戲分析可以得知下面的參數:

  • state_size: 4
  • action_size: 2

我們這次使用了最簡單的模型:

sequential model:

input(4) ->
dense(24) ->
dense(24) ->
dense(output=2)

2. Check if end of training

訓練終止條件:

  • 遊戲次數(episodes):10,000

3. Reset env

僅呼叫 CartPole 的 reset,並未做其他特別處理。

4. Check if end of game

單局遊戲停止條件:

  • 如果 env 的 done 回傳值是 True 就停止。

5. Check if exploring phase

使用最簡單的 Uniform Random 來判斷 exploring phase:

  • 初始 exploration_rate:1
  • 每個 Step 後衰退exploration_decay:0.995
  • 保障最小值 exploration_rate_min:0.01

6. Random choose action

進到 exploring phase 時,我們以採等比例方式,隨機選取 action。

7. Predict action with state

我們僅將 CartPole 的 state 給如 model,並沒任何轉換。

  • learning_rate:0.001

8. Execution action

僅呼叫 CartPole 的 step,並取得 rewarddone、跟 next_state

9. Step training

不進行 step training。

10. Pack training data

直接儲存,不做資料轉換。

  • memory_size:2,000

11. Batch training

當記憶資料過多時,採隨機選取。且使用單一模型進行預測與學習。

  • gamma:0.95
  • training_batch_size:32

12. Update exploration rate

exploration_rate 乘以 exploration_decay 的結果當成新的 exploration_rate

訓練成果

數值

我們把訓練 10,000 局遊戲的分數畫出來後,可以得到下面的線圖:

每一局的分數

我們仔細看可以發現,用這麼簡單的模型,第一次拿到滿分 500 的時間點在第 422 局。可是,我們的模型並不會永遠都是滿分,後面的成績會開始下降。

由於分數的分佈過度混亂,每 500 筆資料做 sliding window 後,我們可以得到 9,501 筆的最大、最小、跟平均。同時,每 500 局由滿分的情況,所以,下面的線圖都不畫出最大值:

平均、最小、跟標準差

平均、最小、跟標準差的線圖中,我們可以看到變準差在一開始的時候漲的到快 200,此時,平均也一起長高。在過了快 5,000 的時候,由開始收斂的情況,平均跟標準差開始下降,最低值開始上升。爲了確認最低也有跟著變化,我們把這張線圖的 Y 軸刻度轉成對數尺度,可以得到下面這張圖:

採用對數尺度

對數尺度的線圖中,可以從趨勢現發現,平均、標準差、跟最小正在開始收斂。這代表著,我們訓練 10,000 次並不夠。

觀察

  • 如果目標是拿到 500 分,小的模型在前期就可以達到。
  • RL 的訓練中,似乎我們要以最低分或是標準差爲 Benchmark 來看訓練的結果。因爲,平均的表現還是由相當的不穩定性。
  • 訓練 10,000 次並不足夠。

我們有把這次訓練的模型和每局的分數放在:Google Drive,大家可以下載回去後,在接着跑訓練。說不定大家可以得到更好的結果。

未來想法

這個系列我們還是會持續下去,同時,我們會加入更多的變異。未來,時間許可下,我們會作出下面幾個實驗:

  • 相同設定跑滿 100,000 次
  • Learning rate 改成 0.1、0.01、0.0001;
  • 修改評分標準
  • 改用大一點的模型 Dense(1024) -> Dense(1024)、深一點的模型 Dense(24) -> Dense(24) -> … -> Dense(24)、又大又深的模型 Dense(1024) -> Dense(1024) -> … -> Dense(1024);
  • 開啓邊玩邊學、開啓邊玩邊學跟玩完在學;
  • 採用雙模型訓練模式;
  • 採用單一模型改成批量訓練而非單筆單筆 fit;
  • 以小模型的成果來當成大模型 exploring phase 的引導,而非隨機。

--

--