写作目的
看莫烦的强化学习代码,因为基础太差,就是听不懂,于是自己从头到尾扣了一遍理解,感觉清晰多了,感觉这倒是一个学习的好方法。
另,大家真的都能听懂吗,没有神经网络基础的纯小白那种。。。。。我是不是应该先啃一啃神经网络。。
不过真的感谢莫烦,不然我会更难,有时间想从头补一补
区别
q_learning使用q_table 记录下各状态的q值,适用于状态离散的情况(静态)
DQN需要一个网络,相当于函数,需要q值时临时生成(动态)
def choose_action(self, observation):
# to have batch dimension when feed into tf placeholder
observation = observation[np.newaxis, :]
if np.random.uniform() < self.epsilon:
# forward feed the observation and get q_value for every actions
#%%%%%%%%%%%就是这里%%%%%%%%%%%%%%%%%%%
actions_value = self.sess.run(self.q_eval, feed_dict={self.s: observation})
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
action = np.argmax(actions_value)
else:
action = np.random.randint(0, self.n_actions)
return action
算法理解
1、随机初始化网络,二者参数完全一样
2、先学习200轮,得到每一步动作,状态,奖励,后来的状态
每次选动作,都是通过一次网络,得到一个q_value,根据策略选动作,然后做动作得到下一状态、奖励和结束标志。这些信息存放进记忆仓库
3、到学习步开始学习:
-
先检查是否到更新步(不是更新步学习估计网络,更新步更新现实网络)
-
估计网络参数更新:
1、随机选择部分记忆batch_memory(和之前选择的动作无关,只是学习历史数据)
2、q_next即把下一状态放进fix网络里的q值(想要的是其中最大的值),q_eval把此时状态放进网络得q值(估计值)
(q值为上下左右的评分值,按记忆时间排序)
3、q_target先取估计网络的q_eval,再把相应动作位改成真实值(根据公式)
4、此时q_target-q_eval即误差,可投入网络训练 -
训练网络
1、把batch_memory投入网络,用q_target作为真实q,计算loss,以此训练 估计网络
2、记录此次训练的平均损失
代码链接
https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/DQN3/#学习