在 a3c 强化学习中,从 -5000 到 5000 的 12 个输入需要多深的神经网络

Posted

技术标签:

【中文标题】在 a3c 强化学习中,从 -5000 到 5000 的 12 个输入需要多深的神经网络【英文标题】:How much deep a Neural Network Required for 12 inputs of ranging from -5000 to 5000 in a3c Reinforcement Learning 【发布时间】:2020-11-21 12:56:00 【问题描述】:

我正在尝试将 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

【问题讨论】:

【参考方案1】:

由于您有 12 个输入,因此请确保不要使用太多参数,还可以尝试更改激活函数。 我不使用 Torch,所以我无法理解模型架构。 为什么你的第一层是 LSTM?你的数据是时间序列吗? 尝试仅使用 Dense 层,

1 Dense 只有 12 个神经元和输出层 2 个密集层,每个层有 12 个神经元和输出层

至于激活函数使用leaky relu,因为您的数据是-5000,或者您可以通过将5000添加到所有数据样本来使您的数据为正。

【讨论】:

您好,感谢您的回答。是的,我的数据是连续的。如果我使用大小为 100 的输入 dim,您能否告诉我隐藏层的大小应该是多少 隐藏层通常具有等于特征数量的神经元,如果您输入有 100 个样本和 12 个特征,则使用 10 到 20 之间的神经元,因为有 12 个特征。 如果你的数据有 100 个特征,那么使用 50 到 200 个之间的神经元,看看哪个表现更好。神经元的数量越少越好,但有时您需要更多的神经元来处理数据中的复杂关系,但更多的神经元会导致过度拟合。

以上是关于在 a3c 强化学习中,从 -5000 到 5000 的 12 个输入需要多深的神经网络的主要内容,如果未能解决你的问题,请参考以下文章

并行梯度下降+A2C (A3C)

DRL 教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏

强化学习篇--强化学习从初识到应用

强化学习环境升级 - 从gym到Gymnasium

强化学习 double DQN 代码注释解析

强化学习 double DQN 代码注释解析