实验日志
2018年5月5日
实验名: 0504_08,模型: 0504_08-10001
今天只得到了单net 8agent的结果。
发现P的loss非常正常的在下降,Q的loss非常混乱。而且刚训练了不久,每次episode的截止steps就在一百左右(而最大step设置成1024),这说明网络已经学会把8个pin接在一起了。
很明显可见的,在1500轮之后,模型已经学会了连接,Ploss已经很低了。然后Qloss进入了狂奔状态,为什么呢??为什么训练稳定了之后,Q就会进入狂奔状态呢?很有趣的问题。
已经做了个有趣的尝试:
- 0505_03_train_q : 使用原模型,原reward,固定P,只训练Q
- 0505_04_train_q_EL :使用原模型,新的,将长度penalty扩大十倍的reward function,固定P,只训练Q。打算在Q训练的差不多的时候(应该不会出现爆炸现象吧?),在P、Q合训。不知道会不会出现什么异常现象呢?比如网络断开了,等等。
2018年5月6日
实验名: 0505_03_train_q,预训练模型:0504_08-10001
可以看见Qloss一直在10000左右徘徊。发现对比起昨天的,Qloss有一些聊胜于无的方差上的减小。估计没什么意义。
这次应该是失误了。Ploss应该为0才对。不知为何居然有。这也就是说明P与Q一起训练了。那么这次训练其实是没有意义的。
1 | q.var() # 0505_03_train_q |
实验名: 0505_04_train_q_EL, 与训练模型:0504_08-10001
这一次,我们把reward中的线长惩罚放大了十倍,但是
1 | # 总结束步数 |
其实并没有什么区别……
这怎么可能呢?为什么改了reward没有区别?
唯一的解释就是,因为Q网络实在太差了,没办法提供有效的信号,所以就死了。
下一步
- 0506_01_EL 将0505_04的P和Q协同训练5000轮。
- 0506_02_newQ 使用更夸张,更大号的Q来训练。还是1net8agent,但是不需要训10000轮了。快速迭代,训个2000轮看看。
0506_01_EL
这张图把0505_04画进来了,不知道为什么切换的时候reward突然高了一点点。但是无所谓了。这一批其实是没救了。也许是因为adam?还是因为seed?不管了。因为Q的问题很明显,就是Q已经没有什么办法来拯救自己。
下面的实验我们大改了reward和ob的结构。所以这一批就这样了吧。
0506_02
很明显还没训好。只训了4000轮。所以等等再说。
0506_03
接上
0506_04 以及 0506_05
重大错误
action的数据类型被设成了uint8,这是不可接受的!上述三个实验全部作废!
2018年5月7日
凌晨5点开始跑的程序,到现在还没跑完。然而服务器内存占用显存占用和CPU占用一直都不算高。很烦。如何才能提高软件的效率呢?
- 0507_01 [8] 约30秒5轮
- 0507_02 [4,4] 约73秒1轮,一直都是1024步。
- 0507_03 [2,2,2,2] 约110秒1轮,一直都是1024步。
如何才能让多net起效果呢?为什么总是不行?难道说,是因为1024这个总步数太小了?给它多一点总步数会不会好一点?必须等待起码一次的结果,然后分析为什么。
代码可能要再次重构!能耗这么低,速度这么慢的原因,估计是串行度太高了!必须重写一下,充分利用机器的性能。
重大错误
又他妈发现一个重大bug,同个net的agent看到的ob_P是完全一样的。我他妈脑子进屎了
于是修改了这些,重跑0508_01,02,03 同上。
然后!又发现一个重大bug,reward并不是共享的!
所以在0508_04上修改了ob_Q,让ob_Q中的每个net的编号不同。(而之前是ob_Q中,同net为1,不同net为2,但是由于reward不是共享的,所以你可以理解成之前的0508_01,02,03是属于普通的ddpg)
然而,在0508_04上,还是忘了把reward改成共享的,等于只改了ob_Q。但是我让0508_01,02,03,04都跑着。
看看效果吧。