问题描述
我想在不使用DQN和示例与环境交互的情况下训练RL代理。 以我的理解,DQN是一种脱离策略的算法,因此似乎可行。 (我对吗?) 但是,到目前为止,我还没有训练。具体而言,每个状态的argmax值都相同。 (最佳政策应该有所不同。)
我的环境如下:
- 状态:4个状态(
A
,B
,C
,D
) - 动作:3个动作(
Stay
,Up
,Down
) - 奖励和过渡:
B
是终端状态。 (括号中的表示是(状态,动作,奖励,下一个状态)。)- 当您在
Stay
中A
时,您将进入A
并得到0(A
,Stay
,0,A
) - 当您在
Up
中A
时,您将进入B
,并获得0.33(A
,Up
,0.33,B
) - 当您在
Down
中A
时,您将进入A
并得到0(A
,Down
,0,A
) - 当您在
Stay
中B
时,您将进入B
,并获得0.33(B
,Stay
,0.33,B
) - 当您在
Up
中B
时,您将进入C
,并获得0.25(B
,Up
,0.25,C
) - 当您在
Down
中B
时,您将进入A
并得到0(B
,Down
,0,A
) - 当您在
Stay
中C
时,您将进入C
,并获得0.25(C
,Stay
,0.25,C
) - 当您在
Up
中C
时,您将进入D
并获得0.2(C
,Up
,0.2,D
) - 当您在
Down
中C
时,您将进入B
,并获得0.33(C
,Down
,0.33,B
) - 当您在
Stay
中D
时,您将进入D
并获得0.2(D
,Stay
,0.2,D
) - 当您在
Up
中D
时,您将进入D
并获得0.2(D
,Up
,0.2,D
) - 当您在
Down
中D
时,您将进入C
,并获得0.25(D
,Down
,0.25,C
)
- 当您在
我的培训方式:
- 我将上面的每个样本都放在缓冲存储器中。
- 然后我使用DQN进行训练。 (不与环境互动)
其他
- 神经网络
- 两层(输入和输出层。它们之间没有隐藏层)
- 优化器:亚当
- 超参数
- 学习率:0.001
- 批量大小:2到12之间变化
代码屏幕截图
结果
- Result screenshot
- 该列是操作。 (0:
Stay
,1:Up
,2:Down
) - 该行是状态。 (其中有些是不同的,有些是相同的。)
- 每个状态的argmax为1,这不是最佳策略。
- 即使我再运行一次循环,结果也不会改变。
解决方法
对不起,但是我无法发表评论,因此在这里提出建议:
- 尝试添加另一个密集层并增加隐藏节点以更好地泛化;
- 您的系统是确定性的,并且您的可能性很小(因此,提供重放内存的样本也很少),因此,为了使您的系统学习,可能会很有趣地增加时期数(尝试使用200);
- 出于上述相同的原因,添加Dropout可能会有所帮助,但应将其作为补充步骤;
- 随机播放并通过网络多次传递重放内存;
- 对于不太复杂的任务,您的学习速度似乎很小;