RL论文阅读【三】Dueling Network Architectures for Deep Reinforcement Learning

1 废话

这篇论文就是介绍我们常说的 Dueling DQN,在我心中一直以为和 Double DQN 是平行的两种技术,所以也没怎么想就看这篇论文了,但是看了才发现,原来这篇论文中提到了 Double DQN,而且可以应用于 Double DQN,而且同时还用到的 Prioritized replay,所以正确的阅读顺序应该是先看 Double DQN 和 Prioritized experience replay,但是影响不大了,这篇论文可以作为独立的一篇论文来看。

今天由于晚上打了一个多小时的电话,导致最后的实验部分没看完,先主要说下前面的吧。

2 Motivation

发表这篇论文的时候,大家已经把各种各样的深度学习的架构应用在了强化学习中,在这个方向已经不太好创新了,这篇作者结合DQN的特点,对网络结构进行创新。在很多应用场景,存在很多的状态不同的动作对应Q值几乎是一样的,如在 Atari 游戏 Enduro 中,如下图所示,由于前方没有车,所以不同的动作对 Q 值没有影响,在训练 DQN 时,当执行一个动作后我们会修正该动作对应的 Q 值,而其他的动作对应的 Q 值如何变化我们是不关心的, 但是若我们把 Q(S, A) 值分成 V(S) 和 A(A, S) 来看待,同时训练了 V 和 A,那么对 V 部分的训练同样适用于别的动作,比如下图这个例子,我们随便执行一个动作,修正的 V 值同样也适用于别的动作,所以这样收敛更快。而下图的实验也证明了这一点,V 的输出注意力集中在远处的道路与当前的得分,因为这与该状态的得分有关,而 A 没有什么特别关注的地方,因为前方没有车,所以当前执行什么动作是不影响未来得分的。

Enduro 中截图

3 算法说明

(1)网络结构:如下图所示,上面为之前的DQN,就是CNN+全链接;下面是 Dueling DQN 的结构,就只是把最后一个隐藏层拆开成两部分呢了,分别输出 V 和 A,其中 V 只有一维,表示该状态的得分,A 和动作的维度是一样的,表示执行某个动作相对于该状态可以获得的额外得分。然后再由 V 和 A 通过公式计算得到和原来含义一样的 Q 值。

网络结构

(2)V 和 A 的组合:文中讨论了两种组合方式,我这里就直介绍他们最终采用的方式,如下公式所示(懒得打公式了,直接上截图)。这里的 A 其实已经不是理论中的 A 了,每个 A 减去所有 A 的均值才是真正理论中的 A,因为 A 的期望是等于 0 的。

V 和 A 结合公式

(3)算法:由于该论文改了网络结构,在测试时还着重说了下 Gradient Clip 的重要性,对于提升也有比较大的帮助,文中的gradient clipping norm 为 10。训练的方法和技巧其实是没有什么改变的,可以用 Double DQN,也可以用 Prioritized experience replay。Double DQN 打算明天开始看,同时也在下一篇博客中介绍。

4 结果说明

在第二节我已经介绍了一个简单的实验,为了证明 Dueling DQN的效果,论文还做了另外两个实验。

(1)第一个比较简单,在一个简单的实验环境中执行一个 policy evaluation task。这里有一句话我没太懂,还希望大神可以告诉我,文中是这么解释为什么做这个实验的:as it is devoid of confounding factors such as the choice of exploration strategy, and the interaction between policy improvement and policy evaluation。这里的策略采用 \epsilon-greedy 根据 Q 选取动作,\epsilon为0.001。使用 TD(0) 更新 Q 值,然后根据 Q 值选择动作,我的理解是这里同样用到了策略评估和策略升级,那么上边那句英文是什么意思呢?不过不影响对这个实验的理解。

原有环境是5个动作,通过增加静止(no-ops)动作来增加总的动作数目,为了验证之前的思想:很多动作的 Q 值是差不多的,一个一个更新很慢,Dueling 通过更新 V 来同时更新所有动作的 Q 值来加快收敛。实验结果如下图所示,纵坐标为Q值预测值与真实值的均方差,横坐标为迭代次数,也的确证明了可以加快收敛。

实验一结果

(2)实验二就是在 atari 游戏中中达到了 SOTA 的效果,我还没看完,就不细说了,反正效果超过了之前的就对了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DeepLearning4j是一个基于Java编写的深度学习框架,支持多种神经网络模型和算法。其中包括DQN算法,可以用于处理强化学习问题。 以下是DeepLearning4j中实现DQN算法的示例代码: ```java public class DQNExample { public static void main(String[] args) throws Exception { //定义强化学习环境 GymEnv gymEnv = new GymEnv("CartPole-v0", false, false); //定义神经网络模型 int numInputs = gymEnv.getObservationSpace().getShape()[0]; int numOutputs = gymEnv.getActionSpace().getSize(); int numHiddenNodes = 32; MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(123) .updater(new Adam(0.01)) .list() .layer(new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes).activation(Activation.RELU).build()) .layer(new DenseLayer.Builder().nIn(numHiddenNodes).nOut(numHiddenNodes).activation(Activation.RELU).build()) .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MSE).nIn(numHiddenNodes).nOut(numOutputs).activation(Activation.IDENTITY).build()) .build(); //定义DQN算法 DQN dqn = new DQN(conf, gymEnv, new QLearning.QLConfiguration( 123, //随机数种子 1000, //最大步数 500, //记忆库大小 32, //小批量大小 500, //目标更新频率 10, //训练开始前等待步数 0.01, //初始ε贪心策略参数 0.1, //最小ε贪心策略参数 0.99, //ε贪心策略参数衰减率 1 //回放库采样策略参数 )); //训练模型 for (int i = 0; i < 1000; i++) { dqn.train(); } //测试模型 gymEnv.reset(); for (int i = 0; i < 1000; i++) { INDArray obs = gymEnv.getObservation(); int action = dqn.getAction(obs); gymEnv.step(action); gymEnv.render(); } } } ``` 在以上代码中,首先定义了强化学习环境,这里使用了OpenAI Gym提供的CartPole-v0环境。接着定义了神经网络模型,使用了两个全连接层和一个输出层,其中激活函数分别为ReLU和恒等函数。然后定义了DQN算法,其中包括了训练的超参数,如最大步数、记忆库大小等。最后进行模型的训练和测试,测试时使用了模型的预测结果作为动作。 需要注意的是,DeepLearning4j中实现DQN算法需要依赖于OpenAI Gym环境和ND4J库,需要进行配置和安装。此外,DQN算法还有许多改进版本,如Double DQN、Dueling DQN等,可以根据具体问题进行选择和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值