已经构建了一个以可变长度序列作为输入的强化学习 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()])
在尝试实现梯度上升时,通过“翻转”梯度(作为负损失还是反向损失?),我尝试了各种损失定义:
loss=-'mse'
loss=-tf.keras.losses.MeanSquaredError()
loss=1/tf.keras.losses.MeanSquaredError()
但这些都会产生错误的操作数 [for unary] 错误。
如何适应当前的 Keras 模型以最大化奖励?或者这种梯度上升甚至不是问题?行动政策可能有问题吗?