1.值函数Q的近似
Q表格的作用就是输入(s,a),通过查询Q表格,输出Q值。希望用带参数的函数代替Q表格,
输入一个状态,有多少个动作A就输出多少个Q值。有点觉得像Q-learning
Q-learning
从环境中获取到状态State
查表找到对应的所有动作的Q值
找到最大的Q值,输出其对应的动作给环境
做出动作从环境中拿到下一步的奖励r
当前Q值逼近target-q
DQN
就是用神经网络代替Q表格
更新和训练
输入一个状态,输出对应的Q值,Q值是一个向量,比如[1,2,3,4]这种
经验回放——解决样本利用率低
存储一批经验,然后打乱顺序从中选取一些小的batch去更新网络。
###rpm.append((obs, action, reward, next_obs, done))往经验池中增加经验
class ReplayMemory(object):
def __init__(self, max_size):
self.buffer = collections.deque(maxlen=max_size)
def append(self, exp):
self.buffer.append(exp)
def sample(self, batch_size):
mini_batch = random.sample(self.buffer, batch_size) ##在经验池(obs, action, reward, next_obs, done)中随机取样
obs_batch, action_batch, reward_batch, next_obs_batch, done_batch = [], [], [], [], []
for experience in mini_batch:##将取样的经验条进行分解
s, a, r, s_p, done = experience
obs_batch.append(s)
action_batch.append(a)
reward_batch.append(r)
next_obs_batch.append(s_p)
done_batch.append(done)
return np.array(obs_batch).astype('float32'), \
np.array(action_batch).astype('float32'), np.array(reward_batch).astype('float32'), \
np.array(next_obs_batch).astype('float32'), np.array(done_batch).astype('float32')
def __len__(self):
return len(self.buffer)
固定Q目标——解决算法不稳定
需要定期的去拷贝网络,把target_Q中的maxQ内容固定住
DQN流程图
learn函数就是实现了红色的部分(Q预测与Q目标结合求解LOSS,再去更新Q网络)