我正在尝试从https://keon.io/deep-q-learning制作深度 q-learning 代理
我的环境如下所示: https ://imgur.com/a/OnbiCtV
如您所见,我的代理人是一个圆圈,并且有一条带有橙色线条的灰色轨道(奖励门)。粗线是活动门。圆圈中的橙色线指向他的方向。
代理具有恒定的速度,它可以向左/向右转 10 度或什么也不做
下一张图片是代理传感器 https://imgur.com/a/Qj7Kesi
他们与代理一起旋转。
状态是从代理到活动门的距离和传感器的长度。总共有 1+7 个状态,它是 q-learning 神经网络输入维度。
行动是左转,右转,什么都不做。
当代理与奖励门相交时,奖励函数返回 25;125 当代理与最后一个门相交时;-5 如果代理与轨道边界相交如果都没有,奖励函数比较代理到当前状态和下一个状态的活动门的距离:
如果当前状态距离 > 下一个状态距离:返回 0.1 否则返回 -0.1
此外,DQNAgent 具有负面、正面和中性记忆。如果奖励为-5,(状态,动作,奖励,next_state,完成)转到负记忆,如果奖励> = 25,则为正,否则为中性
那是因为当我形成小批量进行训练时,我从中性记忆中随机抽取 20 个样本,其中 6 个来自正样本,6 个来自负样本。
每次代理与轨道边界相交或被卡住超过 30 秒时,我都在进行训练(重播),代理从头开始。这是我的模型
model = Sequential()
model.add(Dense(64, input_dim=self.state_size,activation='relu',
kernel_initializer=VarianceScaling(scale=2.0)))
model.add(Dense(32,
activation='relu',kernel_initializer=VarianceScaling(scale=2.0)))
model.add(Dense(self.action_size, activation='linear'))
model.compile(loss=self._huber_loss,
optimizer=Adam(lr=self.learning_rate))
return model
我尝试了不同类型的模型,每层不同数量的神经元,其他激活和损失函数,dropout,批量归一化,这个模型现在效果最好
我尝试了不同的奖励值
另外,我尝试使用静态传感器(它们不与代理一起旋转) https://imgur.com/a/8eDtQIF(照片上的绿线)
有时我的代理人会在到达边界之前设法穿过几个大门。他很少能跑过一半的赛道,有一次,在这个设置下,他跑了两圈才卡住。
更多的时候,他只在一个地方旋转。
我认为问题在于状态表示或奖励函数。
任何建议,将不胜感激