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

John Hu
No silver bullet
Published in
6 min readJan 13, 2021

這是睽違已久的第二個案例分析。老實說,最近我們花比較少時間在這個主題上。這一篇的內容其實在去年 10 月的時候,我們就已經成果完成遊戲了。最近,終於有時間可以把在這篇完成:

遊戲分析

Acrobot 有兩個轉軸加兩個柱子組成,整個遊戲的目的是將下面的柱子的尖端甩到上面的橫線之上(請見本篇的主要圖片)。透過遊戲分析,我們可以得到的資料跟操作如下:

State — 遊戲輸出

Acrobot 一共會給我們 6 個狀態:

  1. 第一個(上面)柱子的 cos(角度) 的數值:-1 ~ 1
  2. 第一個(上面)柱子的 sin(角度) 的數值:-1 ~ 1
  3. 第二個(下面)柱子的 cos(角度) 的數值:-1 ~ 1
  4. 第二個(下面)柱子的 sin(角度) 的數值:-1 ~ 1
  5. 第一個(上面)柱子的角加速度:-4pi ~ 4pi
  6. 第二個(下面)柱子的角加速度:-9pi ~ 9pi

Action — 遊戲輸入

Acrobot 會接收的輸入分別是,當值是:

  • 0: 往第二個柱子施加 -1 的力道 (可以當成往左推一下)
  • 1: 不做任何事
  • 2: 往第二個柱子施加 1 的力道 (可以當成往右推一下)

Rewards — 每個 step 評分方式

標準上,Acrobot 的評分標準很簡單,就是:

  • 0: -cos(s[0]) - cos(s[1] + s[0]) > 1 (第二個柱子的端點過 1 的位置,也就是圖上畫的那條線)
  • -1: 其他

終止條件

終止條件有兩個:

  • Reward 是 0
  • 玩超過 500 步

程式設計

和 CartPole 的玩法類似,我們還是使用加權評分的方式:對重要的參數進行加權來完成這個遊戲:

1. Init env & agent

Acrobot 使用的模型

與 CartPole 相同,我們只是使用最簡單的 model 來完成這個遊戲。

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

  • state_size: 6
  • action_size: 3

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

input(6) -> dense(24) -> dense(24) -> dense(output=3)

2. Check if end of training

訓練終止條件:

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

3. Reset env

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

4. Check if end of game

單局遊戲停止條件:

  • 與遊戲的終止條件相連結

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

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

  • learning_rate:0.001

8. Execution action

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

在這一步中,我們將遊戲的 reward 換成 abs(next_state[4]) 也就是第一個柱子轉速的絕對值當成新的 reward

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

訓練成果

這個遊戲我們記錄下來的成績是在第幾步的時候過關,所以,我們等一下在看數值的時候,越低代表成績越好。

遊戲原始資料
每 500 回合的移動平均線:平均、標準差、最小值。

觀察

  • 這個模型在第 40 回合的時候第一次完成任務、
  • 最小可以在 62 步完成任務、
  • 大約在第 3,000 多回合的時候,進到一個訓練完成的狀態、
  • 之後由於 over-training 導致成績再度分歧。

未來想法

針對 over-training 的問題,我們其實可以試看看下面的方式:

  • 修改 batch training 的條件能在單局得到好成績後,選擇要不要進行訓練。
  • 修改 end of training 條件能在連續得到好成績後,自動停止訓練。

針對整個遊戲的改進,我們可以試看看下面的方式:

  • 加入更多的演算法:Double DQN、Dueling DQN。
  • 調整 reward 的加權方式
  • 調整其他的參數。

程式與其他檔案

大家如果有興趣想要從新執行一次這個測試,或是修改部份程式碼的話,可以到這邊找到:https://github.com/john-hu/rl,同時可以輸入下面的指令執行起來:

python -m rl.main --game acrobot_reward --model small --config rl/cfgs/simple.json --agent simple --display yes

我們這次測試的輸出跟模型可以在這邊找到:Google drive。如果要載入之前訓練的模型,可以在程式的目錄中建立一個 weights 的資料夾,把想要的權重檔( h5)改成 Acrobot-v1-rewarded.h5 就可以了。

最後別忘了,小弟也是剛開始學習 Reinforcement Leaning,如果有什麼地方值得改進的,還請各位大大在下面留言區給小弟建議。

--

--