1. 前言
这段时间可是被强化学习折磨透了,在Iron Shout
游戏中训练的AI效果十分差劲,故打算从一个简单的游戏入手.
但经验发现了神奇现象,DQN越打越拉跨!
看不同参数的结果,可以直接拉到文章末尾,学习本文得出的结论.
2. 环境简介
我们小时候应该都玩过打砖块的游戏,该游戏截图如下所示:

球遇到边缘会进行反弹,我们所要做的就是利用浆尽可能接住更多的球.
接下来,进行一下环境的定义部分.
动作空间(3)
0
浆左移动1
不动2
浆右移动
状态空间(5)
- 浆的x坐标
- 球的x,y坐标
- 球的x,y速度
奖励函数
+3.0
当浆击中球-3.0
当浆没有击中球-0.1
当浆进行移动
回合结束:当浆没有接到球,或者接到过50个球
3. 调参过程
3.1 标准模型
我们以下图的参数为基本模型,所有模型均训练1000个epochs.
## 主要参数
LEARN_FREQ = 5 ## 学习频率
MEMORY_SIZE = 20000 ## 记忆库容量
BATCH_SIZE = 32 ## 批处理量
LEARNING_RATE = 0.001 ## 学习率
GAMMA = 0.999 ## 折扣因子
训练完毕后的结果如下所示:

模型在第900个epochs回合后到达了最优,测试奖励达到了100+,但是到第1000个epochs时性能悬崖式下降.直接变成小白.
3.2 降低折扣因子
GAMMA = 0.99 ## 折扣因子
训练完毕后的结果如下所示:

从图中看模型在训练时,不乏高分回合,但是测试时效果有些一般.
3.3 继续降低折扣因子
GAMMA = 0.90 ## 折扣因子
训练完毕后的结果如下所示:

这个效果图,可以看出前期模型奖励一直为0,说明GAMMA越小,模型蓄力时间越长,但是性能下降时也慢.
3.4 降低一下学习率
LEARNING_RATE = 0.0005 ## 学习率
训练完毕后的结果如下所示:

模型在550回合有点搞笑咋就-270分了,但是模型没有出现100+以上的成绩,模型性能崩溃速度也慢了一点.
3.5 继续一下学习率
LEARNING_RATE = 0.0001 ## 学习率
训练完毕后的结果如下所示:

仔细看模型训练时的得分,可以发现模型在后期训练得分都比较高,不像前几个模型在训练时高分稀疏,同时模型在测试集上表现也是不错的.
3.6 增大批处理量
## 主要参数
BATCH_SIZE = 128 ## 批处理量
训练完毕后的结果如下所示:

模型在训练时整体高分也是比较不错的,收敛能力也是比较快的,出现了两次最高分.
3.7 更改网络结构
原始网络结构 5->60->60->60->60->3
现在网络结构 5->128->128->128->3

模型在测试时出现了两次最高分,但是模型整体忽上忽下,显示了较大的不稳定性.
3.8 减少网络更新时间
update_target_steps = 100 ## 每学习100次更新一次Target网络


训练了两次,出现了不同的结果,说明强化学习确实有练丹的感觉,但通过计算训练时高分情况发现差距并不大.经过对比还是更新时间大一点比较好.
3.8 减少记忆库容量
MEMORY_SIZE = 10000

确实出现了性能的下降,但总体来看不是很大.
3.9 继续减少记忆库容量
MEMORY_SIZE = 2000

由于记忆库太少,性能出现了巨大的下降.
总结
模型 | 起步时间(epochs) | 高分 | 训练时高分疏密 |
---|---|---|---|
标准模型 | 350 | 100 | 22(少) |
Gamma=0.99 | 250 | 50 | 45(中) |
Gamma=0.90 | 600 | 60 | 20(少) |
学习率=0.0005 | 350 | 80 | 68(多) |
学习率=0.0001 | 350 | 100+ | 100(多) |
减少网络深度 | 250 | 100+ | 33(中) |
Batch=128 | 200 | 100 | 63(多) |
减少更新步长 | 300 | 100 | 8(少) |
MEMORY_SIZE=10000 | 550 | 80 | 16(少) |
MEMORY_SIZE=2000 | 900 | 20 | 7(少) |
参数对强化学习有着很大的影响,经过本文得出来的结论,对于一个决策很多的环境,默认参数最好为
## 主要参数
LEARN_FREQ = 5 ## 学习频率
MEMORY_SIZE = 20000 ## 记忆库容量
BATCH_SIZE = 64 ## 批处理量
LEARNING_RATE = 0.0001 ## 学习率
GAMMA = 0.999 ## 折扣因子
在此之后如果进行优化,可以增加记忆库容量,更新步长,Batch.减少Gamma,网络深度等.