強化學習(Reinforcement Learning) — 案例分析 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
: 4action_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,並取得 reward
、done
、跟 next_state
。
9. Step training
不進行 step training。
10. Pack training data
直接儲存,不做資料轉換。
memory_size
:2,000
11. Batch training
當記憶資料過多時,採隨機選取。且使用單一模型進行預測與學習。
gamma
:0.95training_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 的引導,而非隨機。