2024年2月6日火曜日

OpenAI Gym 改め Gymnasium で強化学習入門

OpenAI Gym 改め Gymnasium で強化学習入門

概要

過去 に軽く強化学習に触れました再度試してみました

OpenAI Gym は Gymnasium というフォークされたライブラリとして運用されていくようです

環境

  • macOS 14.2.1
  • Python 3.11.6
  • Gymnasium 0.29.1

強化学習の概念

基本は以下です

とある環境 (主にゲーム) がありそれに対してエージェントがデータ (observation) を元に報酬 (reward) が最大となるような行動 (action) を繰り返していくのが強化学習の基本になります
なので環境とエージェントがあることが前提になるのでそういったケースでは使える学習方法になります

インストール

  • pipenv install 'gymnasium[box2d]'

box2d は Gymnasium に標準で搭載されている2Dゲームを使用するために指定します

swig が必要なのでない場合には事前にインストールしておきましょう

  • brew install swig

ルナーランダーをランダムに動かす

ゲームの名称です
簡単に言えば特定の場所に正確に着地するゲームです
特に「こういう風に動けばクリア」という条件は与えずに action_space.sample でランダムに動かしているのでゲームを見ていると適当な動きをしていることがわかります

import gymnasium as gym

# 環境(ゲーム)の作成というか呼び出し、render_mode=human は GUI 表示するオプション
env = gym.make("LunarLander-v2", render_mode="human")
# 環境の最初の状態を取得
observation, info = env.reset()

# 1000回思考
for _ in range(1000):
    # とりあえずランダムな行動を取る、action は ActType という型
    action = env.action_space.sample()
    # step で環境に対して何かしらのアクションを送る、その結果次の状態や報酬(結果良い行動だったか悪い行動だったか) を取得します
    observation, reward, terminated, truncated, info = env.step(action)
    # エージェントが終了状態になった場合はリセットして最初の状態に戻す
    if terminated or truncated:
        observation, info = env.reset()

# ゲームの終了
env.close()

学習させる

LunarLander の場合 observation は 8 次元(個) の値が返ってきます
今回はサンプルなのでこの情報を元に action の値を決定します

例えば observation 以下のような値が返ってきます

[ 0.01578617  1.3934271   0.7982909  -0.3827387  -0.01812551 -0.17971858  0.          0.        ]

今回は簡単なサンプルなのではじめの2つの値を使います
これはエージェントの現在の X, Y の値で X の値が大きくなれば右に移動し Y の値が小さくなれば下に移動していることになります

なので X の値が 0 より小さい場合は左に動かし X の値が 0 より大きければ左に動かします

import gymnasium as gym

# 環境(ゲーム)の作成というか呼び出し、render_mode=human は GUI 表示するオプション
env = gym.make("LunarLander-v2", render_mode="human")
# 環境の最初の状態を取得
observation, info = env.reset()

# 1000回思考
for _ in range(1000):
    # X の値 (0番目の値) が 0 より大きければ左へ 0 より小さければ右へ
    if observation[0] > 0:
        action = 1
    else:
        action = 3
    # step で環境に対して何かしらのアクションを送る、その結果次の状態や報酬(結果良い行動だったか悪い行動だったか) を取得します
    observation, reward, terminated, truncated, info = env.step(action)
    # エージェントが終了状態になった場合はリセットして最初の状態に戻す
    if terminated or truncated:
        observation, info = env.reset()

# ゲームの終了
env.close()

これで再度実行してみるとエージェントが旋回しながらではありますが旗と旗の間に落ちていくことがわかるかなと思います

もっと学習させる

本当は機体を安定させつつ旗と旗の間に着陸する必要があります
observation で旋回の情報も取得できるのでそれに応じてアクションをどう変更していくかが鍵になります

また reward も重要で reward は -100 から 100 の値を取ります
100 に近ければ近いほど正しい着陸状態に近いことを示しているのでこの値が 100 に近づくように action を調整することも可能です

これを応用するにはどうすればいいのか

Gymnasium を使っていれば env (ゲーム) がいろいろと用意されているので簡単に env を用意できます
これを Gymnasium なしで実際のコンシューマゲームなどに応用するにはどうすればいいのかという問題があります

一応 Gymnasium 自体に env を自作できる機能があり実装するべきインタフェースも用意されているのでこれを使うのが一番簡単にできそうです (参考gymnasium.Env)
これを使ってこの step が実行されたときには reward はどうなるのかというのを独自で実装してあげれば OK です

ただこれもあくまでもインタフェースだけでありゲームの作成自体は別途行う必要があります
gymnasium.Env を実装した上でゲームとの操作、連携部分や別途作り込みが必要になりそうです

最後に

Gymnasium で強化学習を簡単に動かしてみました
動かすこと自体は非常に簡単です

ただ応用方法を考えるとかなり実装が難しく環境 (ゲーム) の準備やつなぎこみが必要になるのでそこは更なる学習が必要になりそうです
一応公式に独自の環境を構築するチュートリアルもあったので参考サイトに掲載しておきます

参考サイト

0 件のコメント:

コメントを投稿