最近,我在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的培训效率以获得最佳结果?
答案 0 :(得分:1)
与我期望的相反,较简单的模型比另一个模型具有更好的结果。即使RNN可以更好地处理时间序列数据。
在极点中没有时间序列,状态包含最佳决策所需的所有信息。例如,如果您要从图像中学习,并且需要从一系列图像中估计极速,那将是不同的。
同样,更复杂的模型应该表现得更好也不是事实。相反,它更可能过度拟合。对于极点,您甚至都不需要NN,具有RBF或随机傅立叶特征的简单线性近似器就足够了。对于这样一个简单的问题,RNN + LSTM无疑是过大的选择。