Pythonではじめる OpenAI Gymトレーニング

70
Pythonではじめる OpenAI Gymトレーニング by icoxfog417 @ PyConJP 2016

Transcript of Pythonではじめる OpenAI Gymトレーニング

Page 1: Pythonではじめる OpenAI Gymトレーニング

PythonではじめるOpenAI Gymトレーニング

by icoxfog417 @ PyConJP 2016

Page 2: Pythonではじめる OpenAI Gymトレーニング

Agenda

● OpenAI Gymを体験しよう○ OpenAIとOpenAI Gym

○ OpenAI Gymを動かしてみる

○ 簡単な「AI」を作ってみる

○ 「AI」の限界

● 「AI」を成長させよう○ 強化学習というアイデア

○ アイデアのモデル化と、最適化の方法

○ より複雑なタスクへの挑戦

● Deep Learningとの融合○ Deep Q-learningの登場

○ Deep Q-learningにおける3つのトリック

○ Deep Q-learningの実装

● おわりに

2

Page 3: Pythonではじめる OpenAI Gymトレーニング

About Me

Page 4: Pythonではじめる OpenAI Gymトレーニング

icoxfog417

TIS株式会社所属

業務コンサルタント出身で、サプライチェーン周りの開発を担当してました(得意技は石油化

学製品の価格改定)。kintoneエヴァンジェリストもやってます。

業務システムに先進的な技術を取り込んで活かしたいとの思いから、戦略技術センターに

異動。現在は、機械学習や自然言語処理を活用して新規サービスのプロトタイピングなど

を行っています。

Qiitaへの投稿もしてます。今日の発表は、この記事が元になっています。

Page 5: Pythonではじめる OpenAI Gymトレーニング

icoxfog417

kintoneとWatsonを連携させた災害対策ソリューション

災害時、TwitterなどのSNSから自動で情報を収集し、kintoneに登録(重要度やカテゴリを、Watson NLCで自動判定)。

災害対策マニュアルを学習させたWatson R&Rから、必要な対策を提案。

会議診断システムさゆり

会議の様子をカメラで撮影し、リアルタイムにその会議の評価を出力する(機械学習により、評価を算定)。

戦略技術センターの活動原則はOPEN MINDであり、検証結果などはほぼ全てが公開されています。

Page 6: Pythonではじめる OpenAI Gymトレーニング

人とロボットとの分業による、生産的な接客の実現を検証中

Robot Dash Board Human

customerA

customerB

customerC

report

take over(telepresence)

背景:生産年齢人口の現象による販売員単価増+ネットショッピングの普及による来店者数減コンセプト:ロボットが得意なところ/できることは任せ、人は人ならでは応対に注力する

icoxfog417

対話システムシンポジウムでデモ予定

Page 7: Pythonではじめる OpenAI Gymトレーニング

OpenAI Gymを体験しよう

Page 8: Pythonではじめる OpenAI Gymトレーニング
Page 9: Pythonではじめる OpenAI Gymトレーニング

OpenAIとOpenAI Gym

OpenAIは、AIの研究を行う非営利の団体です。上記の目標のとおり、AIの研究成果を自己

(特定企業の)利益のためではなく、人類全体のために活用することを目的としています。そ

のためコードも含めた研究成果は広く公開されており、今回紹介するOpenAI Gymもそのうち

の一つになります。9

目標はデジタルインテリジェンスの高度化をできるかぎり人

類全体の利益に資する形で推進すること。それが、経済的

(financial)な利益目的に制約されないことだ。

出資者の一人であるTesraのElon Musk氏

Page 10: Pythonではじめる OpenAI Gymトレーニング

OpenAIとOpenAI Gym

10

Ilya Sutskever氏 Trevor Blackwell氏

Andrej Karpathy氏

所属する研究員の方たちは、Seq2Seqを提案したIlya

Sutskever、Segwayを発明したTrevor Blackwell、画像の

説明文生成を行ったAndrej Karpathなど、泣く子も黙る

世界的に優秀な研究員・エンジニア達が所属。

日本人はまだいないようなので、ぜひ日本人初の

OpenAI研究員を目指そう!

Page 11: Pythonではじめる OpenAI Gymトレーニング
Page 12: Pythonではじめる OpenAI Gymトレーニング

OpenAIとOpenAI Gym

OpenAI Gymは、強化学習を開発、評価するための

プラットフォームです。

強化学習は意思決定を行うための汎用的な仕組

みで応用性が高く、またその精度は近年飛躍的に

高まっています。

OpenAI Gymは、こうした注目を集める強化学習に

おいて標準となる実験・評価環境を提供することを

目的としています。これにより、大規模な画像デー

タセットであるImageNetにより画像分類の研究が発

展したのと同様の効果を狙っています。

12

環境を使うのはもちろん、実験結果をアップロードしたり、他の人の実行結果・実装を見たりすることも出来る

Page 13: Pythonではじめる OpenAI Gymトレーニング

Let’s Try!

ファミリーボクシング(1987)

Page 14: Pythonではじめる OpenAI Gymトレーニング

OpenAI Gymを動かしてみる

インストール方法は公式GitHubページを参照。

Mac/Linux(Ubuntu)が公式だが、Windowsでもbash on Windowsを利用することで動作させる

ことが可能。

利用する「ジム(=学習環境)」によって、必要となるライブラリも異なってくる。これらは、選択

的にインストールすることが可能。

※pip install gymで入るのは必要最低限のもので、Atariのゲーム環境を使う場合はpip

install ‘gym[atari]’といったように指定する

14

Page 15: Pythonではじめる OpenAI Gymトレーニング

OpenAI Gymを動かしてみる

Gymの基本的な使い方は以下の通り。

15

import gym

env = gym.make("CartPole-v0")

for i_episode in range(20):

observation = env.reset()

done = False

while not done:

env.render()

action = env.action_space.sample()

observation, reward, done, info = env.step(action)

Environment(CartPole-v0)

Agent

action

observation, rewarddone (episode

end)

gym

episodeの単位は、各ゲームによって異なる。そのため、gymを使っていきなり強化学習に入るよりは、試しに動かし

てepisodeの単位、actionの意味を調べるのがおすすめ。

Page 16: Pythonではじめる OpenAI Gymトレーニング

Let’s start from simple one

16

まずは簡単なAIを作ってみる

Page 17: Pythonではじめる OpenAI Gymトレーニング

簡単な「AI」を作ってみる

17

Agent Environment

action(フン=左 & フン=右)

observation, reward

Page 18: Pythonではじめる OpenAI Gymトレーニング

簡単な「AI」を作ってみる

18

Agent Environment

action(フン=左 & フン=右)

observation, reward

def test_funfun_defence(self):

env = Environment(env_name="Pong-v0")

agent = CycleAgent((2, 3), keep_length=20)

for episode, step, reward in env.play(agent, episode=1):

pass

Page 20: Pythonではじめる OpenAI Gymトレーニング

簡単な「AI」を作ってみる

20

Page 21: Pythonではじめる OpenAI Gymトレーニング

「AI」の限界

人が設計するアルゴリズムや、人が「正解」を与える教師あり学習

の場合、「人間の限界」がそのままAIの限界になる。

● AIを作る人間がその道のエキスパートとは限らない

● エキスパートであっても、自分の感覚を正しく実装するのはと

ても手間で、困難(途中で→)

この上限を突破するには、「人が教える」という手法から、「AI自ら

学習する」という手法へ切り替える必要がある。

そのための手法の一つが、強化学習になる。

21

Page 22: Pythonではじめる OpenAI Gymトレーニング

「AI」を成長させよう

Page 23: Pythonではじめる OpenAI Gymトレーニング

強化学習というアイデア

人がAIに教えるのでなく、AIが自分自身で学習するようにする。

「評価」はするが、「教育」はしない。

23

評価はしてくれるが、評価基準は教えてくれない。⇒プレイヤー(Agent)自らが発見する必要がある。

Page 24: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化

24

Agentが置かれている状態を、stateとする

state

Agentは、stateで可能な行動=actionをとる。actionは、戦略=policyに従い決定される。

I like right!

actionの結果、新しい状態state’へ遷移すると共に、設定された報酬=rewardを受け取る。

state’

reward

action

Page 25: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化

25

Agentが置かれている状態を、stateとする

state

Agentは、stateで可能な行動=actionをとる。actionは、戦略=policyに従い決定される。

I like right!

actionの結果、新しい状態state’へ遷移すると共に、設定された報酬=rewardを受け取る。

state’

reward

action

Markov Decision Process(MDP)

Page 26: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

26

state

+1

-1

迷路で、以下の位置(state)にいるAgentについて考える

Page 27: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

27

+1

-1action

→:GOAL!(+1でゲーム終了)←:ゴールから遠ざかる↑:その場にとどまる↓:地獄の一丁目へ

state’

state’

state’

state’

Page 28: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

28

+1

-1

そこから、一歩手前の状態について考えてみる。

遷移先(state’)の報酬を使い、現状態(state)からスタートした場合の期待報酬が計算できる・遷移先では、最適な行動をとるとする・遷移先の報酬は将来の報酬のため、割引を行うつまり、「期待報酬=現状態の報酬+割引率×遷移先の最大報酬 」

state state’

Page 29: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

29

s_00

s_10

s_20

s_01

s_21

s_02

s_22

s_03

s_23

s_12 s_13

+1

-1

次に、ゴールまであと2歩の状態まで下がり、同様に報酬を計算する。

遷移先の期待報酬から、現在時点の報酬を計算する(遷移先では、最適な行動をすると仮定する)

Bellman Equation

Page 30: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

30

s_00

s_10

s_20

s_01

s_21

s_02

s_22

s_03

s_23

s_12 s_13

+1

-1

これをn歩前まで・・・と繰り返していくと、期待報酬の地図を作ることができる

Page 31: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

31

まとめ

各状態における、期待報酬の値を0などで初期化する。

各状態で、期待報酬の値を計算する(Bellman Equation)。

計算した期待報酬の値を元に、もう一度計算を行う。

step=1 step=2

... step=n

期待報酬の値が、step前後で変わらなくなってくる(=収束する)。これで計算終了。Agentは、期待報酬が最大の方向に行くようにすればOK!

Page 32: Pythonではじめる OpenAI Gymトレーニング

アイデアのモデル化: 最適化の方法

32

まとめ

各状態における、期待報酬の値を0などで初期化する。

各状態で、期待報酬の値を計算する。

計算した期待報酬の値を元に、もう一度計算を行う。

step=1 step=2

... step=n

期待報酬の値が、step前後で変わらなくなってくる(=収束する)。これで計算終了。あとは、期待報酬が最大の方向に行くようにすればOK!

Value Iteration

Page 33: Pythonではじめる OpenAI Gymトレーニング

We have done it …?

33

これで問題は解決?

Page 34: Pythonではじめる OpenAI Gymトレーニング

Think about Rockman10

34

Page 35: Pythonではじめる OpenAI Gymトレーニング

Question

35

問:今、状態(state)の数はどれだけあったでしょう?

Page 36: Pythonではじめる OpenAI Gymトレーニング

Problem

36

死亡 クリア

状態数多すぎ問題

Start

Page 37: Pythonではじめる OpenAI Gymトレーニング

状態定義の限界

複雑なタスクでは、状態数が多くその全てを列挙することは難しくなってくる。また、当然各状

態の組み合わせの数(状態遷移の数)も爆発的に増える。

⇒Value Iterationで計算しようとすると、永遠に終わらないくらい時間がかかる。

37

今まで:状態の数と、そのつながりが明

らかで、計算可能な程度の量

今:状態の数と遷移数がわけわからんくらい多く

て、計算しきるのはとても無理!

Page 38: Pythonではじめる OpenAI Gymトレーニング

We need new idea

38

どうするか?

Page 39: Pythonではじめる OpenAI Gymトレーニング

未知なる台地なら探索から

puhoto by Moyan Brenn

Page 40: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

40

+1

-1

よくわからないので、とりあえず行動してみる

Page 41: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

41

+1

-1

よくわからないので、とりあえず行動してみる

Page 42: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

42

+1

-1

よくわからないので(以下略)

Page 43: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

43

+1

-1

ぐはぁぁぁぁ!!(ゲーム終了)

Page 44: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

44

+1

-1

遷移先の報酬から期待報酬を計算していく

先の報酬が割り引かれるのは、Value Iteration同様

Page 45: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

45

+1

-1

探索は徐々に行われるので、最初は危ないと思っていたところも実は大きな報酬の近くだった、ということがありうる。⇒一回の探索結果をどれだけ信用するかについては、調整が必要する。

Page 46: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

46

+1

-1

探索(=行動)によって、状態と、その遷移構造を明らかにしていく。また得られた報酬を元に、期待報酬を更新していく。その、探索での更新量はパラメーターで調整する。

行き止まり

Page 47: Pythonではじめる OpenAI Gymトレーニング

探索(=行動)によって、状態と、その遷移構造を明らかにしていく。また得られた報酬を元に、期待報酬を更新していく。ただ、その更新量はパラメーターで調整する。

より複雑なタスクへの挑戦

47

+1

-1

行き止まり

Q-learning

Page 48: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

48

+1

-1

行き止まり

報酬が得られるルートがわかっていても、もっと安全だったり、より報酬が高いルートがあるかもしれない。⇒どれだけ探索をするか、どれだけ探索結果を活用するかのバランスが重要な戦略になる。

Page 49: Pythonではじめる OpenAI Gymトレーニング

より複雑なタスクへの挑戦

49

+1

-1

行き止まり

報酬が高いルートがわかればそれでいいけれども、もっと安全だったり、報酬が高いルートがあるかもしれない。⇒どれだけ探索をするか、どれだけ探索結果を活用するかを割合で決める。

ε-greedy法(random by ε)

Page 50: Pythonではじめる OpenAI Gymトレーニング

We finally made it?

50

これでいけそう?

Page 51: Pythonではじめる OpenAI Gymトレーニング

back to 状態定義の限界

ゲームを含む時系列のタスクでは、そもそも「状態」の境界線があいまい(↓は、果たして「4

つの状態」といえるか?)。

そのため、状態を連続的な値で表現したい。具体的には、以下の場合状態である「画像」を

連続値(ベクトル)で表現したい。

51

Page 52: Pythonではじめる OpenAI Gymトレーニング

back to 状態定義の限界

画像からの特徴抽出といえば・・・

52

Clarifai

Page 53: Pythonではじめる OpenAI Gymトレーニング

Deep Learningとの融合

Page 54: Pythonではじめる OpenAI Gymトレーニング

Convolutional Neural Network

54

Deep Learning界において、「香川といえばうどん」と同じくらい「画像といえばCNN(Convolutional Neural Network)」は当然のこととして扱われている。

Clarifai

CNNは、画像から特徴を抽出して判断するのに優れた手法。これを応用して、以下のような仕組みを構築する。

Page 55: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learning

画像であるstateを、画像処理に優れたConvolutional Neural Network)に流し込み、「その状

態でどのactionがいい(=期待報酬が高い)か」を出力させる。

⇒期待報酬の計算プロセス(Q関数)を、Deep Learningに置き換える。これがつまるところ

・・・55

state 期待報酬

action

A

B

・・

Convolutional Neural Network

Page 56: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learning

※価値関数(Q関数)自体をニューラルネットで近似するアイデアは以前からあったものであ

り、よって学習を成功させる手法まで含めてDQNとよぶ。

DQN(Deep Q-learning)

puhoto by Chloe Muro

Page 57: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningのプロセス

57

・・・

episode(1ゲーム終了までの期間)

experience

・・・

replay

現状態の報酬

遷移先の報酬

新しい期待報酬

誤差⇒DQN更新

DQN

定期的にコピー

行動とその結果(state/action/遷移先state/reward)を記憶

報酬のclipping報酬は-1,0,1に統一する(どんなゲームにも対応できるようにする)

Page 58: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningのプロセス

58

・・・

episode(1ゲーム終了までの期間)

experience

・・・

行動とその結果(state/action/遷移先state/reward)を記憶

replay

現状態の報酬

遷移先の報酬

新しい期待報酬

誤差⇒DQN更新

DQN

定期的にコピー

Fixed Target Q-Network遷移先報酬を計算する際の重みはしばらく固定し、定期的に更新する

Experience Replayexperienceに蓄積したものを、シャッフルして学習データにする。⇒学習データ間の相関を除去する(普通にやると時系列に並んでいるため、強い相関がある)。

Page 59: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningのプロセス

59

・・・

episode(1ゲーム終了までの期間)

experience

・・・

replay

stateの報酬

state’からの期待報酬

探索から算出された期待報酬

誤差⇒DQN更新

DQN

定期的にコピーFixed Target Q-Network遷移先報酬を計算する際の重みはしばらく固定し、定期的に更新する(報酬計算の安定性を高めるため)

Page 61: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

DQNは、結果が出るまでかなり時間がかかる。そのため、実際計算しないとわからないこと

以外は可能な限り事前にテストしておくことが重要。

● 感覚的にパラメーターの影響をかなり受けるため、テストしておかないと処理のミスか

パラメーターのチューニングの問題かわからなくなる。

○ 責務分担・処理の独立化を行い、手元のテストでつぶせるバグはすべてつぶして

おくこと。

○ これを怠ると、GPUの場合お財布、CPUの場合時間に致命的なダメージを負うこ

とになる

● GPUはほぼ必須(CPUの場合、いい感じかどうかわかるのに1~2日はかかる)

○ GPUインスタンスを使おう

○ OpenAI Gymを検証しているといえばAmazonから$250分もらえるらしい

61

Page 62: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

62

Environment(gym)

DQNTrainer

DQNAgent

observation action

train

学習時

observation action

実行時

Trainerが取れるだけ

experience buffer

Q-Network

Environment(gym)

DQNAgent

Q-Network

icoxfog417/chainer_pong

Page 63: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

63

100~250

Page 64: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

64

DQNの実装に必要なコードの行数

Page 65: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

アルゴリズムの実装自体にかかるコードはかなり少なくてすむ(OpenAIのメンバである

Andrej Karpathyさんのブログでは、実装にかかっているのはわずか130行(しかもコメント込

み))。加えて、昨今の機械学習系フレームワークの恩恵も受けられる。

Webアプリケーションを作ったりするより、ぜんぜん少ない行数で実装が可能。

65

Page 66: Pythonではじめる OpenAI Gymトレーニング

Deep Q-learningの実装

66

詳細な実装方法について、ハンズオンを実施する予定です。

Comming Soon!11月上~中旬

Page 67: Pythonではじめる OpenAI Gymトレーニング

おわりに

Page 68: Pythonではじめる OpenAI Gymトレーニング

おわりに

OpenAI Gymは自体は、難しい知識がなくても動かして、試すことができます。数式などを理

解するところからよりも、まず環境に触れてその「面白さ」を体感してもらえればと思います。

その入り口の先にある強化学習は、人による教育の限界を超えるためのアプローチ方法で

あり、最も研究が盛んな領域の一つです(だからこそ投資が行われているとも言えます)。本

日紹介した手法も、将来、また現時点ですでに時代遅れになっているかもしれません。

ただ、ベースとなる本質的な理論(Q-learningなど)は変わっていません。その意味では、本

日セッションに参加いただいた方は、すでにAI研究の一線の入り口に立っています。

68

Page 69: Pythonではじめる OpenAI Gymトレーニング

Welcome to AI World!

puhoto by Rog01

Page 70: Pythonではじめる OpenAI Gymトレーニング

Thank you for listening!