为什么多层Perceprons在CartPole中优于RNN?

时间:2019-05-27 17:29:26

标签: pytorch recurrent-neural-network reinforcement-learning openai-gym

最近,我在CartPole-v0环境中比较了两种DQN模型。其中一个是具有3层的多层感知器,另一个是由LSTM和1个完全连接的层构成的RNN。我有一个大小为200000的体验重播缓冲区,并且直到它被填满,培训才开始。 尽管MLP已通过合理数量的训练步骤解决了该问题(这意味着在最近100集中获得195的平均奖励),但RNN模型无法尽快收敛,其最大平均奖励甚至也没有达到195!

我已经尝试增加批处理大小,将更多神经元添加到LSTM'S隐藏状态,增加RNN'S序列长度并使完全连接的层变得更复杂-但每次尝试均以失败告终,因为我看到平均回报存在巨大波动,因此该模型几乎没有融合。难道这些都是过早过拟合的声音吗?

class DQN(nn.Module):
    def __init__(self, n_input, output_size, n_hidden, n_layers, dropout=0.3):
        super(DQN, self).__init__()

        self.n_layers = n_layers
        self.n_hidden = n_hidden

        self.lstm = nn.LSTM(input_size=n_input,
            hidden_size=n_hidden,
            num_layers=n_layers,
            dropout=dropout,
            batch_first=True)

        self.dropout= nn.Dropout(dropout)

        self.fully_connected = nn.Linear(n_hidden, output_size)

    def forward(self, x, hidden_parameters):
        batch_size = x.size(0)

        output, hidden_state = self.lstm(x.float(), hidden_parameters)

        seq_length = output.shape[1]

        output1 = output.contiguous().view(-1, self.n_hidden)
        output2 = self.dropout(output1)
        output3 = self.fully_connected(output2)

        new = output3.view(batch_size, seq_length, -1)
        new = new[:, -1]

        return new.float(), hidden_state

    def init_hidden(self, batch_size, device):
        weight = next(self.parameters()).data

        hidden = (weight.new(self.n_layers, batch_size, self.n_hidden).zero_().to(device),
            weight.new(self.n_layers, batch_size, self.n_hidden).zero_().to(device))

        return hidden

与我所期望的相反,较简单的模型比其他模型具有更好的结果;即使RNN被认为在处理时间序列数据方面更好。

有人可以告诉我这是什么原因吗?

此外,我必须指出,我没有应用任何要素工程,并且DQN都使用了原始数据。在使用归一化功能时,RNN能否胜过MLP? (我的意思是为两个模型提供标准化数据)

有什么可以推荐我的方法来提高RNN的培训效率以获得最佳结果?

1 个答案:

答案 0 :(得分:1)

  

与我期望的相反,较简单的模型比另一个模型具有更好的结果。即使RNN可以更好地处理时间序列数据。

在极点中没有时间序列,状态包含最佳决策所需的所有信息。例如,如果您要从图像中学习,并且需要从一系列图像中估计极速,那将是不同的。

同样,更复杂的模型应该表现得更好也不是事实。相反,它更可能过度拟合。对于极点,您甚至都不需要NN,具有RBF或随机傅立叶特征的简单线性近似器就足够了。对于这样一个简单的问题,RNN + LSTM无疑是过大的选择。