【问题标题】:Deep Q Learning - Cartpole Environment深度 Q 学习 - Cartpole 环境
【发布时间】:2021-08-18 17:52:31
【问题描述】:

我担心将 Cartpole 代码理解为深度 Q 学习的示例。 DQL Agent部分代码如下:

class DQLAgent:
def __init__(self, env):
    # parameter / hyperparameter
    self.state_size = env.observation_space.shape[0]
    self.action_size = env.action_space.n
    
    self.gamma = 0.95
    self.learning_rate = 0.001 
    
    self.epsilon = 1  # explore
    self.epsilon_decay = 0.995
    self.epsilon_min = 0.01
    
    self.memory = deque(maxlen = 1000)
    
    self.model = self.build_model()
    
    
def build_model(self):
    # neural network for deep q learning
    model = Sequential()
    model.add(Dense(48, input_dim = self.state_size, activation = "tanh"))
    model.add(Dense(self.action_size,activation = "linear"))
    model.compile(loss = "mse", optimizer = Adam(lr = self.learning_rate))
    return model

def remember(self, state, action, reward, next_state, done):
    # storage
    self.memory.append((state, action, reward, next_state, done))

def act(self, state):
    # acting: explore or exploit
    if random.uniform(0,1) <= self.epsilon:
        return env.action_space.sample()
    else:
        act_values = self.model.predict(state)
        return np.argmax(act_values[0])

def replay(self, batch_size):
    # training
    if len(self.memory) < batch_size:
        return
    minibatch = random.sample(self.memory,batch_size)
    for state, action, reward, next_state, done in minibatch:
        if done:
            target = reward 
        else:
            target = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
        train_target = self.model.predict(state)
        train_target[0][action] = target
        self.model.fit(state,train_target, verbose = 0)
        
def adaptiveEGreedy(self):
    if self.epsilon > self.epsilon_min:
        self.epsilon *= self.epsilon_decay

在训练部分,我们找到了我们的目标和train_target。那么为什么我们在这里设置train_target[0][action] = target呢?

学习时做出的每一个预测都是不正确的,但是由于误差计算和反向传播,在网络末端做出的预测会越来越接近,但是当我们在这里制作train_target[0][action] = target时,错误变成了0,并且在这种情况下,学习如何?

【问题讨论】:

    标签: reinforcement-learning dqn


    【解决方案1】:

    self.model.predict(state) 将返回一个形状为 (1, 2) 的张量,其中包含每个动作的估计 Q 值(在 cartpole 中,动作空间是 {0,1})。 如您所知,Q 值是对预期回报的衡量。

    通过设置self.model.predict(state)[0][action] = target(其中目标是预期的奖励总和),它创建了一个目标 Q 值,用于训练模型。然后调用model.fit(state, train_target),它正在使用目标 Q 值来训练所述模型,以便为每个状态逼近更好的 Q 值。

    我不明白你为什么说损失变为0:目标设置为奖励的折扣总和加上当前奖励

    target = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
    

    而最高 Q 值的网络预测是

    np.amax(self.model.predict(next_state)[0])
    

    目标值和预测值之间的损失是用来训练模型的。

    编辑 - 更详细的解释

    (你可以忽略[0]对预测值,因为它只是访问正确的列,在理解上并不重要)

    目标变量设置为当前奖励与未来奖励估计总和之间的总和,或Q值。请注意,此变量称为 target,但它不是网络的目标,而是所选操作的目标 Q 值。

    train_target 变量用作所谓的“数据集”。它代表网络的目标。

    train_target = self.model.predict(state)
    train_target[0][action] = target
    

    你可以清楚地看到:

    • train_target[&lt;taken action&gt;] = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
    • train_target[&lt;any other action&gt;] = &lt;prediction from the model&gt;

    损失(均方误差):

    prediction = self.model.predict(state)
    loss = (train_target - prediction)^2
    

    对于任何不是 的行,损失为 0。对于已设置的一行,损失为

    (target - prediction[action])^2
    

    ((reward + self.gamma*np.amax(self.model.predict(next_state)[0])) - self.model.predict(state)[0][action])^2
    

    明显不同于 0。


    请注意,此代理并不理想。我强烈建议使用目标模型,而不是那样创建目标 Q 值。查看this answer 了解原因。

    【讨论】:

    • 从你写出来我就一直在想你的答案,但是我的脑海里仍然没有弄清楚这个问题。我们已经有了经过训练的 Q 值,即 train_target。我认为 trained_target 是我们的预测。如果我们将其类似于深度学习,我们也已经有了类似于数据集的 target。而损失为:(target-prediction)^2 即(target-train_target)^2 .所以我还是没看懂train_target[0][action] = target部分培训。 @gekrone
    • 我会尽量让自己更清楚,看看编辑过的问题,如果你理解,请告诉我
    • 非常感谢!现在我明白了在你回答之前我误解了什么。 @gekrone
    • 对不起,当我再次考虑时,还有一点让我感到困惑。我们这么说; train_target[0][action] = targetself.model.predict(state)[0][action]=target。然后,loss=(target - self.model.predict(state)[0][action])^2。它是 loss=(target - target)^2 。这就是让我认为损失为 0 的点。@gekrone
    • 当您执行 train_target[0][action] = target 时,您只是在更改 train_target,它是一个变量。您没有直接更改您的模型(这也是不可能的),只是其输出的副本。所以self.model.predict(state)[0][action] 不是目标,它是您的当前模型(在特定操作上)的预测 q 值。
    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多