0

따라서 tensorflow를 사용하여 deepQ 구현을 사용하여 CartPole-v0을 해결할 수 있지만 때때로 출력 (전체 실행의 40 %)이 9에 고정되어 있습니다. tf.set_random_seed,하지만 여전히 출력이 멈추지 않을 것을 보장하지는 않습니다. 이건 내 코드입니다 : 내가 GD, rmsProp에 최적화 변경 시도CartPole에 대해 9로 고정 된 Deep Q 스코어

from collections import deque 
import tensorflow as tf 
import numpy as np 
import random 
import gym 
import matplotlib.pyplot as plt 
import pickle 
from time import time 
t = int(time()) 
class DQNAgent: 

    def __init__(self, state_size, action_size): 
     self.state_size = state_size 
     self.action_size = action_size 
     self.memory = deque(maxlen = 2000) 
     self.gamma = 0.95 
     #self.epsilon = 1.0 
     #self.epsilon_min = 0.01 
     #self.epsilon_decay = 0.995 
     self.learning_rate = 0.001 
     self.model = self._build_model() 

    def _build_model(self): 
     graph = tf.Graph() 
     with graph.as_default(): 
      inp = tf.placeholder(tf.float32, [None, self.state_size]) 
      out = tf.placeholder(tf.float32, [None, self.action_size]) 
      w1 = tf.Variable(tf.truncated_normal([self.state_size, 24])) 
      b1 = tf.Variable(tf.zeros([24])) 

      hidden = tf.nn.tanh(tf.matmul(inp, w1) + b1) 

      w2 = tf.Variable(tf.truncated_normal([24, 24])) 
      b2 = tf.Variable(tf.zeros([24])) 

      hidden1 = tf.nn.tanh(tf.matmul(hidden, w2) + b2) 

      w3 = tf.Variable(tf.truncated_normal([24, 24])) 
      b3 = tf.Variable(tf.zeros([24])) 

      hidden2 = tf.nn.tanh(tf.matmul(hidden1, w3) + b3) 

      wo = tf.Variable(tf.truncated_normal([24, self.action_size])) 
      bo = tf.Variable(tf.zeros([self.action_size])) 

      prediction = tf.matmul(hidden2, wo) + bo 

      loss = tf.losses.mean_squared_error(out, prediction) 
      train = tf.train.AdamOptimizer().minimize(loss) 
      init = tf.global_variables_initializer() 

     return graph, inp, out, prediction, train, init 

    def remember(self, state, action, reward, next_state, done): 
     self.memory.append((state, action, reward, next_state, done)) 

    def act(self, state, sess): 
     act_values = sess.run(self.model[3], feed_dict = { self.model[1]: state}) 
     return np.argmax(act_values[0]) 

    def replay(self, batch_size, sess): 
     try: 
      minibatch = random.sample(self.memory, batch_size) 
     except ValueError: 
      minibatch = self.memory 
     for state, action, reward, next_state, done in minibatch: 
      target = reward 
      if not done: 
       target = reward + self.gamma * np.amax(sess.run(self.model[3], feed_dict = { self.model[1]: next_state})) 
      target_f = sess.run(self.model[3], feed_dict = { self.model[1]: state}) 
      target_f[0][action] = target 
      #print(target_f) 
      sess.run(self.model[4], feed_dict = { self.model[1]: state, self.model[2]: target_f}) 

if __name__ == "__main__": 
    environment = 'CartPole-v0' 
    env = gym.make(environment) 
    avgs = deque(maxlen = 50) 
    rewardLA = [] 
    agent = DQNAgent(env.observation_space.shape[0], env.action_space.n) 
    sess = tf.Session(graph = agent.model[0]) 
    sess.run(agent.model[5]) 
    episodes = 10000 
    rewardL = [] 
    for e in range(episodes): 
     state = env.reset() 
     state = np.reshape(state, [1, 4]) 
     for time_t in range(500): 
      #env.render() 
      action = agent.act(state, sess) 
      next_state, reward, done, _ = env.step(action) 
      next_state = np.reshape(next_state, [1, 4]) 
      agent.remember(state, action, reward, next_state, done) 
      state = next_state 
      if done: 
       break 
     avgs.append(time_t) 
     rewardLA.append(sum(avgs)/len(avgs)) 
     print("episode: ", e, "score: ", time_t) 
     rewardL.append(time_t) 
     agent.replay(32, sess) 
    #pickle.dump(rewardL, open(environment + "_" + str(t) + "_rewardL.pickle", "wb")) 
    plt.plot(rewardLA) 
    plt.show() 

,하지만 아무것도 작동,하지만 난 단순히 코드를 다시 시작하면, 그것은 잘 작동 (200 신 (新) 시대에, 199에 도달). 왜 이런 일이 일어나는 걸까요? 어떻게 수정해야합니까?

답변

1

코드를 보면 환경이 어떻게 탐색되는지 알 수 없습니다. 탐사가 일어나기 위해서 엡실론 같은 욕심이 필요하지 않습니까? 예를 들어, 다음과 같이 agent.act() 메서드를 수정하려고 시도했지만 문제가 해결 된 것으로 보입니다.

def act(self, state, sess, episode): 
    if random.random() < math.pow(2, -episode/30): 
     return env.action_space.sample() 

    act_values = sess.run(self.model[3], feed_dict = { self.model[1]: state}) 
    return np.argmax(act_values[0]) 

더 나은 용어가없는 30 번을 가지고 놀아 라. 나는 "탐구 상수"라고 부른다.

어쨌든 엡실론 탐욕 (또는 시간이 지남에 따라 쇠퇴하는 것과 같은)이 없다면 신경망 출력에 의존하여 충분한 엔트로피가 충분한 탐사를 유발할 수 있습니다. 때로는 그럴 수도 있습니다. 다른 시간 아닙니다.

관련 문제