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

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

新規登録して質問してみよう
ただいま回答率
85.50%
強化学習

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

Python 3.x

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

Q&A

解決済

1回答

649閲覧

強化学習の報酬の問題について

退会済みユーザー

退会済みユーザー

総合スコア0

強化学習

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

Python 3.x

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

0グッド

0クリップ

投稿2019/07/21 08:33

python3

1 def train(self, iterations, checkpoint, spread, pip_cost): 2 for i in range(iterations): 3 position = 3 4 total_pip = 0.0 5 max_pip = 0 6 pip = [0] 7 self.pip = 0 8 spread = spread / pip_cost 9 mean_pip = 0.0 10 trade_accuracy = 0.0 11 done = False 12 state = self.get_state(0) 13 states = [] 14 p = [] 15 print(mean_pip) 16 for t in range(0, len(self.trend)-1, self.skip): 17 if (self.T_COPY + 1) % self.COPY == 0: 18 pass 19# self._assign('actor-original', 'actor-target') 20# self._assign('critic-original', 'critic-target') 21 22 action = self._select_action(state) 23 next_state = self.get_state(t + 1) 24 25 if action == 0: 26 if position == 3: 27 states = [self.trend[t] + spread] 28 position = 1 29 elif position == 1: 30 states.append(self.trend[t] + spread) 31 position = 1 32 elif position == 2: 33 p = [(s - self.trend[t]) * pip_cost for s in states] 34 for b in p: 35 b = np.asanyarray([-40.0]) if b <= -40 else b 36 pip.extend(b.tolist()) 37 self.pip = np.asanyarray(pip) 38 self.pip[np.isnan(self.pip)] = 0 39 states = [self.trend[t] + spread] 40 position = 1 41 p = [] 42 43 44 elif action == 1: 45 if position == 3: 46 states = [self.trend[t] - spread] 47 position = 2 48 elif position == 2: 49 states.append(self.trend[t] - spread) 50 position = 2 51 elif position == 1: 52 p = [(self.trend[t] - s) * pip_cost for s in states] 53 for b in p: 54 b = np.asanyarray([-40.0]) if b <= -40 else b 55 pip.extend(b.tolist()) 56 self.pip = np.asanyarray(pip) 57 self.pip[np.isnan(self.pip)] = 0 58 59 states = [self.trend[t] - spread] 60 position = 2 61 p = [] 62 63 total_pip = np.sum(self.pip) 64# total_pip = np.float(total_pip) 65 if max_pip <= total_pip: 66 max_pip = total_pip 67 68 if max_pip > total_pip: 69 s = max_pip - total_pip 70 if s < -600: 71 total_pip = -600 72 done = True 73 74 if total_pip < -600: 75 done = True 76 77 mean_pip = total_pip / (t + 1) 78 79 self._memorize(state, action, mean_pip, next_state, done) 80 batch_size = min(len(self.MEMORIES), self.BATCH_SIZE) 81 state = next_state 82 replay = random.sample(self.MEMORIES, batch_size) 83 cost = self._construct_memories_and_train(replay) 84# self.T_COPY += 1 85# self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i) 86 if done == True: 87 break 88 trade_accuracy = np.mean(self.pip > 0) 89 self.trade = trade_accuracy 90 mean_pip *= 1440 91 print('trade accuracy = ', trade_accuracy) 92 print('epoch: %d, total rewards: %f, cost: %f, mean rewards: %f' % (i + 1, total_pip, cost, mean_pip)) 93

上記コードでの報酬が以下の写真のようになります。

イメージ説明

報酬がこのようになる原因がわかる方は是非教えてください。

アクションの決定は以下のコードになります。

python3

1 def _select_action(self, state): 2 # BoltzmannQPolicy 3 prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X: [state]})[0] 4 prediction = prediction.astype("float64") 5 tau=1.0 6 clip=(-500.0, 500.0) 7 8 exp_values = np.exp(np.clip(prediction / tau, clip[0], clip[1])) 9 probs = exp_values / np.sum(exp_values) 10 action = np.random.choice(range(self.OUTPUT_SIZE), p=probs) 11 12 if action != (0 or 1 or 2): 13 action = np.argmax(prediction) 14 15# if np.random.rand() < self.EPSILON: 16# action = np.random.randint(self.OUTPUT_SIZE) 17# else: 18# prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X: [state]})[0] 19# action = np.argmax(prediction) 20 return action

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

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

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

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

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

amahara_waya

2019/07/24 00:20

状況再現のため、コードをコピペするだけで実行できるレベルのコードにしてもらえると幸いです。 具体的には、__init__部分、get_state関数、_memorize関数、train関数の引数(iterations,・checkpoint・ spread・ pip_cost)定義などを追記してください。
guest

回答1

0

ベストアンサー

これが本当に正しいのかわかりませんが、アクションの決定の際に低確率でランダム選択することによって、報酬はそこも出変化せず、1つのアクションを選ばないという状況を解決しました。

例:アクション選択の確率(time step 全体をで) アクションが2この場合
probs = [0.0, 1.0]

python

1 e = 0.999 2 if np.random.rand() < e: 3 prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X: [state]})[0] 4 prediction = prediction.astype("float64") 5 tau=2.0 6 clip=(-500.0, 500.0) 7 8 exp_values = np.exp(np.clip(prediction / tau, clip[0], clip[1])) 9 probs = exp_values / np.sum(exp_values) 10 self.probs = probs 11 action = np.random.choice(range(self.OUTPUT_SIZE), p=probs) 12 else: 13 action = np.random.randint(self.OUTPUT_SIZE) 14 return action

以下が報酬の出力です。

イメージ説明

投稿2019/07/30 05:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問