好久没写了,看了一下中间隔了居然有一个月,这种没有活水流入的生活,确实会让人feel bad;
这篇要讲到DQN,主要是Nature2015那版(在这之前还有一版NIPS2013):
为什么要把Q-learning从用表格来记录每个状态的价值升级到神经网络呢,因为状态和动作空间如果是高维连续的,那么表格显然记录不过来;
整个DQN的过程是这样的,首先将当前状态s输入网络得到所有action的Q值,以argmax选择Q值最大的那个a作为当前动作,然后environment又会转移到下一个状态s’,并得到reward;将(s,a,s',r)作为一条记录,放入经验池,然后每次从经验池取一定数目的训练数据进行训练。
神经网络最重要的是loss的设计,这里从Q-learning的贝尔曼公式出发:
每一次Q值的迭代,都是用当前动作可能得到的最大价值去迭代当前的Q值,这里我们可以认为函数的目标就是使当前的Q估计值不断接近Q目标值;那么loss即如此:这里的y是r+r*maxQ(s',a),
当前网络得到在s采取动作a的Q值,那么yi需要的是在s采取动作a后到达s'的最大可能Q值,是根据上一个迭代周期得到的;所以这里用到了双网络结构,即把s‘输入target网络,用target网络的参数计算出q-target值:
然后梯度下降:
这里的双网络结构也是从NIPS2013到Nature2015的一大改进,“引入target_net后,再一段时间里目标Q值保持不变,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性”。
所以说如果用单网络的话就是把s'和a'输到网络里?这里目标值在单网络的得到如何得到的?就是把s‘输入当前网络得到,然后用得到的q值去和s得到的做loss。
RL和DL结合还有一个问题是DL都是样本独立的,但是RL前后状态相关,这里用到了经验回放的策略解决该问题,说白了就是把样本存起来,然后每次拿个mini-batch训练。