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 的新手,我无法从文档中了解为什么会出现此问题。问题是当我 运行 强化学习过程时,
- 第一集总会顺利完成。
- 总是会从模型中成功生成新的观测值。
- 在第二集中,网络会一直输出:[NaN, NaN, NaN]
我发现的一些调试信息应该会有帮助:
如果我注释掉优化行 'grads = tape.gradient(...)' 和 'optimizer.apply_gradients(...)' 脚本将 运行 没有完成错误(尽管如果没有优化它显然没有做任何有用的事情)。这向我表明优化过程正在以导致问题的方式改变模型。我试图只包括必要的调试功能;如果调试可能需要任何进一步的信息,我很乐意在编辑中添加其他信息。
经过数小时的检查和重新检查各种容器后,我意识到是折扣奖励功能无法正常工作,在这种情况下返回 NaN。问题已解决:)
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 的新手,我无法从文档中了解为什么会出现此问题。问题是当我 运行 强化学习过程时,
- 第一集总会顺利完成。
- 总是会从模型中成功生成新的观测值。
- 在第二集中,网络会一直输出:[NaN, NaN, NaN]
我发现的一些调试信息应该会有帮助: 如果我注释掉优化行 'grads = tape.gradient(...)' 和 'optimizer.apply_gradients(...)' 脚本将 运行 没有完成错误(尽管如果没有优化它显然没有做任何有用的事情)。这向我表明优化过程正在以导致问题的方式改变模型。我试图只包括必要的调试功能;如果调试可能需要任何进一步的信息,我很乐意在编辑中添加其他信息。
经过数小时的检查和重新检查各种容器后,我意识到是折扣奖励功能无法正常工作,在这种情况下返回 NaN。问题已解决:)