前提・実現したいこと
学習しながらゲームを進めることができないようなゲームでも、強化学習によってまともにゲームをプレイできるモデルを作成したいです。
今回は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にプレイした場合と同じ程度しか倒れないように維持できていないということです。
該当のソースコード
Python3
1# CartPoleを実行する環境のクラスです 2class Environment_L: 3 4 def __init__(self): 5 self.env = gym.make(ENV) # 実行する課題を設定 6 num_states = self.env.observation_space.shape[0] # 課題の状態と行動の数を設定 7 num_actions = self.env.action_space.n # CartPoleの行動(右に左に押す)の2を取得 8 # 環境内で行動するAgentを生成 9 self.agent = Agent(num_states, num_actions) 10 11 def run(self): 12 '''実行''' 13 episode_10_list = np.zeros(10) # 10試行分の立ち続けたstep数を格納し、平均ステップ数を出力に利用 14 complete_episodes = 0 # 195step以上連続で立ち続けた試行数 15 episode_final = False # 最後の試行フラグ 16 frames = [] # 最後の試行を動画にするために画像を格納する変数 17 18 for episode in range(NUM_EPISODES): # 試行数分繰り返す 19 filepath = "/content/drive/My Drive/cp/trial_cartpole/cartpole_"+str(episode)+"_"+str(learning_time)+".pkl" 20 # Environment_Dで作成したデータの読み込み 21 with open(filepath, mode="rb") as f: 22 state_action_dic = pickle.load(f) 23 24 25 for step in range(len(state_action_dic.keys())):# 1エピソードのループ 26 state_action_step = state_action_dic[step] 27 state = state_action_step[0] 28 action = state_action_step[1] 29 state_next = state_action_step[2] 30 reward = state_action_step[3] 31 32 # メモリに経験を追加 33 self.agent.memorize(state, action, state_next, reward) 34 35 # Experience ReplayでQ関数を更新する 36 self.agent.update_q_function() 37 38 # 終了時の処理 39 if step == len(state_action_dic.keys())-1: 40 episode_10_list = np.hstack((episode_10_list[1:], step + 1)) 41 42 if step > 195: 43 complete_episodes = complete_episodes + 1 # 連続記録を更新 44 45 # DDQNで追加、2試行に1度、Target Q-NetworkをMainと同じにコピーする 46 if(episode % 2 == 0): 47 self.agent.update_target_q_function() 48 break 49 50 51 if episode == NUM_EPISODES-1: 52 self.agent.save_models() 53 break 54 55 # 10連続で200step経ち続けたら成功 56 if complete_episodes >= 10: 57 print('10回連続成功') 58 episode_final = True # 次の試行を描画を行う最終試行とする 59 60 61import warnings 62warnings.filterwarnings("ignore", category=UserWarning) 63import time 64 65cartpole_env_D = Environment_D() 66cartpole_env_L = Environment_L() 67t1=time.time() 68learning_time = 0 69for i in range(1000): 70 #print("learning_time",learning_time) 71 cartpole_env_D.run() 72 cartpole_env_L.run() 73 learning_time += 1 74
あなたの回答
tips
プレビュー