深層強化学習入門: TensorFlow で初めてのゲーム AI を構築する

深層強化学習入門: TensorFlow で初めてのゲーム AI を構築する

[[210667]]

昨年、DeepMindのAlphaGoは世界囲碁チャンピオンのイ・セドルを4対1で破った。強化学習が世界の舞台に登場した様子を、2億人を超える視聴者が視聴しました。数年前、DeepMind は Atari のゲームをプレイできるロボットを開発して話題を呼んだ。同社はすぐにGoogleに買収された。

多くの研究者は、強化学習が汎用人工知能を生み出すための最善の方法であると考えています。これは多くの未解決の課題と大きな可能性を秘めた刺激的な分野です。

強化学習は最初は非常に難しいように思えるかもしれませんが、実際に始めるのは難しくありません。この記事では、キャッチゲームをプレイできるシンプルな Keras ベースのボットを作成します。

キャッチゲーム

[[210668]]

オリジナルのキャッチゲームインターフェース

キャッチは、子供の頃に遊んだことがあるかもしれない非常にシンプルなアーケード ゲームです。ゲームのルールは次のとおりです。果物が画面の上から落ちてくるので、プレイヤーはバスケットでそれをキャッチする必要があります。キャッチした果物ごとに、プレイヤーは 1 ポイントを獲得します。逃した果物ごとに、プレイヤーは 1 ポイントを失います。ここでの目標は、コンピューターが自力でキャッチゲームをプレイできるようにすることです。ただし、このような美しいゲームインターフェースは使用しません。代わりに、タスクを簡素化するために、ゲームの簡略化されたバージョンを使用します。

簡素化されたキャッチゲームインターフェース

キャッチゲームをプレイする場合、プレイヤーは 3 つの可能なアクションの中から選択します。プレイヤーはバスケットを左、右に動かしたり、静止させたりすることができます。この決定はゲームの現在の状態によって異なります。つまり、果物がどこに落ちるか、バスケットの位置によって異なります。私たちの目標は、ゲーム画面の内容に基づいて、最高スコアをもたらすアクションを選択するモデルを作成することです。

このタスクは単純な分類問題として考えることができます。ゲームの専門家にゲームを複数回プレイしてもらい、その行動を記録します。その後、ゲームの専門家がプレイする方法と同様に、「正しい」アクションを選択することでモデルをトレーニングできます。

しかし、これは実際には人間が学習する方法ではありません。人間は、何の指導も受けずにキャッチボールのようなゲームを自分で学ぶことができます。これはとても便利です。 「キャッチ」のような簡単なゲームを習得したいたびに、そのゲームを何千回もプレイする専門家チームを雇わなければならないとしたらどうでしょう。これは必然的に非常に高価で時間がかかります。

強化学習では、モデルはラベル付けされたデータに基づいてトレーニングされるのではなく、過去の経験を通じてトレーニングされます。

深層強化学習

強化学習は行動心理学にヒントを得ています。モデルに「正しい」動作を与える代わりに、報酬とペナルティを与えます。モデルは、環境の現在の状態 (コンピューター ゲーム画面など) に関する情報を取得します。すると、ゲーム コントローラーと同じようにアクションが出力されます。環境はこのアクションに応答し、次の状態と報酬または罰の行動を提供します。

[[210670]]

そこからモデルは学習し、報酬を最大化するアクションを探します。

実際には、これを行う方法はたくさんあります。次に、Q学習について見てみましょう。 Q-Learning は、コンピューターに Atari ゲームをプレイするようトレーニングするために使用されたときに大きな話題を呼びました。今日でも、Q 学習は依然として非常に重要な概念です。最新の強化学習アルゴリズムのほとんどは、Q 学習の改良版です。

Q学習を理解する

Q 学習を理解する良い方法は、キャッチゲームとチェスゲームを比較することです。

どちらのゲームでも、状態 S が与えられます。チェスでは、これは盤上の駒の位置を表します。キャッチゲームでは、これは果物とバスケットの位置を表します。

次に、プレイヤーは A と呼ばれるアクションを実行します。チェスでは、プレイヤーは駒を動かします。キャッチゲームでは、バスケットを左、右に動かすか、現在の位置に維持することを意味します。これに基づいて、報酬 R と新しい状態 S' が得られます。

キャッチゲームとチェスの共通点の 1 つは、アクションの直後に報酬が現れないという点です。

キャッチゲームでは、果物がバスケットに落ちるか、床に落ちた場合にのみ報酬が得られます。チェスでは、ゲーム全体の勝敗が決まった後にのみ報酬が与えられます。これは報酬がまばらに分配されることを意味します。ほとんどの場合、R はゼロのままです。

生成される報酬は必ずしも前のアクションの結果ではありません。おそらく、ずっと以前にとられた何らかの行動が勝利の鍵だったのでしょう。最終的な報酬の原因となるアクションを特定することは、多くの場合、クレジット割り当て問題と呼ばれます。

報酬は遅れて得られる性質があるため、優れたチェス プレイヤーは、最もすぐに目に見える報酬だけに基づいて動きを選択することはありません。代わりに、彼らは予想される将来の報酬を考慮し、それに基づいて選択を行います。たとえば、次の動きで相手の駒の 1 つを除去できるかどうかだけを考慮するのではなく、また、長期的に見て有益な行動も検討します。

Q 学習では、最も高い将来の報酬が期待されるものに基づいてアクションを選択します。この計算には Q 関数を使用します。この数学関数は、ゲームの現在の状態と指定されたアクションという 2 つの変数を取ります。したがって、これをQ(状態、アクション)として記録できます。状態 S では、各可能なアクション A の報酬を推定します。アクション A を実行して次の状態 S' に入った後、すべてが完璧であると想定します。

与えられた状態SとアクションAに対して、期待される将来の報酬Q(S,A)は、即時の報酬Rとその後の期待される将来の報酬Q(S',A')の合計として計算されます。次のアクションA'が最適であると仮定します。

将来の不確実性のため、Q(S', A')に係数γを掛けて割り引きます。

Q(S,A) = R + γ * 最大Q(S',A')

チェスの名人は将来の報酬を頭の中で予測するのが得意です。言い換えれば、Q関数Q(S,A)は非常に正確です。ほとんどのチェスのトレーニングは、より優れた Q 関数の開発を中心に行われます。プレイヤーはチェスのマニュアルを使用して、特定の動きがどのように発生するか、また特定の動きが勝利につながる可能性がどの程度あるかを学びます。しかし、機械はどのようにして Q 関数の品質を評価するのでしょうか?ここでニューラル ネットワークが役立ちます。

最終申告

ゲームをプレイするとき、次のような部分を含む多くの「体験」があります。

  • 初期状態、S
  • 取られた措置、A
  • 受け取った報酬、R
  • 次の状態、S'

これらの経験が私たちのトレーニングデータとなります。 Q(S,A)を推定する問題を回帰問題として定義することができます。この問題を解決するには、ニューラル ネットワークを使用できます。 S と A からなる入力ベクトルが与えられた場合、ニューラル ネットワークは Q(S, A) の値がターゲット R + γ * max Q(S', A') に等しいと予測できる必要があります。

異なる状態Sと異なるアクションAに対するQ(S, A)を非常に正確に予測できれば、Q関数を非常に正確に近似することができます。 Q(S, A)と同じニューラルネットワークを介してQ(S', A')を推定することに注意してください。

トレーニングプロセス

一連の経験 <S、A、R、S'> が与えられた場合、トレーニング プロセスは次のようになります。

  1. それぞれの可能なアクション A' (左、右、アクションなし) について、ニューラル ネットワークを使用して、予想される将来の報酬 Q(S'、A') を予測します。
  2. 3つの期待される将来の報酬の最大値をmax Q(S', A')として選択します。
  3. ニューラルネットワークの目標値であるr + γ * max Q(S', A')を計算します。
  4. 損失関数を使用してニューラル ネットワークをトレーニングします。損失関数は、予測値と目標値の間の距離を計算します。ここでは、損失関数として0.5 * (predicted_Q(S,A) — target)²を使用します。

ゲーム中、すべての体験はリプレイメモリに保存されます。これは、<S、A、R、S'> ペアを格納する単純なキャッシュのようなものです。これらのエクスペリエンス リプレイ クラスは、トレーニング データを準備するためにも使用できます。次のコードを見てみましょう。

  1. クラスExperienceReplay(オブジェクト):
  2. 「」 「
  3. ゲームプレイ中、すべての経験 < s、a、r、s' > はリプレイ メモリ保存されます。
  4. トレーニングではランダムに抽出された経験バッチを使用して、トレーニング入力ターゲットが生成されます
  5. 「」 「
  6. def __init__(self、max_memory=100、discount=.9):
  7. 「」 「
  8. 設定
  9. max_memory:保存したいエクスペリエンス最大数
  10. 記憶:経験リスト
  11. 割引:将来の経験に対する割引率
  12.          
  13. メモリには、ゲームがその状態終了したかどうかの情報がネストされた配列別々に保存されます
  14. [...
  15. [経験、ゲームオーバー]
  16. [経験、ゲームオーバー]
  17. ...]
  18. 「」 「
  19. 自己.max_memory = 最大メモリ
  20. 自己メモリ = リスト()
  21. self.discount = 割引
  22.  
  23. def remember(self, states, game_over):
  24. #状態をメモリ保存する
  25. self.memory.append([状態、ゲームオーバー])
  26. #無限のメモリを保存したくないので、多すぎる場合は、最も古いものを削除します
  27. len(self.memory) > self.max_memoryの場合:
  28. del self.memory[0]
  29.  
  30. def get_batch(self, モデル, batch_size=10):
  31.          
  32. #私たちにはいくつの経験があるでしょうか?
  33. len_memory = len(自己メモリ)
  34.          
  35. #ゲーム内で実行可能なアクション数を計算する
  36. num_actions = モデル.output_shape[-1]
  37.          
  38. #ゲームフィールド寸法
  39. env_dim = 自己.メモリ[0][0][0].形状[1]
  40.          
  41. #私たち 観測された状態からの入力を含む入力ベクトルターゲット ベクトルを返します...
  42. 入力 = np.zeros(( min (len_memory, batch_size), env_dim))
  43.          
  44. #...そしてターゲットr + gamma * max Q(s',a')
  45. #ターゲットは行列であり、可能フィールド のみ 取られた行動に対してだけでなく
  46. # 他の可能なアクションについては、アクションは予測同じ値を取りませ  影響を与えない
  47. ターゲット = np.zeros((inputs.shape[0], num_actions))
  48.          
  49. #学習する州をランダム選びます
  50. i , idx in enumerate(np.random.randint(0, len_memory,
  51. サイズ=inputs.shape[0])):
  52. 「」 「
  53. ここで、メモリから1つの遷移<s, a, r, s'>をロードします
  54. state_t: 初期状態s
  55. action_t:実行されたアクション
  56. reward_t: 獲得した報酬 r
  57. state_tp1: s'に続く状態
  58. 「」 「
  59. state_t、action_t、reward_t、state_tp1 = self.memory[idx][0]
  60.              
  61. #ゲームがこの状態終了したかどうかも知る必要があります
  62. ゲームオーバー = 自己メモリ[idx][1]
  63.  
  64. #入力状態sを追加する
  65. 入力[i:i+1] = state_t
  66.              
  67. #まず目標を入力します モデル予測と一致します。
  68. # トレーニングによる影響を受けません(トレーニング損失0なので
  69. ターゲット[i] = model.predict(state_t)[0]
  70.              
  71. 「」 「
  72. ゲームが終了した場合、期待報酬Q(s,a)は最終報酬rになるはずです。
  73. それ以外の場合、目標値はr + gamma * max Q(s',a')です
  74. 「」 「
  75. # ここで Q_samax_a 'Q(s' , a')です
  76. Q_sa = np.max (モデル予測(state_tp1)[0])
  77.              
  78. #ゲームが終了した場合、報酬は最終報酬となります
  79. if game_over: # game_over場合 真実 
  80. ターゲット[i, action_t] = reward_t
  81. それ以外
  82. # r + ガンマ *最大Q(s',a')
  83. ターゲット[i, action_t] = reward_t + self.discount * Q_sa
  84. 入力、ターゲットを返す

モデルの定義

それでは、Q 学習を使用してキャッチ ゲームを学習するためのモデルを定義しましょう。 Tensorflow のフロントエンドとして Keras を使用します。私たちのベースライン モデルは、シンプルな 3 層の高密度ネットワークです。このモデルは、キャッチ ゲームのシンプルなバージョンでうまく機能します。完全な実装は GitHub でご覧いただけます。

より複雑なモデルを試して、より良いパフォーマンスを実現できるかどうかを確認することもできます。

  1. num_actions = 3 # [左に移動、そのまま、右に移動]
  2. hidden_​​size = 100 #サイズ 隠れた層
  3. grid_size = 10 #サイズ 競技場
  4.  
  5. def baseline_model(グリッドサイズ、アクション数、隠しサイズ):
  6. #kerasモデルをセットアップする
  7. モデル = シーケンシャル()
  8. モデルを追加します(Dense(hidden_​​size, input_shape=(grid_size**2,), activation= 'relu' ))
  9. モデルを追加します(Dense(hidden_​​size, activation= 'relu' ))
  10. model.add((num_actions))
  11. モデルをコンパイルします(sgd(lr=.1)、 "mse" )
  12. リターンモデル

探検する

Q 学習の最後の要素は探索です。日々の生活は、日常の行動よりも良いことがあるかどうかを知るために、時には奇妙なことやランダムなことをしなければならないということを教えてくれます。

Q学習でも同様です。常に最善の選択をするということは、これまで探索したことのない道を見逃してしまう可能性があることを意味します。これを避けるために、学習者はランダムな項目を追加することがありますが、必ずしも最適な項目が追加されるとは限りません。トレーニング方法は次のように定義できます。

  1. def train(モデル,エポック):
  2. # 電車
  3. #勝利カウンターのリセット
  4. 勝利数 = 0
  5. # AI進捗状況時間経過とともに追跡したいので、勝利回数の履歴を保存します
  6. 勝利履歴 = []
  7. #エポックは私たちがプレイするゲームです
  8. e範囲(エポック)内である場合:
  9. 損失 = 0。
  10. #ゲームのリセット
  11. env.reset()
  12. game_over = False  
  13. # 初期入力を取得する
  14. 入力t = env.observe()
  15.          
  16. ゲームオーバーではない場合:
  17. #学習者は最後観察したゲーム画面行動している
  18. #input_tはゲーム画面を表すベクトルです
  19. 入力tm1 = 入力t
  20.              
  21. #ランダムなアクションを実行する 確率イプシロン
  22. np.random.rand() <= epsilon の場合:
  23. #メニューからランダムに何か食べる
  24. アクション= np.random.randint(0, num_actions,サイズ= 1)
  25. それ以外
  26. #自分で選ぶ
  27. #qには、アクションに対する期待報酬が含まれます
  28. q = モデル.予測(input_tm1)
  29. #私たちが行動を選ぶ 最も高い期待報酬
  30. アクション= np.argmax(q[0])
  31.  
  32. #アクションを適用し、報酬新しい状態を取得します
  33. input_t、報酬、game_over = env.act(アクション)
  34. #果物を捕まえることができたら、勝利カウンター1を加えます
  35. 報酬 == 1 の場合:
  36. 勝利数 += 1
  37.              
  38. #ここでゲームをレンダリングするには、コメントを解除します
  39. #display_screen(アクション,3​​000,入力[0])
  40.              
  41. 「」 「
  42. ゲームプレイ中に得られる経験 < s、a、r、s' > がトレーニング データになります。
  43. ここではまず前回の経験を保存し  それから モデルをトレーニングするために、一連経験をロードする
  44. 「」 「
  45.              
  46. #店舗体験
  47. exp_replay.remember([input_tm1,アクション, 報酬, input_t], ゲームオーバー)
  48.              
  49. #エクスペリエンスバッチをロードする
  50. 入力、ターゲット = exp_replay.get_batch(モデル、batch_size=batch_size)
  51.    
  52. #経験に基づいてモデルをトレーニングする
  53. batch_loss = model.train_on_batch(入力、ターゲット)
  54.              
  55. #エポック内のすべてのバッチの損失を合計します
  56. 損失 += バッチ損失
  57. win_hist.append(win_cnt)
  58. win_histを返す

このゲーム ボットを 5000 エポックにわたってトレーニングしたところ、パフォーマンスが非常に良好でした。

ロボットの動きを捉える

上の GIF でわかるように、ロボットは空から落ちてくるリンゴをキャッチできます。このモデルの学習プロセスを視覚化するために、各エポックの勝利の移動平均をプロットしたところ、次のようになりました。

次に何をすればいいでしょうか?これで、強化学習についての基本的な直感が得られました。完全なコードについてはチュートリアルを参照することをお勧めします。ぜひお試し下さい。

<<:  AI大学院生は年間50万元を稼ぐことができるが、彼らの給料は学校を卒業する前からすでに奪われている。

>>:  今週の Github の人気プロジェクトの概要: 自然言語処理 Python ライブラリ spaCy が最もホットです!

ブログ    
ブログ    

推薦する

デジタルツインブレイン:生物と人工知能の架け橋

人間の脳の構造にヒントを得た神経科学と AI 技術の最近の一連の進歩により、知性の謎を解き明かす新た...

人工知能のヒューマニズム:AIをより愛らしくする方法

1. デジタル格差が拡大し、高齢者は「デジタル難民」となっている最近、高齢者に関する2つのニュース...

...

いつ仕事を辞めるかを予測できる 9 つの AI 活用例

[51CTO.com 速訳] 人工知能は今や脂身の多い肉となり、誰もがそれを利用し、人工知能の真髄を...

OpenAI と Mistral AI によって人気を博した MoE の背景にあるストーリーとは?ハイブリッドアーキテクチャの導入に関する包括的なガイド

専門家の混合 (MoE) は、LLM の効率性と精度を向上させるためによく使用される手法です。このア...

マッキンゼーのパートナー、カレル・エルート氏:「3×Simpler」は産業用ロボットのユーザーエクスペリエンスを向上させます

2年前、イタリアのテノール歌手アンドレア・ボチェッリがイタリアのピサにあるヴェルディ劇場でルッカ・フ...

...

...

...

図解による古典的なプロセススケジューリングアルゴリズム

[[382804]]この記事はWeChatの公開アカウント「Flying Veal」から転載したもの...

...

あなたは本当に3Dプリントを理解していますか?

3D プリントビジネスは近年継続的に発展しており、一般の人々の間でますます人気が高まっています。最...

人工知能とモノのインターネットがスマートライフを推進

AI と IoT テクノロジーがスマート シティにどのような革命をもたらしているか。人工知能 (AI...

パブリッククラウドが新興技術の開発をどのように促進するか

今日、クラウド コンピューティングが新興テクノロジーの主要な推進力となっていることは間違いありません...

...