簡體   English   中英

Tensorflow 強化學習 RNN 在使用 GradientTape 優化后返回 NaN

[英]Tensorflow Reinforcement Learning RNN returning NaN's after Optimization with GradientTape

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 進行強化學習項目; 代碼格式來自麻省理工學院的一個在線課程,我正在嘗試適應我自己的項目。 我是 Tensorflow 2.0 的新手,我無法從文檔中了解為什么會出現此問題。 問題是當我運行強化學習過程時,

  1. 第一集總是會成功完成。
  2. model 總是會成功生成新的觀察結果。
  3. 在第二集中,網絡總是會 output: [NaN, NaN, NaN]

我發現一些調試信息應該會有所幫助:如果我注釋掉優化行 'grads = tape.gradient(...)' 和 'optimizer.apply_gradients(...)' 腳本將運行完成無錯誤(盡管沒有優化它顯然沒有做任何有用的事情)。 這向我表明優化過程正在以導致問題的方式更改 model。 我試圖只包含調試所需的功能; 如果調試時可能需要任何進一步的信息,我很樂意在編輯中添加其他信息。

經過數小時檢查和重新檢查各種容器后,我意識到打折獎勵 function 無法正常工作,在這種情況下返回 NaN。 問題解決了:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM