EnsekiTT Blog

EnsekiTTが書くブログです。

プルプルしている倒立振子を安定させる話

こんにちは、えんせきです。
雪やばくないですか?思わず散歩に行きましたが雪強すぎて逃げ帰ってきました。

つまりなにしたの?

前回作成した倒立振子はプルプルしていた。これを綺麗に立たせるための施策を幾つかまとめる
この施策は前回紹介したモデルのベストプラクティスとまだ翻訳を載せていないPPOのベストプラクティスを反映したもの。

f:id:ensekitt:20180123004548j:plain

ベストプラクティスたち

エージェントの報酬関連
ensekitt.hatenablog.com

PPOのハイパーパラメータ関連
github.com

施策

  • 報酬を「ある角度以内なら0.1」から「角度が0に近ければ1、60度まで傾くと0」に変更

角度がまっすぐな方が良いよって教える報酬。

  • 報酬をこれに合わせて「ある角度以内なら0.05」に変更

これは立っていられていれば与えられる報酬。

  • 隣と当たることがあったので動作域を制限

制限したつもりだったけどよく考えたら先端が当たってた()
また、元いたところに近ければ近いほど報酬を与えた。

上記3つの報酬で最も良い時に0.25になり、倒れたときを除く最も悪い時で0.05になるようにした。

  • Frame To Skipを4にする

毎フレーム動かすと何やら発散気味になったのでスキップした

  • ContinuousなのでNormalizeをTrueにする

複雑なContinuousの問題だと正規化したほうが良く、単純なDiscreteの問題だと正規化はしないほうが良いらしい。
そんなに複雑じゃないけどTrueにしておいた。

  • Continuousなのでbatch_sizeを2048にする

Batch_sizeは勾配を計算する際にひとまとめにして扱う単位。Discreteだと10秒程度(32−512)、Continuousだと1000秒程度(512−5120)くらいとのこと。Continuousなのでとりあえず2048にした。
ちなみに色々試行錯誤してみていたけど、Batch_sizeを適切にするのが一番収束に効いた気がする。

学習Step数を4通り実行してみた

(今回は問題が単純なのでカリキュラム学習は適用していない。)

  • 1e5(100000)回

f:id:ensekitt:20180123004835g:plain
カオス。ほとんど立ってられない。
ベストプラクティスを適用する前もこんな感じだった。

  • 7e5(700000)回

f:id:ensekitt:20180123004916g:plain
なんとは維持できているけど、定期的にプルついてる。

  • 15e5(1500000)回

f:id:ensekitt:20180123005004g:plain
プルつきの振幅が収まってきた。

  • 30e5(3000000)回

f:id:ensekitt:20180123005126g:plain
これでもちゃんと動いている。
ちなみに長時間ほうっておくとだんだんずれ行って急にぷるっと中心に戻したりする。かわいい。

各学習ステップ数のときの報酬

f:id:ensekitt:20180123004800j:plain

そろそろ倒立振子を卒業します!

定番強化学習タスクを色々やってみるぞ。

本体

github.com
Unityは別々にリポジトリあったほうが良いかも知れない…

PPOのハイパーパラメータ

### General parameters
max_steps = 1e5 # Set maximum number of steps to run environment.
run_path = "ppo" # The sub-directory name for model and summary statistics
load_model = False # Whether to load a saved model.
train_model = True # Whether to train the model.
summary_freq = 5000 # Frequency at which to save training statistics.
save_freq = 50000 # Frequency at which to save model.
env_name = "stick.app" # Name of the training environment file.
curriculum_file = None

### Algorithm-specific parameters for tuning
gamma = 0.99 # Reward discount rate.
lambd = 0.95 # Lambda parameter for GAE.
time_horizon = 2048 # How many steps to collect per agent before adding to buffer.
beta = 1e-3 # Strength of entropy regularization
num_epoch = 5 # Number of gradient descent steps per batch of experiences.
num_layers = 2 # Number of hidden layers between state/observation encoding and value/policy layers.
epsilon = 0.2 # Acceptable threshold around ratio of old and new policy probabilities.
buffer_size = 4096 # How large the experience buffer should be before gradient descent.
learning_rate = 3e-4 # Model learning rate.
hidden_units = 64 # Number of units in hidden layer.
batch_size = 2048 # How many experiences per gradient descent update step.
normalize = True

### Logging dictionary for hyperparameters
hyperparameter_dict = {'max_steps':max_steps, 'run_path':run_path, 'env_name':env_name,
    'curriculum_file':curriculum_file, 'gamma':gamma, 'lambd':lambd, 'time_horizon':time_horizon,
    'beta':beta, 'num_epoch':num_epoch, 'epsilon':epsilon, 'buffe_size':buffer_size,
    'leaning_rate':learning_rate, 'hidden_units':hidden_units, 'batch_size':batch_size}