深度 Q 学习 - Cartpole 环境
Deep Q Learning - Cartpole Environment
我担心将 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,在这种情况下,学习如何?
self.model.predict(state)
将 return 形状为 (1, 2) 的张量,其中包含每个动作的估计 Q 值(在 cartpole 中,动作 space 是 {0,1} ).
如您所知,Q 值是衡量预期奖励的指标。
通过设置 self.model.predict(state)[0][action] = target
(其中目标是预期的奖励总和),它正在创建一个目标 Q 值来训练模型。然后调用 model.fit(state, train_target)
它使用目标 Q 值来训练所述模型以近似每个状态的更好 Q 值。
不明白为什么说loss变成0:target设置为rewards的discounted sum加上当前reward
target = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
而最高Q值的网络预测是
np.amax(self.model.predict(next_state)[0])
目标值和预测值之间的损失用于训练模型。
编辑 - 更详细的解释
(可以忽略预测值的[0],因为它只是访问正确的列,理解上并不重要)
target 变量设置为当前奖励与未来奖励的估计总和之间的总和,或 Q 值。请注意,此变量称为 target 但它不是网络的目标,而是所选操作的目标 Q 值。
train_target 变量用作您所说的“数据集”。它代表网络的目标。
train_target = self.model.predict(state)
train_target[0][action] = target
你可以清楚地看到:
train_target[<taken action>] = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
train_target[<any other action>] = <prediction from the model>
损失(均方误差):
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 值。查看 为什么。
我担心将 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,在这种情况下,学习如何?
self.model.predict(state)
将 return 形状为 (1, 2) 的张量,其中包含每个动作的估计 Q 值(在 cartpole 中,动作 space 是 {0,1} ).
如您所知,Q 值是衡量预期奖励的指标。
通过设置 self.model.predict(state)[0][action] = target
(其中目标是预期的奖励总和),它正在创建一个目标 Q 值来训练模型。然后调用 model.fit(state, train_target)
它使用目标 Q 值来训练所述模型以近似每个状态的更好 Q 值。
不明白为什么说loss变成0:target设置为rewards的discounted sum加上当前reward
target = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
而最高Q值的网络预测是
np.amax(self.model.predict(next_state)[0])
目标值和预测值之间的损失用于训练模型。
编辑 - 更详细的解释
(可以忽略预测值的[0],因为它只是访问正确的列,理解上并不重要)
target 变量设置为当前奖励与未来奖励的估计总和之间的总和,或 Q 值。请注意,此变量称为 target 但它不是网络的目标,而是所选操作的目标 Q 值。
train_target 变量用作您所说的“数据集”。它代表网络的目标。
train_target = self.model.predict(state)
train_target[0][action] = target
你可以清楚地看到:
train_target[<taken action>] = reward + self.gamma*np.amax(self.model.predict(next_state)[0])
train_target[<any other action>] = <prediction from the model>
损失(均方误差):
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 值。查看