連載
» 2019年07月22日 05時00分 公開

AWS DeepRacer入門:第2回 AIの強化学習の基礎を学ぼう

AI・機械学習における「強化学習」の基礎知識と基本用語を、AWS DeepRacerの視点で解説。強化学習で特に重要な「報酬関数」については、重点的に説明する。

[一色政彦,デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「AWS DeepRacer入門」のインデックス

連載目次

 AWS DeepRacerは、自律走行を行うミニカーである(前回詳しく説明した)。その走行エンジンにAI(人工知能)の機械学習モデル(より厳密には、ディープラーニングの「強化学習」と呼ばれる手法)が用いられる。強化学習Reinforcement Learning)とは、次に取るべき行動を予測する機械学習モデルを作成するための学習方法である。DeepRacerでいえば、自動走行において「前に進むか」「右にハンドルを切るか」といった次に取るべき行動を予測するための走行エンジンを作成できるということだ。

 本稿では、その強化学習の基礎について、AWS Summit Tokyo 2019で開かれた「DeepRacerワークショップ」の取材に基づき、解説する。本稿の内容は、強化学習を全く知らない人にとっても、その概要をざっくりとつかむのにちょうどよい内容となっていると思うので、そういった人もぜひ読んでみてほしい。

強化学習の概説

人工知能とは?

 人工知能とは、ざっくりいうと、人間の知性を機械で模擬しようとする分野である。人工知能は大きく分けると、

  • 汎用型人工知能(=強い人工知能
  • タスク特化型人工知能(=弱い人工知能

に分けられる。そのタスク特化型人工知能の一例が、機械学習だ。

機械学習とは?

 機械学習とは、統計的手法を用いることで、人間が手動でプログラムしなくても賢くなるようなAIモデルを自動で学習する手法や学問分野のことを指す。さらにその機械学習を学習方法で分類すると、主に以下の3つに大きく分けられる。

  • 教師あり学習
  • 教師なし学習
  • 強化学習

 以上の関係をまとめたのが、図1である。

図1 人工知能と機械学習と3つの学習方法の関係(ワークショップより) 図1 人工知能と機械学習と3つの学習方法の関係(ワークショップより)

強化学習とは?

 それぞれについて説明しよう(図2)。

図2 教師あり学習と教師なし学習と強化学習の違い(ワークショップより) 図2 教師あり学習と教師なし学習と強化学習の違い(ワークショップより)

 ディープラーニングを勉強している人であれば、特に教師あり学習には馴染みがあるだろう。教師あり学習とは、学習データセットを用意するときに、そのデータの中に正解となる教師ラベルを用意しておく学習方法である。この方法では、AIモデルにデータを与えると、教師ラベルと同じ予測値を出力するように学習していく。教師あり学習によるAIモデルでは、例えば画像の分類や、画像内の人の検出(セグメンテーション)といったタスクを実現できる。

 一方、教師なし学習とは、教師ラベルがない学習方法である。この方法を用いると、データの背後にある本質的な特徴を抽出できるので、例えばクラスタリング(=クラス分類)や次元削減(=次元数を減らすことでデータを圧縮して表現すること)といったタスクを実現できる。

 今回説明する強化学習とは、これらの学習方法とは異なり、特定の「環境」下で、エージェントが一連の行動を行い、その結果に基づいてトレーニングを行う学習方法である。これにより、レース場を効率的に自動走行するAIモデルが構築できるというわけだ。

強化学習の参考イメージ

 強化学習の参考イメージとして、現実世界の例を挙げてみよう(図3)。

図3 実世界における強化学習(ワークショップより) 図3 実世界における強化学習(ワークショップより)

 これは犬をトレーニングしているところを、強化学習の視点で表現した2枚の写真である。例えば飼っている犬が、行儀よく過ごしているなどの良い行動があれば、餌などの報酬をあげる。しかし犬が、家を荒らすなど悪い行動があれば、餌などの報酬をあげないというペナルティーを課す。すると犬は、報酬がある方がうれしいので、人間が望む良い行動を取るように成長していってくれる。これが強化学習の直感的な説明だ。

強化学習の用語

 強化学習で必ず理解しておかなければならない6つの用語を図4に掲載した。

図4 強化学習の必須用語(ワークショップより) 図4 強化学習の必須用語(ワークショップより)

 これらの用語をDeepRacerに当てはめて説明すると、次のようになる。

  • エージェントAgent): 車(車両、ミニカー)=自分
  • 環境Environment): コース(トラック)
  • 状態State): コースの中で自分がどこにいるか
  • 行動Action): 自分がどう進むか(どう走行するか)
  • 報酬Reward): 行動の指標になるもの
  • エピソードEpisode): エージェントがスタート地点からゴール地点まで完走する、もしくはコースから外れて走行中止される、までの全ステップの経験のこと。1つのステップStep)は、状態+行動+報酬の1セットを構成する

 6つの用語の中でも、特に「報酬」が大事だ。これについて、もう少し詳しく説明しておこう。

報酬の概説

 強化学習における報酬とはどのようなものなのか。DeepRacerを例に説明していく。

強化学習における報酬

 強化学習では、各行動を促すインセンティブとなる「報酬」を与えるための報酬関数を定義する(図5)。

図5 報酬関数がとても重要(ワークショップより) 図5 報酬関数がとても重要(ワークショップより)

 AIの実装者(つまり読者自身)は、できるだけ良い行動を取るような報酬関数をうまく定義してやる必要がある。先ほどの犬の例であれば、人間が「行儀が良い」と思ったときに餌(報酬)を与えればいいだろう。ではDeepRacerなら、どういったときに、報酬を与えればよいだろうか。

 基本的には、コース(環境)上で、車(エージェント)が車道をはみ出さないように(=状態)走ってゴールにたどり着いたとき(行動)に、報酬を与えればよいだろう。

報酬の与え方1: ゴールのみの報酬関数の場合

 DeepRacerにおいて最も基本的な「良い行動」は、スタートからゴールに無事にたどり着くことだ。まずは、ゴールを報酬にすればよいだろう。図6はそのイメージである。

図6 DeepRacerにおけるゴールのみの報酬関数のイメージ(ワークショップより) 図6 DeepRacerにおけるゴールのみの報酬関数のイメージ(ワークショップより)

 エージェントが、スタート地点(左の青色の[S])から出発して、そのままコースから外れずにまっすぐに進んでゴール地点(右の緑色の[G=2])に到達すれば、2ポイントの報酬を付与する。なお、上下にある紫色のラインはコースの外枠を意味する。これが、最もシンプルな報酬関数の定義である。

 しかし、読者の皆さんはこの報酬関数で、車がゴールにまでたどり着けるようになると思っただろうか。そもそも車道は広く、そのどちらに進むかは、最初はランダムに決定される。つまりどこに進むか分からない。一向にゴールにたどり着けないので、報酬も与えられない。これではいつまでたっても学習できない結果となりかねない。

 このような報酬設定は、スパースな報酬関数疎な報酬関数)と呼ばれる。この問題を回避するためには、ガードレールのようなガイドラインを引いてあげる必要がある。

報酬の与え方2: ガイドラインがある報酬関数の場合

 実際にガイドラインを引いた報酬関数のイメージが図7である。

図7 ガイドラインがある報酬関数のイメージ(ワークショップより) 図7 ガイドラインがある報酬関数のイメージ(ワークショップより)

 図6と見比べると、図7には、スタートからゴールまでの道のりの各地点(状態)に20.1という数値が並んでいるのが見える。これが意味するのは、ゴールまでたどり着いていない途中の状態でも、

  • コースの真ん中を走ってくれたら、2ポイントの報酬を与える
  • コースの真ん中から外れて走っても、0.1ポイントの報酬を与える

という報酬関数が定義されたということだ。特定の行動に対してインセンティブを与えているわけである。このように報酬定義されていれば、スタート地点からゴール地点に向かって、車がまっすぐきれいにセンターラインを走ることが想像できるだろう。DeepRacerでは、このような感じで報酬関数を独自に定義する(図8はDeepRacerで定義した報酬関数のコード例である)。あとは、モデルをトレーニングすることで学習が進み、車が徐々にうまくレース会場を走れるようになるというわけだ。

図8 DeepRacerで定義した報酬関数のコード例(Python) 図8 DeepRacerで定義した報酬関数のコード例(Python)
reward_function()関数は、報酬関数を意味する。この報酬関数は、図7と同様に、エージェントがセンターラインに沿って進むように報酬を定義している。
変数track_widthはコースの幅、変数distance_from_centerはセンターラインからの距離の数値が格納されている。
センターラインからの距離は、コース幅の10%(変数marker_1)/25%(変数marker_2)/50%(変数marker_3)でマーカーを引き、3段階に分けている。
最も中心に近い10%幅内を走行中の場合は1.0ポイントの報酬が、25%幅内なら0.5ポイント、50%幅内なら0.1ポイント、それよりも外を走行中なら、1e-3(=0.001)ポイントが付与される。
計算された報酬は、関数の呼び出し元にfloat値として返却される。

 ただし報酬は、「ある地点で2ポイント与える」という単なる情報でしかない。実際には報酬だけではなく、「次にどの方向に進めば自分(エージェント)はゴール地点で報酬の合計(=価値)が最大になるのか」を、地点ごとに計算する必要がある。その計算を行うのが、価値関数である。

 価値関数では、各ステップの報酬を割り引くための割引率Discount rate割引ファクターDiscount factor)を設定する。これは、どこまでの将来を考慮するかを調整するためのハイパーパラメーターである。割引率を0.0にすると、将来は考慮せずに直前の報酬のみを重視することになる。1.0にすると、将来の報酬すべてを現在の価値として考慮する挙動になる。DeepRacerでも任意の割引率を設定できるが、通常は0.9あたりを設定する。

 図9は、価値関数により計算した報酬の累積値の例である。

図9 価値関数により計算した報酬の累積値の例(ワークショップより) 図9 価値関数により計算した報酬の累積値の例(ワークショップより)

 価値関数を作成するために、エージェントは状態と行動を探索し、最も価値が高くなる状態を選んでいった場合に獲得できると推定される報酬の累積値を、各地点に反映していく(図9)。これを繰り返すことで、車が進むべきよりよいパスが得られる。

 さらに報酬の累積値を利用して、ある状態において取るべき最適な行動の方策(ポリシー、戦略)を得るための、方策関数も導入する。DeepRacerにおける方策関数は、ニューラルネットワークで画像(状態)を入力として受け取って行動を出力する。つまり状態と行動をマッピングするための関数となっている。方策関数については、後述の「強化学習のトレーニングアルゴリズム」で使われている。

強化学習の実践

 さて、それでは強化学習はどのようなプロセスで行われるのか、について説明しよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。