我正在尝试从https://keon.io/deep-q-learning制作深度q学习代理
我的环境如下: https://imgur.com/a/OnbiCtV
如您所见,我的经纪人是一个圆圈,并且有一条带有橙色线条的灰色轨道(奖赏口)。粗线是活动门。 圆圈中的橙色线指向他的方向。
代理具有恒定的速度,可以左右旋转10度或什么也不做
下一张图片是代理商传感器 https://imgur.com/a/Qj7Kesi
他们与特工一起旋转。
状态是从代理到活动门的距离以及传感器的长度。 总共有1 + 7个状态,它是q学习神经网络输入维。
操作将向左转,向右转,什么也不做。
当代理与奖励门相交时,奖励功能返回25;否则,奖励函数将返回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
我尝试了不同类型的模型,每层神经元的数量不同,其他激活和损失函数,丢失,批处理归一化,并且该模型目前效果最好
我尝试了不同的奖励值
此外,我尝试使用静态传感器(它们不随代理旋转) https://imgur.com/a/8eDtQIF(照片上的绿线)
有时候,我的特工设法在撞到边界之前相交了几扇大门。很少有他能穿越一半的赛道,并且在这种设置下,他一次穿越了两圈,然后才卡住。
更多时候,他只在一个地方旋转。
我认为问题在于状态表示或奖励功能。
任何建议将不胜感激