0

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

多个 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()])

在尝试实现梯度上升时,通过“翻转”梯度(作为负损失还是反向损失?),我尝试了各种损失定义:

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

但这些都会产生错误的操作数 [for unary] 错误。

如何适应当前的 Keras 模型以最大化奖励?或者这种梯度上升甚至不是问题?行动政策可能有问题吗?

4

1 回答 1

1

编写自定义损失函数

这是你想要的损失函数

@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()。那不是错字。这是因为您需要传递函数,而不是执行函数的结果。

于 2020-11-23T00:56:26.950 回答