keavil / AAAI18-code

The code of AAAI18 paper "Learning Structured Representation for Text Classification via Reinforcement Learning".
215 stars 81 forks source link

代码的reward定义是否与论文不符? #5

Open tcsere07 opened 6 years ago

tcsere07 commented 6 years ago

作者您好: 看了您论文的ID-LSTM reward的定义是r=logP(cg|x)+r*L'/L,这里的L'指的是删除的词的个数,但是看了您的代码,L'指的好像是保留的词的个数,以及代码里L'/L还取了平方? 如有理解错误,烦请指正,谢谢。

keavil commented 6 years ago

是的,代码中的定义和论文中的定义是相反的,但是由于符号取的也是相反的,所以表达的意思是一样的。论文中为了好理解写的是删除词的个数。 至于平方项,这是调参过程中进行的尝试。

tcsere07 commented 6 years ago

明白了,我自己根据您的论文也写了一个版本,ID-LSTM在AG语料test集合上三阶段分别是0.9113->0.9130->0.9154,效果并没有您论文提升的那么明显,所有有些疑问: 1、我发现您的代码里虽然定义了batch size,但其实无论是pretrain还是all train,都是单样本更新,如果三个阶段都换成batch样本的更新(我自己写的是batch的更新),对reinforcement learning阶段的更新以及最后阶段全部参数一起更新是否会有影响? 2、我想问下三阶段的学习率分别是多少?哪个阶段对提升的影响比较大? 3、有哪些因素对结果的影响比较大?

问题困扰已久,希望得到您的解答,非常感谢。

Imorton-zd commented 6 years ago

@extremin @keavil 你们好,我也是写的一个batch后更新,性能非常不稳定,在MR上用ID_LSTM有过0.812的结果,其他时候都不一定能重现。我也用了作者公布的代码,发现很难重现出论文中的结果,还有作者可否公布下四个数据集已经切分好的训练集、验证集和测试集?十分感谢。

Lastdier commented 6 years ago

同求四个数据集已经切分好的训练集、验证集和测试集,HS-LSTM的训练需要带节点的数据,自己无法通过代码反推你的数据格式

qq240035000 commented 5 years ago

明白了,我自己根据您的论文也写了一个版本,ID-LSTM在AG语料test集合上三阶段分别是0.9113->0.9130->0.9154,效果并没有您论文提升的那么明显,所有有些疑问: 1、我发现您的代码里虽然定义了batch size,但其实无论是pretrain还是all train,都是单样本更新,如果三个阶段都换成batch样本的更新(我自己写的是batch的更新),对reinforcement learning阶段的更新以及最后阶段全部参数一起更新是否会有影响? 2、我想问下三阶段的学习率分别是多少?哪个阶段对提升的影响比较大? 3、有哪些因素对结果的影响比较大?

问题困扰已久,希望得到您的解答,非常感谢。

早点看到你的issues就好了,把ID-LSTM的reward那点把我看惨了~~~

qq240035000 commented 5 years ago

作者您好: 换成batch样本的更新有试验结果吗?

keavil commented 5 years ago

很抱歉我一直没有关注issue。统一回复一下几个问题:

  1. batch更新: 代码中是batch化更新的,具体的做法是把每个样本的梯度加起来,再进行更新的。对RL比较了解的话,可以看到sample数据时用的是target网络,而在batch结束后才更新一次target网络。这是RL里使用较多的技巧。
  2. 三个阶段的学习率非常关键,对RL agent训练时建议将learning rate调低一个数量级(比如1e-3和1e-4)。这里其实是我代码中一个不是很好的地方,虽然我把三部分写在一起了,但实际上三部分要分开训练(主要是要调低learning rate)。
  3. RL算法的鲁棒性一直是一个难题……通常来说大量的随机种子能够一定程度上减弱这一问题。
grygg commented 5 years ago

@keavil @qq240035000 您好,请问下如何构造实验所需.res 文件?比如从普通文本构造?

scofield7419 commented 5 years ago

很抱歉我一直没有关注issue。统一回复一下几个问题:

  1. batch更新: 代码中是batch化更新的,具体的做法是把每个样本的梯度加起来,再进行更新的。对RL比较了解的话,可以看到sample数据时用的是target网络,而在batch结束后才更新一次target网络。这是RL里使用较多的技巧。
  2. 三个阶段的学习率非常关键,对RL agent训练时建议将learning rate调低一个数量级(比如1e-3和1e-4)。这里其实是我代码中一个不是很好的地方,虽然我把三部分写在一起了,但实际上三部分要分开训练(主要是要调低learning rate)。
  3. RL算法的鲁棒性一直是一个难题……通常来说大量的随机种子能够一定程度上减弱这一问题。

可以观察到:

  1. actor-active是一句一句的训练,即单步训练;并且actor-active的梯度是对所有采样了的step(samplecnt * lenth)的总和做grads.
  2. 而actor-target则是一整个batch再将actor-active的参数copy过来。

其实我发现还是有好几处的具体的细节与论文提到的不太一样的。可以理解毕竟论文不是说明书。