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

John Hu
No silver bullet
Published in
8 min readSep 18, 2020

開始看這篇的結果分析之前,如果大家還沒看過 CartPole-v1案例分析 的話,記得先去看一下,才能知道這篇略過的東西喔!

接續原本 CartPole-v1案例分析,我們列出了一些 TODO List,這篇的目的是:【修改評分標準】 + 【改用不同大小的模型】。

TLDR;

  • 修改評分標準確實有用,我們將評分標準有原先的成功失敗,改變爲距離失敗的倒數分之一:1. 離中心的距離、2. 柱子的角度。
  • 改用模型大小目前看起來沒有用處,從我們看到的範例跟實驗來看,輸入參數少的模型,本身的模型大小就不需要太大(這部分還需要經過更多的實驗來確立)

程式設計

我們僅討論不一樣的地方,其他的部份大家參考 CartPole-v1案例分析

1. Init env & agent

在這次的實驗中,我們將模型改成下面四種的比較:small、wide、deep、跟 large:

Small model and Wide model 的大小:左圖爲 Small model 右圖爲 Wide model
Deep model and Large model的大小:左圖爲 Deep model、右圖爲 Large model

其中的 small 就是原本的模型,這四個模型的大小分別是 Small: 2 x 24、Wide: 2 x 1024、Deep: 16 x 24、 Large: 16 x 1024。

8. Execution action

原本,這個步驟是執行 CartPole 的 step,再將 rewarddone、跟 next_state 送出。由於單純修改模型的情況下,我們並不能得到明確的結果,我們在這個步驟中將 reward 與 執行前的 state 連結:

new_reward = [2.4 - ABS(Cart.Position)] + [12/pi - ABS(Pole.Angle)]

其中的 Cart.Poisitonstate 中的第一個參數(state[0]);Pole.Anglestate 中的第三個參數(state[2])。大家可能會覺得爲什麼要用 state,而不是 next_state。經過我們測試,兩個的效果並沒有太大的差別。我們初步的看法是,由於這個問題是個簡單的小問題,本身前後的因果關係很強,所以兩者並不會有太大差異。

訓練成果

我們一樣採用 500 個資料點的移動平均線、最小線、及標準差進行分析跟比較。

由於我們的 exploration rate 一開始是設定成 1,且每次的訓練是 0.995 衰退,所以大約會在 920 次的時候,會小於 0.01,也就是大部分的決定都是由訓練成果來決定。

Small model — 修改評分前後

Small model 在修改評分前後的表現都還算是不錯,尤其是在修改評分標準後,他可以在第 3,000 次左右達到最小分數接近 300 分的高分,而且在這個的同時,標準差也很低。

其中兩者在大約第 4,000 次左右,分數開始下降,而且在修改評分標準的模型下,它的標準差開始大幅提高。我們認爲這部分已經開始進入 over-fitting 的狀態。另一方面,我們也有試過,如果我們修改程式在連續拿到高分後,就停止訓練,模型的成果將會是最好的。

左圖爲使用 small model 進行 10,000 次訓練;右圖爲使用 small model + 修改評分進行 10,000 次訓練

Wide model — 修改評分前後

使用 wide model 的情況下,我們發現不修改評分標準的情況下有在開始使用 model 後緩步上升,最高在第 7,000 的時候,但是,同時標準差也跟着一起提高,這代表這個模型的穩定性並不理想。修改評分標準後,我們發現情況比較好,最高分在第 2,000 次,但是之後的分數也右緩步上升的情況。

本質上,當一個模型越大,我們需要訓練的次數也會越多,雖然在之前的文章分析中,我們再訓練下去可能沒有成果,但是醬糊小弟認爲, wide model + 修改評分標準的模型如果可以繼續訓練下去,應該會有 small model + 修改評分標準的成績。這部分,醬糊小弟也會找機會試試看。

左圖爲使用 wide model 進行 10,000 次訓練;右圖爲使用 wide model + 修改評分進行 10,000 次訓練

Deep model — 修改評分前後

Deep model 中最特別的一點是平均、標準差在沒有修改評分標準的模型下,有一個最高點發生在第 3,000 次左右,可是平均分數也只有 75 分左右。在修改評分標準的情況下,完全沒有任何的反應,分數穩定的在 8, 9, 10 分之間遊走。

左圖爲使用 deep model 進行 10,000 次訓練;右圖爲使用 deep model + 修改評分進行 10,000 次訓練

Large model — 修改評分前後

Large model 更是誇張,完全沒有任何的成果,分數穩定的在 8, 9, 10 分之間遊走。

左圖爲使用 large model 進行 10,000 次訓練;右圖爲使用 large model + 修改評分進行 10,000 次訓練

混合比較

我們接下來是把全部的平均跟標準差跟最小值放在一起來看,但是由於 deep 跟 large 的情況太差(下圖左),所以,我們就不把他們放在圖上了。

每種模型的平均分佈圖:左圖爲全部,右圖爲 small and wide

以平均來看,修改 reward 的方式都是比較好的結果,而且,在 wide 的模型下,修改 reward 的方式還有緩步向上的狀態。若我們加上標準差來看,真正比較好的結果是 small reward 在第 2,800 左右的時候,平均最高,而且標準差最小,而且,wide reward 在後期的標準差也開始緩步向上。

Small 和 wide 的標準差(左)跟最小值(右)的比較

程式與其他檔案

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

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

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

總結

這次的實驗中我們確定了下面幾個項目:

  • 在已知的情況下,將輸入產生與評分標做適當的連結,可以加快模型的收斂。
  • 輸入的參數少的情況下,模型似乎不需要太大。
  • 訓練過程中,我們必須加入另外一個提前終止的條件:當分數在連續 X 次高分後,就可以提前終止訓練。
  • 訓練過程中,我們可以加入選擇性訓練的功能:檔分數連續 X 次高分後,只有分數變低才開始訓練。不然,高分的記錄會將模型往 over-fitting 推進。

--

--