質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

状態や行動のデータのみが分かるゲームの強化学習を行いたいです

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 232

sonai

score 46

前提・実現したいこと

学習しながらゲームを進めることができないようなゲームでも、強化学習によってまともにゲームをプレイできるモデルを作成したいです。
今回はopen ai gymのCartPole-v0(できるだけ長くcartpoleを倒れないようにしようというゲーム)で何回かゲームをプレイ→ゲームのプレイデータから学習→ゲームをプレイ→ゲームのプレイデータから学習→...ということを行っています。
強化学習の方法はDueling Networkを使っていて、コードは「作りながら学ぶ!深層強化学習」(著者:小川雄太郎)の実装コードを参考に作っています(Deep-Reinforcement-Learning-Book)。ReplayMemory,Netクラスはそのままで、Brain,Agentクラスは学習したネットワークとメモリーを保存するように書き換えてあります。Environmentクラスは、Environment_Dクラスがゲームをプレイした際のstate,action,next_state,rewardの情報だけを保存しておくクラス、Environment_Lが保存されたstate,action,next_state,rewardの情報をもとにNetworkが学習するクラスです。

発生している問題

学習が全く進んでいないように思えます。
「作りながら学ぶ!深層強化学習」の実装コードだと、120episode程度学習するとcartpoleを200step以上倒れないように維持することができるのです。しかし、私が行った(10episode分学習したnetworkでプレイ→学習→)というサイクルで学習する場合には1000サイクル(実質10000episode)学習を行っても平均30step程度しか、cartpoleを倒れず維持することができません。これは、学習を全く行っておらず、randomにプレイした場合と同じ程度しか倒れないように維持できていないということです。

該当のソースコード

# CartPoleを実行する環境のクラスです
class Environment_L:

    def __init__(self):
        self.env = gym.make(ENV)  # 実行する課題を設定
        num_states = self.env.observation_space.shape[0]  # 課題の状態と行動の数を設定
        num_actions = self.env.action_space.n  # CartPoleの行動(右に左に押す)の2を取得
        # 環境内で行動するAgentを生成
        self.agent = Agent(num_states, num_actions)

    def run(self):
        '''実行'''
        episode_10_list = np.zeros(10)  # 10試行分の立ち続けたstep数を格納し、平均ステップ数を出力に利用
        complete_episodes = 0  # 195step以上連続で立ち続けた試行数
        episode_final = False  # 最後の試行フラグ
        frames = []  # 最後の試行を動画にするために画像を格納する変数

        for episode in range(NUM_EPISODES):  # 試行数分繰り返す
            filepath = "/content/drive/My Drive/cp/trial_cartpole/cartpole_"+str(episode)+"_"+str(learning_time)+".pkl"
            # Environment_Dで作成したデータの読み込み
            with open(filepath, mode="rb") as f:
                state_action_dic = pickle.load(f)


            for step in range(len(state_action_dic.keys())):# 1エピソードのループ
                state_action_step = state_action_dic[step]
                state      = state_action_step[0]
                action     = state_action_step[1]
                state_next = state_action_step[2]
                reward     = state_action_step[3]

                # メモリに経験を追加
                self.agent.memorize(state, action, state_next, reward)

                # Experience ReplayでQ関数を更新する
                self.agent.update_q_function()

                # 終了時の処理
                if step == len(state_action_dic.keys())-1:
                    episode_10_list = np.hstack((episode_10_list[1:], step + 1))

                    if step > 195:
                        complete_episodes = complete_episodes + 1  # 連続記録を更新

                    # DDQNで追加、2試行に1度、Target Q-NetworkをMainと同じにコピーする
                    if(episode % 2 == 0):
                        self.agent.update_target_q_function()
                    break


            if episode == NUM_EPISODES-1:
                self.agent.save_models()
                break

            # 10連続で200step経ち続けたら成功
            if complete_episodes >= 10:
                print('10回連続成功')
                episode_final = True  # 次の試行を描画を行う最終試行とする


import warnings
warnings.filterwarnings("ignore", category=UserWarning)
import time

cartpole_env_D = Environment_D()
cartpole_env_L = Environment_L()
t1=time.time()
learning_time = 0
for i in range(1000):
    #print("learning_time",learning_time)
    cartpole_env_D.run()
    cartpole_env_L.run()
    learning_time += 1
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • Kaleidoscope

    2020/07/18 16:18

    1サイクルあたりのエピソード回数を増やしてみては?
    1サイクル100回で成果をみて、
    サイクル内では学習できているのであれば、次のサイクルに引き継ぐのが失敗しているということだし、
    サイクル内でも学習できてないなら、Q値の更新のやりかたに問題があるということかと。

    キャンセル

  • sonai

    2020/07/23 20:19

    ご教示ありがとうございます。
    エピソード数を増やしても結果は変わりませんでしたので、
    Q値の更新に問題があるかもしれません。
    Q値を見てみます。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る