如何在 Keras DQN 中实现梯度上升

How to implement gradient ascent in a Keras DQN

已经构建了一个强化学习 DQN,以可变长度序列作为输入,并为动作计算正负奖励。我在 Keras 中的 DQN 模型存在一些问题,这意味着尽管该模型运行,但随着时间的推移,在单个和多个 epsilon 周期内,平均奖励会减少。即使经过长时间的培训,这也不会改变。

我的想法是,这是由于在 Keras 中使用 MeanSquareError 作为损失函数(最小化误差)。所以我正在尝试实施梯度上升(以最大化奖励)。如何在 Keras 中执行此操作?我目前的型号是:

model = Sequential()
inp = (env.NUM_TIMEPERIODS, env.NUM_FEATURES)
model.add(Input(shape=inp))  # 'a shape tuple(integers), not including batch-size
model.add(Masking(mask_value=0., input_shape=inp))

model.add(LSTM(env.NUM_FEATURES, input_shape=inp, return_sequences=True))
model.add(LSTM(env.NUM_FEATURES))
model.add(Dense(env.NUM_FEATURES))
model.add(Dense(4))

model.compile(loss='mse,
              optimizer=Adam(lr=LEARNING_RATE, decay=DECAY),
              metrics=[tf.keras.losses.MeanSquaredError()])

在尝试实现梯度上升时,通过'flipping'梯度(作为负损失或逆损失?),我尝试了各种损失定义:

loss=-'mse'    
loss=-tf.keras.losses.MeanSquaredError()    
loss=1/tf.keras.losses.MeanSquaredError()

但是这些都会产生错误的操作数[对于一元]错误。

如何调整当前的 Keras 模型以最大化奖励? 或者这种梯度上升甚至不是问题?会不会是操作策略有问题?

编写自定义损失函数

这是你想要的损失函数

@tf.function
def positive_mse(y_true, y_pred):
    return -1 * tf.keras.losses.MSE(y_true, y_pred)

然后你的编译行变成

model.compile(loss=positive_mse,
          optimizer=Adam(lr=LEARNING_RATE, decay=DECAY),
          metrics=[tf.keras.losses.MeanSquaredError()])

请注意:使用 loss=positive_mse 而不是 loss=positive_mse()。那不是错字。这是因为你需要传递的是函数,而不是函数执行的结果。