a3c 强化学习中 -5000 到 5000 的 12 个输入需要多少神经网络深度
How much deep a Neural Network Required for 12 inputs of ranging from -5000 to 5000 in a3c Reinforcement Learning
我正在尝试将 A3C 与 LSTM 一起用于状态有 12 个输入的环境,范围从 -5000 到 5000。
我正在使用大小为 12 的 LSTM 层,然后使用大小为 256 的 2 个完全连接的隐藏层,然后 1 个 fc 用于 3 个动作暗淡,1 个 fc 用于 1 个值函数。
奖励在 (-1,1) 范围内。
然而在最初的训练中,我无法取得好成绩。
我的问题是——这个神经网络对这种环境是否足够好。
下面是 Actor Critic 的代码
class ActorCritic(torch.nn.Module):
def __init__(self, params):
super(ActorCritic, self).__init__()
self.state_dim = params.state_dim
self.action_space = params.action_dim
self.hidden_size = params.hidden_size
state_dim = params.state_dim
self.lstm = nn.LSTMCell(state_dim, state_dim)
self.lstm.bias_ih.data.fill_(0)
self.lstm.bias_hh.data.fill_(0)
lst = [state_dim]
for i in range(params.layers):
lst.append(params.hidden_size)
self.hidden = nn.ModuleList()
for k in range(len(lst)-1):
self.hidden.append(nn.Linear(lst[k], lst[k+1]))
for layer in self.hidden:
layer.apply(init_weights)
self.critic_linear = nn.Linear(params.hidden_size, 1)
self.critic_linear.apply(init_weights)
self.actor_linear = nn.Linear(params.hidden_size, self.action_space)
self.actor_linear.apply(init_weights)
self.train()
def forward(self, inputs):
inputs, (hx, cx) = inputs
inputs = inputs.reshape(1,-1)
hx, cx = self.lstm(inputs, (hx, cx))
x = hx
for layer in self.hidden:
x = torch.tanh(layer(x))
return self.critic_linear(x), self.actor_linear(x), (hx, cx)
class Params():
def __init__(self):
self.lr = 0.0001
self.gamma = 0.99
self.tau = 1.
self.num_processes = os.cpu_count()
self.state_dim = 12
self.action_dim = 3
self.hidden_size = 256
self.layers = 2
self.epochs = 10
self.lstm_layers = 1
self.lstm_size = self.state_dim
self.num_steps = 20
self.window = 50
因为你有 12 个输入所以确保你没有使用太多参数,也尝试改变激活函数。
我不使用 Torch,所以我无法理解模型架构。
为什么你的第一层是 LSTM?你的数据是时间序列吗?
尝试只使用密集层,
- 1 Dense 只有 12 个神经元和输出层
- 2 个密集层,每个层有 12 个神经元和输出层
至于激活函数使用leaky relu,因为你的数据是-5000,或者你只需要在所有数据样本上加5000就可以使你的数据为正。
我正在尝试将 A3C 与 LSTM 一起用于状态有 12 个输入的环境,范围从 -5000 到 5000。 我正在使用大小为 12 的 LSTM 层,然后使用大小为 256 的 2 个完全连接的隐藏层,然后 1 个 fc 用于 3 个动作暗淡,1 个 fc 用于 1 个值函数。 奖励在 (-1,1) 范围内。
然而在最初的训练中,我无法取得好成绩。
我的问题是——这个神经网络对这种环境是否足够好。
下面是 Actor Critic 的代码
class ActorCritic(torch.nn.Module):
def __init__(self, params):
super(ActorCritic, self).__init__()
self.state_dim = params.state_dim
self.action_space = params.action_dim
self.hidden_size = params.hidden_size
state_dim = params.state_dim
self.lstm = nn.LSTMCell(state_dim, state_dim)
self.lstm.bias_ih.data.fill_(0)
self.lstm.bias_hh.data.fill_(0)
lst = [state_dim]
for i in range(params.layers):
lst.append(params.hidden_size)
self.hidden = nn.ModuleList()
for k in range(len(lst)-1):
self.hidden.append(nn.Linear(lst[k], lst[k+1]))
for layer in self.hidden:
layer.apply(init_weights)
self.critic_linear = nn.Linear(params.hidden_size, 1)
self.critic_linear.apply(init_weights)
self.actor_linear = nn.Linear(params.hidden_size, self.action_space)
self.actor_linear.apply(init_weights)
self.train()
def forward(self, inputs):
inputs, (hx, cx) = inputs
inputs = inputs.reshape(1,-1)
hx, cx = self.lstm(inputs, (hx, cx))
x = hx
for layer in self.hidden:
x = torch.tanh(layer(x))
return self.critic_linear(x), self.actor_linear(x), (hx, cx)
class Params():
def __init__(self):
self.lr = 0.0001
self.gamma = 0.99
self.tau = 1.
self.num_processes = os.cpu_count()
self.state_dim = 12
self.action_dim = 3
self.hidden_size = 256
self.layers = 2
self.epochs = 10
self.lstm_layers = 1
self.lstm_size = self.state_dim
self.num_steps = 20
self.window = 50
因为你有 12 个输入所以确保你没有使用太多参数,也尝试改变激活函数。 我不使用 Torch,所以我无法理解模型架构。 为什么你的第一层是 LSTM?你的数据是时间序列吗? 尝试只使用密集层,
- 1 Dense 只有 12 个神经元和输出层
- 2 个密集层,每个层有 12 个神经元和输出层
至于激活函数使用leaky relu,因为你的数据是-5000,或者你只需要在所有数据样本上加5000就可以使你的数据为正。