实验日志

实验日志

2018年5月5日

实验名: 0504_08,模型: 0504_08-10001

今天只得到了单net 8agent的结果。
发现P的loss非常正常的在下降,Q的loss非常混乱。而且刚训练了不久,每次episode的截止steps就在一百左右(而最大step设置成1024),这说明网络已经学会把8个pin接在一起了。

很明显可见的,在1500轮之后,模型已经学会了连接,Ploss已经很低了。然后Qloss进入了狂奔状态,为什么呢??为什么训练稳定了之后,Q就会进入狂奔状态呢?很有趣的问题。

Q的loss
P的loss
结果

已经做了个有趣的尝试:

  • 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

Ploss
Qloss

可以看见Qloss一直在10000左右徘徊。发现对比起昨天的,Qloss有一些聊胜于无的方差上的减小。估计没什么意义。

这次应该是失误了。Ploss应该为0才对。不知为何居然有。这也就是说明P与Q一起训练了。那么这次训练其实是没有意义的。

1
2
3
4
5
q.var()						# 0505_03_train_q
Out[9]: 687018368.9552165

q.iloc[-5000:].var() # 0504_08
Out[18]: 694046799.8307263

实验名: 0505_04_train_q_EL, 与训练模型:0504_08-10001

Qloss

这一次,我们把reward中的线长惩罚放大了十倍,但是

1
2
3
4
5
6
7
8
9
10
11
12
13
# 总结束步数
In[34]: epd.mean() # 0505_04_train_q_EL
Out[34]: 128.6342
In[35]: epd2.mean() # 0505_03_train_q
Out[35]: 128.162
In[36]: epd3.mean() # 0504_08
Out[36]: 128.6787321267873

# 平均net长
l2.mean() # 0505_03_train_q
Out[51]: 173.6652
l3.mean() # 0505_04_train_q_EL
Out[52]: 173.9214

其实并没有什么区别……

这怎么可能呢?为什么改了reward没有区别?

唯一的解释就是,因为Q网络实在太差了,没办法提供有效的信号,所以就死了。

下一步

  • 0506_01_EL 将0505_04的P和Q协同训练5000轮。
  • 0506_02_newQ 使用更夸张,更大号的Q来训练。还是1net8agent,但是不需要训10000轮了。快速迭代,训个2000轮看看。

0506_01_EL

Loss
这张图把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都跑着。

看看效果吧。

Tipping