IT社員3人組によるリレーブログ

某IT企業に勤める同期3人が、日常で思ったことを記録していきます (twitter: @go_mount_blog)

自動運転を作りたい!~自動運転を実現する強化学習とは?~

どうも、Koheiです。
台風の中いかがお過ごしでしょうか

今日は以前の記事「AIを業務でどう使うか?~AIを使おうとしたら困った~」でも少しふれました、
強化学習というトピックについて触れたいと思います。

数ある手法の中でもDeepLearningなどと組み合わせて、自動運転やGoogleのAlphaGoなどでも使われている有名な手法になります。

 

過去の記事はこちら

go-mount.hatenablog.com

 

AIを使って自動運転を作りたい!

 

機械学習のアプローチとして大きく2つの方法を紹介してきました。

・正解データが用意できる

 →正解データをコンピュータに学習させる教師有り学習

・正解データはないけど、たくさんのデータがある

 →コンピュータにデータを分類させる教師無し学習

 

では、これらの手法を使ってAIを使った将棋ロボットを作りたいとします。

さて、正常に運転しているという正解は見えていますので、なんとなく正解データは取れそうな気がします。ということで教師有り学習?を選択します。

ところが、正常に運転しているときのデータを集めるかと思ったとき困ったことが起こります。

 

正常な運転をしているときのデータとはどんな状態なんでしょうか?

 

例えば、

前に障害物がなくて、ハンドルがまっすぐで、アクセル踏んでたら正解?
雨降ってたら?高速道路?実は工事中で一時的に反対車線に出なきゃ…

 などなど...

天候や周りの環境による要因によって組み合わせが膨大になり、
逐次その時のハンドルの位置、アクセルの踏み具合が正常かどうかを判断するのは難しいです。それぞれの状況のデータを集めるのもかなりの労力が必要になりそうです。

f:id:go-mount:20180729155008p:plain

 

ぶつからずに安全に走ってればいいんだけどなぁ

というゴールは見えるのですが、そこに至るまでの各状態を正常?or異常?の判断が

明確ではありません。

 

そこで使うのが強化学習です。

目的にどれくらい近づいているか?を正解とする

強化学習では、逐次その状態が正解かどうかは判定しません。

ただ、目的に対してポジティブか、ネガティブかだけを報酬として教えてあげます。

 

例えば自動運転の場合は

正常に運転している(例えば、車線の中を制限速度内で走って前後に障害物がない)状態であれば+1点、そうでなければ-1点を付けます。そのときのハンドルの位置やアクセル、ブレーキの具合などは評価しません

これを何回も繰り返して、報酬が最大になる最適な組み合わせをモデル化します。

こうすることで、最も正常な運転状態にいたる過程をコンピュータ自らで導き出すことができます。

f:id:go-mount:20180729155031p:plain

このように、一連の状態の移り変わりに対して報酬を与えることで、目的を満たす行動パターンを学習させるのが強化学習のアプローチになります。

習うより慣れよ精神ですね。

 

「報酬を与える」という点では、教師有り学習のようですが

ゴールと方向性(報酬)だけを与えるという観点が大きく違うところになります。

 

これによって各状態の評価はそこそこにして、教師有り学習に比べて、複雑な状態な組み合わせを扱うAIを作ることができます。

 

実際にPreferred Networksのブログでも強化学習を使って、車の自動駐車をシミュレーションしている記事がありました。

深層強化学習による自動駐車の実装 | Preferred Research

ブログの中でも取り上げていますがスマブラDX強化学習を使ったAIを作った話もありますね。

[1702.06230] Beating the World's Best at Super Smash Bros. with Deep Reinforcement Learning

状態が複雑に遷移するゲーム系でよく活用されているイメージがあります。

 

強化学習使えばどんなAIでもつくれる?

明確な正解も作らなくてもいいし、めっちゃ応用できるやんけ!
強化学習で全部解決するやろ!

と思ったあなた。

 

強化学習は確かに応用性の高いアプローチですが、大きな欠点として計算コストが膨大なことが指摘されます。

これを何回も繰り返して、報酬が最大になる最適な組み合わせをモデル化します。

としれっと書きましたが、「何回も繰り返す」というレベルではありません。

自動運転の例でいえば、

ハンドルの状態、周りの障害物との距離、アクセル、ブレーキの踏み具合etc...など各状態で何千、何万というパラメータが存在し、それが何千、何万という組み合わせで状態が遷移していきます。

 

何十億パターンを繰り返し計算させる必要があり、最適な組み合わせを計算するには家のmacでちょっと計算させるっていうレベルではありません。

まともに計算したら人生がいくつあっても足りなくなるので、「だいたいの最適解でいいから早く出せる方法」を取ることが多いです。

このあたりは数学的手法の話になるので今回は割愛しますが、最適化問題という分野で研究されています。

最適化問題 - Wikipedia

 

とはいえ、これでも最適解を導くのは非常にコストが大きいものなので

規模の大きくないものであれば、各状態ごとの正解データを作って、素直に教師有り学習を実践する方が早かったりします。

機械学習のアプローチまとめ

さて、これまで機械学習のアプローチとして、教師有り学習、教師無し学習、強化学習の3つを紹介してきました。

結局のところ

これらの学習方法ってどうやって使っていけばいいの?という方もいると思いますので、ちょっと整理してみましょう。

 

f:id:go-mount:20180729155959p:plain

とってもざっくり書いてみましたが、強化学習と教師有り学習、教師無し学習の最大の違いは、報酬を設定することでデータを集める過程もモデル化しているという点にあります。

つまり、データがまだなくても、集める方針さえ決めれば機械学習ができます。これは実際に大量データを持たない規模の小さな企業で活きるポイントになります。

 

逆に既にデータが揃っているのであれば、強化学習を取らずとも教師有り学習のアプローチをとったほうが、ゴールに早くたどりつく場合が多いです。

どんなAIモデルを作りたいのか、それに対してどんなデータがあるのか

を考慮して適切なアプローチを選択していく必要があります。

 

さて、今日は強化学習について書いてみました。

今後は、AlphaGoなどでも活用されているDeepLearningについても書いていきたいと思います。

 

ではでは