Unityの機械学習ライブラリ【Unity ML-Agents】を解説

プログラミング
ゲームエンジンの【Unity】は昨今、機械学習の分野でも注目されつつあります。今回は、Unityの機械学習ライブラリ【Unity ML-Agents】の紹介と、ML-Agentsを用いた機械学習のポイントを解説していきます。
Unityの機械学習ライブラリ【Unity ML-Agents】を解説

昨今めざましい技術革新が行われている機械学習の分野ですが、その機械学習を実現するライブラリがUnityには備わっています。
今回は、Unityを用いた機械学習を実際のコードと共に解説していきます。

機械学習とは

現在、AIが世界的に注目されています。
AIを搭載した無人で運転を行う車や、その日の夕飯のレシピを提案してくれるAI搭載の冷蔵庫など、様々な場所で【AI】という言葉を耳にすることかと思います。
そのAIですが、一言にAIといっても様々なものがあり、それぞれ学習方法によった性質や得意分野の違いなどが多く存在します。

機械学習の定義

今回紹介する【機械学習】とは、【莫大な数のデータ集合を解析し、特徴を捉え、未知のデータについての予測を行うことができるよう学習させるもの】を意味します。

よくAIについてのニュースで【ディープラーニング】という単語について話しているのを聞いたことはないでしょうか。
【ディープラーニング】もまた、今回紹介する【機械学習】というカテゴリの一分野です。【ディープラーニング】は人間の脳をモデルにした学習方法を採用している点がその他の機械学習とは異なる点ですが、【何らかの方法でデータを分析し学習を行う】という点では共通しています。

Unityが機械学習で注目される理由

Unityはもともとゲーム開発の支援を行うための【ゲームエンジン】です。
ゲームエンジンと聞くと、一見機械学習とは関連性のないものに感じるかもしれません。
しかし、ゲームとAIは昔から親密な関係にあるものであり、AIを作成するための機械学習は、ゲーム制作と深い関わりがあるものなのです。
そのため、AIと親密な関係にある【ゲーム】の開発ツールであるUnityが、現在機械学習のツールとしても注目されていることは、ある意味で自然なことであるとも言えるでしょう。

Unityの機械学習ライブラリ Unity ML-Agentsの使い方を解説

Unityで機械学習を行うために、今回は機械学習ライブラリ【Unity ML-Agents】を使っていきます。Unity ML-Agentsは強化学習のアプローチで機械学習を行うことを特徴とした、機械学習ライブラリです。

Unity ML-Agentsの特徴

Unity ML-AgentsはゲームエンジンであるUnityの機械学習ライブラリであるため、ゲームとしては前提条件である【視覚的コンテンツの表現力】に強みがあります。
視覚的コンテンツに関わる機械学習を行い、たとえば学術的な研究の場において【視覚的なコンテンツと、現実の物理理論からなる、複雑な行動のシミュレータ】を制作し、役立てることもUnity ML-Agentsの機械学習を利用すれば可能となります。
その他にも、Unity ML-AgentsはPython APIを利用した強化学習の訓練を行うことが出来るため、ロボットや車の自動運転などの大規模な訓練環境を実装することも得意としています。

Pythonとの連携により強化学習の訓練を行うように作られているため、Unity ML-Agentsの導入には、Pythonの導入も必要となります。
公式ドキュメントに従い、Pythonのインストールも含めたUnity ML-Agentsのセットアップを行いましょう。

Unity ML-Agents で実際に機械学習を行う

Unity ML-Agentsにおいて、機械学習の【訓練】の実行はPythonが担っています。
一方で、強化学習における【報酬の設定】等、エージェント(ユーザの代理、操作者)に関わるものはML-Agents側のコードで設定されます。

Unity ML-Agentsの機械学習は、機械学習の中でも【強化学習】と呼ばれる分類のものであり、この【強化学習】は【エージェントが環境から報酬を得るために動くことで、学習を行う】ものです。

そのため強化学習においては、【どういったアクションをすると報酬が手に入るのか】という設定が極めて大事なものになります。

その報酬の設定は、Unity ML-Agentsにおいて、次のようなコードで設定されます。

if ( /* 任意の条件 */ ) {
  agent.SetReward(1f)  // 1fの報酬を獲得する
} else if ( /* 任意の条件 */ ) {
  agent.SetReward(-1f) // マイナス1fの報酬を獲得する
}

このようにSetReward()メソッドを使用すると、引数の値の報酬を獲得することが出来ます。引数の値がマイナスである場合、報酬は減ったものとみなされ、エージェントはマイナス報酬に繋がるまでの一連の動作を避けるよう学習します。
この報酬をどこにどのように設定するかによって、強化学習の結果は大きく変わります。

時間経過でマイナス報酬を獲得するようにすると、エージェントはより焦っているかのように行動するようになりますし、時間経過で報酬に関わる値の変動を行わない場合には、エージェントは極めて慎重に時間をかけて行動するようにもなります。

シンプルなコードですが、報酬の設定がUnity ML-Agentsにおける機械学習(強化学習)のキモとなります。自ら機械学習の実行を行いながら、どのような報酬設定がもっとも適切な学習を生むか、模索してみることが大切です。

まとめ

ゲームエンジンであるUnityが提供する機械学習ライブラリ【Unity ML-Agents】の機械学習は、【強化学習】という分類に属するものであり、これは【報酬に応じて振る舞いを学習する】性質をもっています。

Unity ML-Agents側のコードで、報酬の値をどのように変動させるかを変更することで、強化学習のエージェントがどのように振る舞うかが変わります。報酬の設定をうまく調整し、適切な機械学習(強化学習)を行えるよう模索していきましょう。

この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。

おすすめのコラム

【量子コンピュータ】PennyLane 0.8.0 初級 Tutorials : PyTorch とノイズのあるデバイス

プログラミング

【PennyLane 0.8.0 初級チュートリアル <量子機械学習>】◆ PyTorch とノイズのあるデバイス「初級チュートリア...

【量子コンピュータ】PennyLane 0.8.0 初級 Tutorials : PyTorch とノイズのあるデバイス