ユニティアイキャッチ

2020.01.22

オフショア開発

【完全解説】Unityを活用し3D仮想空間でAIに荷物の運搬を強化学習させる実験

今回は、Unityで強化学習を利用できるML-Agentsというライブラリを使用して、Unity内で作成した架空の工業用ロボットに作業を学習させる実験をしてみます。

まずは、実験の結果をご覧ください。

これは、AIが「強化学習」という手法で、荷物の運搬を学習した成果です。
この手法では、AIが課題に成功する度にプラスの報酬を、失敗の度にマイナスの報酬を与えます。AIは何万回という失敗を繰り返しながら、成功例の共通点を探し、最適な手法を模索し続けます。

今回の学習で、AIに与えた環境の詳細は下記の通りです。

1. 課題

荷物運び
このロボットのアームの先端には磁石の性質を模した黒いヘッドが装着されていて、チェック柄の箱を吸着することができます。
このチェック柄の箱を、緑の台座から赤い台座まで運ぶことが、このロボットの仕事です。

障害物は、紫色の箱として表示されています。
荷物またはヘッドが障害物に触れると、作業は即時失敗と判定されます。
荷物にヘッドを強く押し付け過ぎた場合も、荷物が壊れて失敗と判定されてしまいます。

ロボットは以下の3種類の行動を取ることができます。
・自身の位置の左右移動
・アームの前後移動
・アームの上下移動

2. 報酬

実際にはもっと細かい報酬の配分がありますが、代表的な例は下記の通りです。

荷物をゴールの中心に運べたら +1点(満点)
荷物をヘッドに吸着できたら +0.5点
荷物かヘッドが地面に触れたら 0点
時間切れまでに上記のいずれにも当てはまらなければ -1点(最悪)

最初の偶然の成功が起きやすくなるように、「何も行動せずに時間切れになるよりは、ヘッドが地面に触れた方がマシ」という認識を得るような報酬の配分にしています。

3. 強化学習のコツ

強化学習では、「エージェント」と呼ばれる架空の被験者に、何十万回も失敗を繰り返させて、その行動に対して適切な報酬を与えることで、エージェントが徐々に成功確率を高めるように導いていきます。

つまり、学習の初期段階では、エージェントは全くのデタラメに行動をします。その際、ごく稀に、完全なる偶然の産物により成功となる行動をします。

AIは、エージェントの行動を常に観察しています。
エージェントが得た最初の数回の偶然による成功から、AIは、エージェントが成功を得る過程でとった行動の共通点を見出し、最適な行動を模索します。

言い換えれば、強化学習では、学習の初期段階で、エージェントのデタラメな行動から全くの偶然により成功が発生する必要があります。
デタラメな行動で成功できる確率が極端に低い課題を与えると、エージェントが何百万回行動を繰り返しても、正解例を得ることができず、学習が進みません。

この状況を「報酬が疎である」と表現したりします。「疎」はsparseの訳です。
報酬が疎である状況を回避するためにはいくつか方法論がありますが(機会があれば、詳しくは別の記事で書きます)、今回は下記の簡単な方法で報酬が「密」な環境を作りました。

荷物運び

初期位置である緑の台座と、ゴールである赤の台座は、エピソードごとにランダムに再配置されます。
その際、一定の確率で、初期位置とゴールがごく近い位置に配置されるように工夫しました。

ロボットが偶然ヘッドに荷物を吸着させ、その後、偶然ほんの少しだけ横移動すれば、満点に近い報酬を得ることができます。
これですら、ごく稀にしか発生しない奇跡のような偶然ですが、それでも何万回という試行の中では充分に発生し得ます。

それにより、AIは、まずは近いゴールに対して荷物を運ぶことを覚えます。
そこから、少しずつ遠いところにあるゴールまで荷物を運ぶことを覚え、徐々に成功率が高まっていきます。

4. 実験① 座標情報のみによる学習

まずは、そもそもAIがこのような作業を覚えることができるのか、障害物無しの環境で検証してみました。
25万ステップの学習を実施した結果が、下記の動画です。
平均報酬0.98を達成することができました。

今回の実験では、AIには下記の情報のみを与えています。
A:ヘッドの位置
B:荷物の位置
C:ゴールの位置

つまり、この実験の中では、AIは視覚的に状況を捉えている訳ではありません。
また、それぞれの位置が何を意味するのかの情報も与えていません。

AIは、自身が操作しているロボットがどのような形をしているのかすら知らず、デタラメにロボットを操作すると、ABC(という意味不明な)座標がどのように変化するかをひたすら観察し続けています。

結果、AIは、「理由は知らないけど、まずはAとBの座標を近づけ、次にBとCの座標を近づければ、報酬がもらえるらしい」ということを知ります。
そこから、言葉では説明もつかないような細かいコツを覚え、徐々に成功率を高めていくという訳です。
障害物がない状況では、たったこれだけの情報から、効率的に成功パターンを学習できることが分かりました。

5. 実験② 障害物を配置する

ここからが実験の本番です。

先ほどの実験の環境に、障害物を何個か配置してみます。

まずは敢えて、AIには、先ほどの実験と同じ情報(ABCの座標)のみを与えて学習させてみます。
つまり、AIは障害物の情報を全く知りません。

座標

先ほどの実験で、AIがABCの意味論的な位置付けを全く知らないまま荷物の運搬を学習したように、存在も知らない障害物を避けることができるでしょうか。
かすかな期待ではありますが、「理由は知らないけど、荷物を運んだらヘッドを真上に引き上げて、ゴールの上についてから真下に下ろせば、報酬がもらえるらしい」という万能策を学習してくれそうな気がします。

また、報酬が充分に密になるよう、障害物の高さはランダムにしており、中には地面スレスレくらいの高さの障害物もあります。
横移動の際、ほんの少しでも荷物を引き上げれば、長期的視点ではより多くの報酬をもらえる状況です。
果たして、AIは横移動の際、徐々に荷物を高く引き上げるようになるでしょうか。

ということで、実際に学習させてみました。

結果、25万ステップの時点で、平均報酬0.6あたりを上回ることはありませんでした。
障害物の存在を無視(知る術もないので当然ですが)して荷物をゴールまで運び、運良くその間に障害物がない場合のみ成功しているように見えます。
また、横移動も相変わらず直線的な移動です。

やはり、観察できない対象が報酬に与える影響に関しては、上手く学習することができないようです。
ただし、このまま何千万ステップと繰り返せば、ほんの少しずつ「とにかく荷物は高く引き上げるべし」という万能策を覚えるのかも知れないので断言はできませんが….。

6. 実験③ 視覚情報により学習させる

先ほどまでは、AIは3種類の位置情報だけを与えられていました。
今回は、AIに視覚的情報を与えてみます。

ヘッドの先にカメラを設置し、その映像を毎フレームAIに伝えるようにしました。
これにより、AIは箱とゴールと障害物の位置関係を視覚的に把握できます。
ただし、逆に今回はABCの位置座標は与えていません。
映像のみが観察対象です。
カメラはこのような映像を捉えています。

head-camera (1)

それ以外の環境は、先ほどの実験と全く同じです。

上記が結果の動画です。
実験②よりも成功率が下がってしまいました。

真上からの映像のみが与えられているので、荷物とヘッドとの距離感を正しく認識できないのでしょう。
結果、荷物を押し潰してしまい、失敗と判定されているようです。

今回もまた、もし何千万ステップと繰り返せば、荷物との距離感を正確に認識できるようになるのかも知れません。
ですが、これまでと同じ25万ステップで、ひとまず終了とします。

7. 実験④ 位置と視覚情報により学習させる

最後に、位置と視覚の情報を同時にAIに与えてみることにします。

位置情報からは、荷物をゴールまで運ぶことができるものの、障害物を避けることができませんでした。
また、視覚情報からだけでは、荷物にヘッドを近づける学習は始まりますが、位置情報だけを与えた時よりも優れた結果を出すことができませんでした。

これらの情報を同時に与えたら、それぞれの情報の関係を効果的に組み合わせて、最適な運搬方法を編み出すことができるでしょうか。

結果は、こちらです。

見事、適切なタイミングで荷物を引き上げ、障害物の上を通過できるようになりました。
25万ステップの時点での平均報酬は0.9以上です。
今後も学習を続ければ、より荷物の引き上げ方が洗練されて、さらに精度を高めていくかも知れません。

位置情報のみを与えた時と同じように、最初は荷物を平行に運んでしまいました。
そのため、障害物が間にない場合だけ成功しています。

ところが、次第に低い障害物の上では、ほんの少しだけ荷物を引き上げることを学習しました。
そこからは、荷物を引き上げる幅が少しずつ広がり、最終的に最高の高さの障害物にも対応できるようになりました。

いきなり最高の高さの障害物だけを与えたら、そもそも「障害物の上で荷物を引き上げると成功率が高まる」という推論に至らなかったでしょう。
最初の小さな成功さえあれば、あとはその成功を頼りに、少しずつ荷物の引き上げのコツを掴んでいきます。

8. まとめ

AIが何かを学習してく様子は、人間の学習過程とどこか似ています。

忍者

子供の頃に忍者の本で読んだ、麻の苗木を毎朝飛び越える訓練を思い出します。
麻は毎日3cmずつ成長するので、忍者もまた毎日3cmずつ高く飛べるようになる必要があります。
最終的に忍者は、3mの麻も飛び越えるようになるそうです。
毎日の目標を少しずつ高めながら、小さな成功を繰り返していくことで、いきなり3mの麻に挑戦しようとしても得られない細かなコツを、少しずつ覚えていくことができるのでしょう。

人間が何かを効率よく習得するためには、日々のコツコツとした学習の積み重ねと、その中で少しずつ目標を高めていくことが必要です。
それがそのままAIにも当てはまるのは、とても興味深いですね。

9. Unityに興味を持ったらバイタリフィへ

このように、Unity開発ラボ(UDL)では、Unityの可能性を最大限に活かすため、日々様々な技術を実験し開発に取り入れています。
今回の実験内容にご興味のある方や、今後UDLにお仕事を依頼されたい方は、ぜひお気軽にご連絡ください。

contact-or500

当社では『AI導入をお考えの方に精度や効果を無料で確認してから開発の判断ができる』サービス「Mobile AI Lab」も運営しております。

「業務へのAI導入を検討しているが、何からすれば良いんだろう?」
  そんな事業戦略担当者様!
  機械学習、ディープラーニングを用いてAIモデルを無料で作成。
  AIアプリを気軽に開発できるサービス『Mobile AI Lab』のお問合わせはこちら