Сеть Deep Q дает те же значения Q и не улучшается

Я пытаюсь построить глубокую сеть Q, чтобы играть в змею. Я столкнулся с проблемой, когда агент не обучается, и его производительность в конце цикла обучения заключается в многократном самоуничтожении. После небольшой отладки я понял, что значения Q, предсказываемые сетью, каждый раз одинаковы. Пространство действия [вверх, вправо, вниз, влево], и сеть предсказывает [0, 0, 1, 0]. Потери на тренировках со временем уменьшаются, но, похоже, это не имеет значения. Вот тренировочный код:

def train(self):
    tf.logging.set_verbosity(tf.logging.ERROR)
    self.build_model()
    for episode in range(self.max_episodes):
        self.current_episode = episode
        env = SnakeEnv(self.screen)
        episode_reward = 0
        for timestep in range(self.max_steps):
            env.render(self.screen)
            state = self.screenshot()
            #state = env.get_state()
            action = None
            epsilon = self.current_eps
            if epsilon > random.random():
                action = np.random.choice(env.action_space) #explore
            else:
                values = self.policy_model.predict(state) #exploit
                action = np.argmax(values)
            experience = env.step(action)
            if(experience['done'] == True):
                episode_reward += experience['reward']
                break
            episode_reward += experience['reward']
            self.push_memory(Experience(experience['state'], experience['action'], experience['reward'], experience['next_state']))
            self.decay_epsilon(episode)
            if self.can_sample_memory():
                memory_sample = self.sample_memory()
                X = []
                Y = []
                for memory in memory_sample:
                    memstate = memory.state
                    action = memory.action
                    next_state = memory.next_state
                    reward = memory.reward
                    max_q = reward + (self.discount_rate * self.replay_model.predict(next_state)) #bellman equation
                    X.append(memstate)
                    Y.append(max_q)
                X = np.array(X)
                X = X.reshape([-1, 600, 600, 2])
                Y = np.array(Y)
                Y = Y.reshape([self.batch_size, 4])
                self.policy_model.fit(X, Y)
        food_eaten = experience["food_eaten"]
        print("Episode: ", episode, " Total Reward: ", episode_reward, " Food Eaten: ", food_eaten)
        if episode % self.target_update == 0:
            self.replay_model.set_weights(self.policy_model.get_weights())
    self.policy_model.save_weights('weights.hdf5')
    pygame.quit()

Вот сетевая архитектура:

    self.policy_model = Sequential()
    self.policy_model.add(Conv2D(8, (5, 5), padding = 'same', activation = 'relu', data_format = "channels_last", input_shape = (600, 600, 2)))
    self.policy_model.add(Conv2D(16, (5, 5), padding="same", activation="relu"))
    self.policy_model.add(Conv2D(32, (5, 5), padding="same", activation="relu"))
    self.policy_model.add(Flatten())
    self.policy_model.add(Dense(16, activation = "relu"))
    self.policy_model.add(Dense(5, activation = "softmax"))
    rms = keras.optimizers.RMSprop(lr = self.learning_rate) 
    self.policy_model.compile(optimizer = rms, loss = 'mean_squared_error')

Вот гиперпараметры:

learning_rate = 1e-4
discount_rate = 0.99
eps_start = 1
eps_end = .01
eps_decay = 1e-5
memory_size = 100000
batch_size = 2
max_episodes = 1000
max_steps = 100000
target_update = 100

Я позволил ему пройти полные 1000 эпизодов, и в конце это было довольно плохо. Я что-то не так делаю с алгоритмом обучения?

РЕДАКТИРОВАТЬ: Забыл упомянуть, что агент получает вознаграждение в размере 0,5 за поход к еде, 1 за поедание еды и -1 за смерть.

РЕДАКТИРОВАТЬ 2: Просто прочитайте, что некоторые DQN используют стек из 4 последовательных кадров в качестве единого образца. Будет ли это необходимо реализовать для моей среды, учитывая, насколько простыми являются движения?


person achandra03    schedule 30.12.2019    source источник


Ответы (2)


Алгоритмы обучения с подкреплением нуждаются в очень низкой скорости обучения оптимизатора (например, 1.e-4 или ниже), чтобы не учиться слишком быстро и не перегружать подпространство среды (похоже на вашу проблему). Здесь вы, кажется, используете скорость обучения вашего оптимизатора по умолчанию (rmsprop, которая по умолчанию равна 0,001).

Во всяком случае, это может быть возможной причиной :)

person Dany Yatim    schedule 05.01.2020

Обратите внимание на распад эпсилон. Он устанавливает компромисс между разведкой и разведкой с течением времени. Если ваш эпсилон-распад слишком велик, он начнет использовать очень маленькое (неизведанное) пространство пространства действия состояния. По крайней мере у меня большую часть времени раннее сближение в плохой политике было вызвано слишком большим затуханием эпсилон.

person Guinther Kovalski    schedule 05.01.2020