Tensorflow Reinforcement Learning RNN, возвращающий NaN после оптимизации с помощью GradientTape - PullRequest
1 голос
/ 25 мая 2020
def create_example_model():
    tf.keras.backend.set_floatx('float64')
    model = Sequential()
    model.add(LSTM(128, input_shape=((60, len(df_train.columns)))))

    model.add(Dense(64, activation='relu'))

    model.add(Dense(3, activation=None))

    return model

def choose_action(model, observation):
    observation = np.expand_dims(observation, axis=0)

    logits = model.predict(observation)

    prob_weights = tf.nn.softmax(logits).numpy()

    action = np.random.choice(3, size=1, p=prob_weights.flatten())[0]

    return action

def train_step(model, optimizer, observations, actions, discounted_rewards):
    with tf.GradientTape() as tape:

        logits = model(observations)

        loss = compute_loss(logits, actions, discounted_rewards)

        grads = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(grads, model.trainable_variables))

learning_rate = 1e-3
optimizer = tf.keras.optimizers.Adam(learning_rate)
env = TradingEnv(rnn_ready_array)

model = create_example_model()
memory = Memory()
info_list = []

for i_episode in range(10):
    observation = env.reset()
    memory.clear()

    while True:
        action = choose_action(model, observation)
        next_observation, reward, done, info = env.step(action)
        info_list.append(info)
        memory.add_to_memory(observation, action, reward)
        if done:
            total_reward = sum(memory.rewards)
            train_step(model, optimizer,
                 observations=np.array(memory.observations),
                 actions=np.array(memory.actions),
                 discounted_rewards = discount_rewards(memory.rewards))

            memory.clear()
            break
        observation = next_observation

Я работаю над проектом обучения с подкреплением с помощью Tensorflow 2.0; формат кода взят из онлайн-курса MIT, который я пытаюсь адаптировать к своему собственному проекту. Я новичок в Tensorflow 2.0 и не могу понять из документации, почему возникает эта проблема. Проблема в том, что когда я запускаю процесс обучения с подкреплением,

  1. Первый эпизод всегда будет успешно завершен.
  2. Новое наблюдение всегда будет успешно генерироваться из модели.
  3. Во время второго эпизода сеть всегда будет выводить: [NaN, NaN, NaN]

Некоторая отладочная информация, которую я обнаружил, должна быть полезной: если я закомментирую оценки строк оптимизации = tape.gradient (...) 'и' optimizer.apply_gradients (...) 'сценарий будет работать до завершения без ошибок (хотя он, очевидно, не делает ничего полезного без оптимизации). Это указывает мне на то, что процесс оптимизации изменяет модель таким образом, чтобы вызвать проблему. Я постарался включить только необходимые функции для отладки; если есть дополнительная информация, которая может понадобиться для отладки, я буду рад добавить дополнительную информацию в редактирование.

1 Ответ

0 голосов
/ 28 мая 2020

После нескольких часов проверки и перепроверки различных контейнеров я понял, что это была функция дисконтированных вознаграждений, которая не работает должным образом, возвращая NaN в этом случае. Проблема решена :)

...