强化学习Q-Learning和DQN算法
1 Q-Learning
强化学习中有state
和action
的两个重要概念。而Q-Learning算法就是用来得到在state
上执行action
的未来预期奖励。具体的算法流程如下:
- 初始化一个Q-table。
- 在当前状态\(s\)选择一个动作\(a\)。
- 执行动作\(a\),转移到新的状态\(s'\)。
- 计算执行结果的奖励\(r\)。
- 计算Q值,并更新Q-table,然后继续执行2。
这里要注意的点是Q值不等于奖励值\(r\)。具体的公式是:
- \(Q(s,a)\),表示当前在状态\(s\)上执行动作\(a\)的Q值。
- \(R(s,a)\),表示当前在状态\(s\)上执行动作\(a\)的Reward值。
- \(\max_{a'}{Q(s',a')}\),表示在新状态\(s'\)上的最大的Q值(没错,考虑所有action的情况)。
- \(\alpha\),是学习率(learning rate)。
- \(\gamma\),是折扣率(discount rate)。
当完成最终的迭代后,我们会得到一个完整的Q-table。理论上大小是一个\(state \times action\)。每一种\(Q(s,a)\)都可以从中查到。而选取动作的策略一般就是取Q值最大的action。
2 DQN (Deep Q Network)
本质上来说,DQN做的事情和Q-Learning是一模一样的。只是DQN会用神经网络实现。
这里我们可以指出DQN和传统的Q-table形式的不同。同样是给定\(state\)和\(action\)的数量,Q-table是通过一次次迭代完成填表。而DQN是输入state来估计所有的action的Q值。
虽然本质相同,但是实现上还是有所区别的。
2.1 两个网络
DQN算法需要两个结构相同的网络,分别是evaluate network和 target network。
- evaluate network,主要是计算当前状态\(s\)的所有Q值,即输入\(s\),输出所有的\(Q(s,a)\)。这个网络会进行训练。
- target network,这个网络主要用来估计下一状态的Q值,即输入\(s'\),输出所有的\(Q(s',a')\)。它的参数从evaluate network中复制而来,不会被训练。
2.1.1 如何训练evaluate网络
回顾核心公式
其中,我们考虑这个函数何时收敛呢?其实就是\(\alpha[R(s,a)+\gamma\max_{a'}{Q(s',a')}-Q(s,a)]=0\)时,这个\(Q(s,a)\)意味这达到收敛。所以对于evaluate network训练的损失函数如下
这里的\(w\)指的是网络参数。\(Q(s',a',w)\)和\(Q(s,a,w)\)都是指在网络参数\(w\)下预测出的Q值。
2.2 贪婪策略
贪婪策略的核心就是设置一个阈值\(\epsilon\),每次去获取action是,先得到一个随机数,随机数小于\(\epsilon\)的话就去执行evaluate network得到输出动作a。否则就会随机选择一个动作。
2.3 经验回放
DQN算法额外添加了一个经验库memory
,用来存储过去的数据(观察数据),\([state,action,reward,state']\)。memory
的数据有执行\(\epsilon\)-greedy时添加的。
刚开始memory
里面没有足够的数据,只有当数据量达到一定程度后,才会开始从memory
里面随机选择数据训练evaluate network。
设计记忆库memory并且随机选择经验喂给evaluate network的技巧打破了相邻训练样本之间相关性,试着想下,状态→动作→奖励→下一个状态的循环是具有关联的,用相邻的样本连续训练evaluate network会带来网络过拟合泛化能力差的问题,而经验回放技巧增强了训练样本之间的独立性。
(https://zhuanlan.zhihu.com/p/630554489)