こんにちは、アンゴ(https://twitter.com/angongoo)です!
みなさんはUnityで強化学習されていますか?
Unityで強化学習を始める時に、おそらく多くのみなさんが
UnityMLに入っているサンプルを試してみるとおもいます
もちろんアンゴもそうしました!
今回は、そのサンプルの3DBallから新しい学習環境を作って
報酬の設定が学習の結果にどう影響するか試してみました🤔
UnityMLの3DBallサンプル

おそらくUnityMLに入っているサンプルの中で
一番有名なサンプルは、上の画像の3DBallではないでしょうか
内容としては、青い板に強化学習させて上に乗ったボールを落とさないようにする
というものです
実際に強化学習させてみると、最初はボールをポロポロ落としますが
徐々にボールをキープできるようになっていきます
最終的には、板の上でボールはほぼ動かない位に安定した状態となります
学習が進んでいくのを見ているのは、なかなか気持ちいいです☺
UnityMLサンプルの3DBallを逆にしてみました
サンプルの3DBallを見ている時にふと、
『ボールと板の関係性を逆にしたらどうなるのかな?』と思いついてしまったので
作ってみることにしました!
元の3DBallでは、板を動かしてボールを落とさないようにするのに対して
ボールを動かして板をなるべく傾かないようにして、ボール自身が板から落ちないようにするという学習環境を作ります!

逆3DBall
3DBallを元にして、逆3DBallを作りました
とりあえず出来たものが、上の動画です!
元の3DBallから大きく変えた点としては
1)ボールをキューブ変更しました。ボールのままだと傾斜を登ることが出来ずに
ちょっとでも傾くとそのまま真っ逆さまになってしまうのです
2)キューブの大きさに対して板を広くしました。元の3DBallのサイズ比だと、すぐに落ちてしまって学習がかなり難しかったので、難易度を下げました
上の動画は50万回学習後の様子です
キューブが板の傾きに合わせて、傾斜が高くなっている側に移動していますね
ちょっとかわいいです😊
上の動画では報酬の設定を
・キューブが板の上に乗っている間、1フレームごとに0.001ポイント加算
・キューブが板から落ちたら-1にセット
(つまり、落ちた時点でそれまで取った報酬に関係なく-1ポイントになります。これにより、強化学習は落下しないことを最優先に学習します)
で学習しました
強化学習での「報酬」というのは、ゲームの得点がイメージ的に近いです
強化学習というのはコンピュータが何度も何度もゲームをやり直して
少しでも多くの得点を取る方法をコンピュータ自身で学んでいくというイメージに近いです
UnityMLの報酬をいろいろ変えて結果を確かめます
それではこの逆3DBallを使って、報酬の条件をいろいろ変えてみます
それによって、学習結果は変わるのでしょうか🤔
報酬の変化と学習結果について
例えば「敵を避けながらりんごを拾う」というゲームの強化学習を考えてみます
報酬の設定が
1)りんごを拾ったら10点、敵に当たると-100点だったら
おそらく普通に敵を避けながらりんごを集めるでしょう
2)りんごを拾ったら100点、敵に当たると-1点 という設定なら
おそらく、多少敵にぶつかるリスクをおかしてでも
無理にりんごを集めるようになりそうですよね
3)逆にりんご1点、敵に当たると-1000点なら
きっと、より慎重に敵を避けながら行動するようになるでしょう
理屈で考えるとこのように、報酬の設定で結果が変化しそうなのですが
実際はどうかを、今回試してみます!
このりんご集めも、いつか実際に作って試してみたいです😉
パターン1 止まっていると報酬アップ
逆3DBallの動画を見て気になったのですが
キューブが細かくプルプル動いていて、ちょっと落ち着かない感じです😅
このプルプルをなんとかできないかと思い報酬を調整してみました
キューブは動作を決める際に
「前後左右の移動と、動かない」という5つの選択肢があるのですが
この中から、動かないという選択をした際に、報酬を0.001加算する設定にしてみました
このパターンの報酬をまとめると
・キューブが板の上に乗っている間、1フレームごとに0.001ポイント加算
・動かないという選択をすると、さらに1フレームごとに0.001ポイント加算で計0.002ポイント
・キューブが板から落ちたら-1にセット
この報酬設定で学習した結果が、次の動画となります
残念ながら、ぷるぷるは収まりませんでした
おそらくですが、1フレームごとに動作を決定しているので
人間の目に震えないように見えるためには
数十回連続で停止するという動作選択が必要なのだと思います
しかし、今回の動画を見ていただくと
キューブの動きの傾向が最初の動画とは少し違っているように見えます
最初の動画に比べて、中央付近にいる時間が長くなり
おそらく、キューブが止まっている時間を長くしたい→中央付近にいたほうが動きが小さくできる
という判断で
このような変化が現れたのではないでしょうか
結果として、板が水平に近い時間が長くなり
安定性が増したようです
結果オーライです!
引き続いて、さらに設定を変えてみます
キューブの動きを3倍速に
今回は報酬はそのままで、キューブの動きを早くすることで
もしかしたらプルプルが収まるのではないかと考えました
キューブのスピードが速くなることで
必要なときだけ動いて、それ以外のときは止まっているとならないかと考えました
設定としては、キューブの移動速度を3倍に設定しています
赤くしたらよかったですね😉
移動速度3倍の動画がこちらになります
前回までの動きに比べて
より大胆に大きな範囲を動いてバランスをとるようになりました
現状の報酬設定だと、キューブが落ちなければ板の状態は考慮しませんので
今回の強化学習ではある程度揺らしながらバランスをとるという選択をしたようです
ここで、より水平に保てそうな報酬を思いついたので試してみました
水平に対してボーナス
今度は直接的に、板の角度と報酬を結びつけたらどうなるのか試しました
具体的には、板が水平の時はフレームごとに0.01ポイント
板が垂直の時は0ポイントの範囲で
角度によってフレームごとにもらえる報酬を変化させました
その動画がこちらです
結果は、二番目の動画に似た感じで
中央付近で細かく動いてバランスを取っています
板の動きを見ると、二番目のものより水平に近づけようとしているようにも見えます😊
まとめ
とりあえず3種類設定を変えてみましたが
プルプル動くのは変わらず、今後の課題です🤔
試してみて感じたのですが
このくらい単純な学習環境でも
報酬の設定で動き方に個性のようなものが見え始めて楽しかったです😊
報酬の設定が、強化学習の重要ポイントだと思いますので
このあたり、もっと調べていきますね!
最後まで読んでいただきありがとうございます!
それではまた!
コメント