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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Keras-RL

Keras-RLは、Kerasを用いてDQNなどの深層強化学習アルゴリズムを実装したライブラリです。学習する強化学習の環境をOpenAI Gymのインターフェースに準じて作成することが必要です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

693閲覧

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

sonai

総合スコア47

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Keras-RL

Keras-RLは、Kerasを用いてDQNなどの深層強化学習アルゴリズムを実装したライブラリです。学習する強化学習の環境をOpenAI Gymのインターフェースに準じて作成することが必要です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2020/07/04 14:34

編集2020/07/05 15:05

前提・実現したいこと

学習しながらゲームを進めることができないようなゲームでも、強化学習によってまともにゲームをプレイできるモデルを作成したいです。
今回は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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kaleidoscope

2020/07/18 07:18

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

2020/07/23 11:19

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問