最近サラリーマンの方が忙しくて全然プログラミングの勉強ができていません。
ただサラリーマンに負けてしまってはいられないので、少しでもやったことを発信したいと思っております。
本日は機械学習シリーズの続きとして、「強化学習」について少し勉強してみたので、記したいと思います。
強化学習ってなに?
機械学習には大きく3つあって1つは以前気象予測のときに行ったように、正解があるものに対してデータ分析を行う教師あり学習、2つ目は大量のデータから特徴を学習し分類分けなどを行う教師なし学習、そして3つ目がデータがない状態で行う強化学習と呼ばれるものです。
強化学習はこうなってほしいということを指示しておくだけで、自動的に学習して達成するように学習することが特徴です。非常に面白いですよね!
しかも以前から勉強しているUnityには、なんとこの強化学習を簡単に実施することができるML-Agents(Unity Machine Learning Agents)と呼ばれるライブラリがあります!
私のようにおつむの弱い人でも強化学習の難しい理論を詳しく理解しなくても簡単に機械学習を利用することができるということですのでこれはやらない手はなかったです(一応このあたりを見て勉強はしました。。。)。
今回はすこしこのUnityのML-Agentsに触ってみましたので報告したいと思います。
ML-Agentsってなに?
Dr. Danny Lange(Unity TechnologiesのAIおよび機械学習分野担当役員)曰く”Unity ML-Agentsは、新世代のロボット、ゲームをはじめさまざまな分野において、迅速かつ効率的に新しいAIアルゴリズムの開発を行い、テストする柔軟な方法を提供します。”とのことです。Unityが提供するAIアルゴリズムみたいですね。HPにいろんな例も載っています。
ML-Agentsはこちらのサイトからダウンロードしました。ダウンロードとインストールの手順はこちらのサイトに従い行いました。
ML-Agentsはどんどん新しいverがリリースされており、自分のverに合った環境を構築する必要があるため注意が必要です。
ML-AgentsにはPythonが必要になりますので、同時にインストールが必要です。
中にはサンプルが入っておりまして以下のような強化学習が簡単に実施できます。
簡単にできると入っても上記の学習を実施するのには結構時間がかかりましたが。。。
サンプルを実行するだけでも楽しいのですが、自分で強化学習をやってみたいと言うのがあったので、1からやっている参考ブログを見つけましたのでそちらを見様見真似でやってみました。
実際に強化学習をやってみた!
まずは上記のサイトを参考に球がCubeに近づくように強化学習の環境を整えました。
わかりやすく手順が書かれていますのでその通りに行えばできます。環境構築のポイントとしては、
- Agentと呼ばれる強化学習の対象となる物体を準備する。
- AgentにScriptで報酬や行動の縛りを与える。
- Academyと呼ばれる空のオブジェクトに学習させるBrainをセットする。
だと思います。
同様の強化学習ができるようになりましたので、少しだけ自分なりのアレンジを加えてみることにしました。
私のやりたいことの目標としては、障害物を避けて目標地点に到達するみたいなことです。
まずはフィールドに壁を配置して球を落ちないようにしてTergetとなっていた物体を壁の一つとしてその壁に向かって球が移動するようにしてみました。
上記のサイトで学習した学習結果をそのまま使用した結果が以下のとおりです。
うおおおおおおおおー!っと言っても参考サイトのままなんで私は何もしていないのですが。。。
では、ここに障害物を置くとどうなるでしょうか。
球の初期値とTergetの壁の間に物体を置いてみました。
すると、Tergetに近づこうとするのですが、一度障害物にぶつかって障害物を這うようにして移動していることがわかります。
そこで、障害物を設置した状態でもう一度学習してみました。
最終的に50000回学習した結果が以下の様子です。
ちゃんと障害物を避けるように移動している様子がわかります。
最短経路でたどり着くように改善
今回の学習でd工夫した点は、参考サイトの報酬の与え方が球が一定距離Tergetに近づくと報酬を与えるようにしていたのを、最短経路で移動するようにしたかったので、時間ステップごとにマイナスの報酬を与えるようにしました。
具体的には以下の文をclassの中に記述しただけです。
1 2 3 4 5 |
#UnityScript C# void FixedUpdate() { AddReward(-0.001f); } |
FixedUodate()は一定時間ごとに呼び出されるメソッドでEditのProject SettingsのTimeの欄で時間を設定できます。
AddReward()は報酬を追加するメソッドです。今回はFixedUpdateが1回呼び出されるたびに報酬が-0.001されるといった意味です。つまり時間がかかればかかるほど報酬が減っていく仕組みです。
こうすることでできるだけ最短経路でたどり着くようにしたつもりです。
まっすぐ物体に移動している様子がわかります。今回の例ではあまり効果がないかもしれませんが、なにか目標地点に到達する行動を起こしたいときには有効だと思います。
まとめ
今回はあまり内容が薄いかもしれませんが、自分的には大きな一歩だと思っています。
ただ、このままだと障害物を設置するたびに学習する必要があるので、あまり汎用性がないように思います。どうすればよいのでしょうか。勉強中です。
また、学習中に行動が固定しまうようなことも起こりました。以下のようにTergetと逆の方に移動が固定しまっています。たぶん一定時間たっても目標が達成できないときの処理を記述する必要があるように思います。
ともあれ、今後はなにかコースを作ってレースゲームのようなものができれば良いなとおもっていたりいなかったり。みんなも無料ですのでUnityのML-Agentsで強化学習をしてみてはいかがでしょうか!
コメント