New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

seqToseq_net输出层的实现与原始论文不一样 #1133

Closed
huguanglong opened this Issue Jan 12, 2017 · 7 comments

Comments

Projects
None yet
2 participants
@huguanglong

huguanglong commented Jan 12, 2017

@luotao1 @lcy-seso 两位,最近对比了下seqToseq_net.py输出层的实现与Bengio原始论文,发现有一些不一样的地方:
1)原始论文《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE》中,decoder端gru层的输出si、ci、yi-1合在一起,作为最终输出层的输入,公式如下:
image
2)seqToseq_net.py中的实现,相当于是直接将decoder端gru层的输出作为最后输出层的输入,代码如下:
image
请问这种简化实现的考虑是什么?性能方面有与原始论文的实现做对比么?
另外,最近在实现多层时,发现3层以上的性能反而没有2层的好,不知道你们是否有观察到这个现象?会是训练数据不足导致?
谢谢!

@lcy-seso

This comment has been minimized.

Show comment
Hide comment
@lcy-seso

lcy-seso Jan 12, 2017

Contributor

谢谢你的问题~ 确实是不一样的。

论文中在预测下一个词时:使用了 target embedding,context vector,以及 decoder output ,paddle 的配置中只用到了 decoder output。这些简化在我们的实验中,对生成性能没有影响。只有一层 GRU decoder 时, decoder 的output 已经很好的包含了context vector 和 target embedding 信息,这两个输入也有可能在深层的时候拉浅网络。

同时,论文中用源语言反向最后一个时刻加了一个映射初始化decoder 的状态,这个也是可以省略的。对性能不会有太大影响。

Contributor

lcy-seso commented Jan 12, 2017

谢谢你的问题~ 确实是不一样的。

论文中在预测下一个词时:使用了 target embedding,context vector,以及 decoder output ,paddle 的配置中只用到了 decoder output。这些简化在我们的实验中,对生成性能没有影响。只有一层 GRU decoder 时, decoder 的output 已经很好的包含了context vector 和 target embedding 信息,这两个输入也有可能在深层的时候拉浅网络。

同时,论文中用源语言反向最后一个时刻加了一个映射初始化decoder 的状态,这个也是可以省略的。对性能不会有太大影响。

@huguanglong

This comment has been minimized.

Show comment
Hide comment
@huguanglong

huguanglong Jan 13, 2017

@lcy-seso 感谢你的回复,我在对比GroundHog(原始论文的实现)和Paddle中的seqToseq_net.py时,发现paddle的效果更好些,这种简化的确没有什么影响。
另外请教下哈:
1)上次所说的华为coverage方案在多层时是否有效,这方面你们有尝试过么?
2)两层比单层的提升很显著,但3层以上似乎没有提升了,这个问题你怎么看呢?

huguanglong commented Jan 13, 2017

@lcy-seso 感谢你的回复,我在对比GroundHog(原始论文的实现)和Paddle中的seqToseq_net.py时,发现paddle的效果更好些,这种简化的确没有什么影响。
另外请教下哈:
1)上次所说的华为coverage方案在多层时是否有效,这方面你们有尝试过么?
2)两层比单层的提升很显著,但3层以上似乎没有提升了,这个问题你怎么看呢?

@lcy-seso

This comment has been minimized.

Show comment
Hide comment
@lcy-seso

lcy-seso Jan 13, 2017

Contributor
  1. coverage 我和 RNNSearch 对比过,感觉没啥特别优势,就没有在深层上继续尝试(太费时间啦)。我自己理解是这样,coverage 的思路是对的,但是肯定有更好的实现方式。这个论文里面是试图通过引入 attention 历史来达到对源语言的 coverage ,其实也是比较soft 的coverage,如果是引入 attention 历史,NTM里面提到的的hybird addressing 也有同样的效果。原来跑,效果也会比coverage 更好;所以当时没有一直再去继续这个实验;

  2. 深层 RNN 比浅层好,优势很明显,很可能是没有训练好。

  3. Google NMT 论文里面也提到这个问题。Google 论文里面的数据是裸着迭 4 层,一般没啥问题。再往上需要加一些保证梯度在纵向上顺畅传播的连接。Google 的论文里面加入了 residual connection,还可以加入 Highway。我们之前的实验结果是,在深层 RNN 上面 ,Residual 收敛的快,但最终评估指标不如 Highway。

  4. 安利一下我们的论文哈~ Deep Recurrent Models with Fast-Forward Connections for Neural Machine Translation,里面的 fast-forward connection 也是一种方式~

Contributor

lcy-seso commented Jan 13, 2017

  1. coverage 我和 RNNSearch 对比过,感觉没啥特别优势,就没有在深层上继续尝试(太费时间啦)。我自己理解是这样,coverage 的思路是对的,但是肯定有更好的实现方式。这个论文里面是试图通过引入 attention 历史来达到对源语言的 coverage ,其实也是比较soft 的coverage,如果是引入 attention 历史,NTM里面提到的的hybird addressing 也有同样的效果。原来跑,效果也会比coverage 更好;所以当时没有一直再去继续这个实验;

  2. 深层 RNN 比浅层好,优势很明显,很可能是没有训练好。

  3. Google NMT 论文里面也提到这个问题。Google 论文里面的数据是裸着迭 4 层,一般没啥问题。再往上需要加一些保证梯度在纵向上顺畅传播的连接。Google 的论文里面加入了 residual connection,还可以加入 Highway。我们之前的实验结果是,在深层 RNN 上面 ,Residual 收敛的快,但最终评估指标不如 Highway。

  4. 安利一下我们的论文哈~ Deep Recurrent Models with Fast-Forward Connections for Neural Machine Translation,里面的 fast-forward connection 也是一种方式~

@lcy-seso

This comment has been minimized.

Show comment
Hide comment
@lcy-seso

lcy-seso Jan 13, 2017

Contributor

3 轮以上就不再收敛,这个挺奇怪的。我们训练的时候还不至于这么差,代价一直会降,是不是学习率砍得过了呢?

Highway 是这个~ 有这一篇 Training Very Deep Networks

Contributor

lcy-seso commented Jan 13, 2017

3 轮以上就不再收敛,这个挺奇怪的。我们训练的时候还不至于这么差,代价一直会降,是不是学习率砍得过了呢?

Highway 是这个~ 有这一篇 Training Very Deep Networks

@lcy-seso

This comment has been minimized.

Show comment
Hide comment
@lcy-seso

lcy-seso Jan 13, 2017

Contributor

如果是用paddle 训练的话,有一个参数,--show_parameter_stats_period=N 。设置这个参数,每隔 N 个batch 会输出参数的一些统计信息,比如梯度的平均值,最大值,参数的绝对值的平均值之类的。3 轮就不收敛,这个肯定不应该。可以试试看,是不是什么原因导致梯度太小了?

Contributor

lcy-seso commented Jan 13, 2017

如果是用paddle 训练的话,有一个参数,--show_parameter_stats_period=N 。设置这个参数,每隔 N 个batch 会输出参数的一些统计信息,比如梯度的平均值,最大值,参数的绝对值的平均值之类的。3 轮就不收敛,这个肯定不应该。可以试试看,是不是什么原因导致梯度太小了?

@lcy-seso

This comment has been minimized.

Show comment
Hide comment
@lcy-seso

lcy-seso Jan 13, 2017

Contributor

多 GPU 双卡和单卡训练速度差不多,这个也是使用 PaddlePaddle 吗?这个现象也不是非常正常。

如果是 GPU 速度的问题,或者可以新提一个issue,提供一些详细的参数信息。请更专业的同学再看看~

Contributor

lcy-seso commented Jan 13, 2017

多 GPU 双卡和单卡训练速度差不多,这个也是使用 PaddlePaddle 吗?这个现象也不是非常正常。

如果是 GPU 速度的问题,或者可以新提一个issue,提供一些详细的参数信息。请更专业的同学再看看~

@huguanglong

This comment has been minimized.

Show comment
Hide comment
@huguanglong

huguanglong Jan 22, 2017

@lcy-seso @reyoung 上述多GPU训练速度无提升的问题,有哪位更专业的同学帮忙看看么?谢谢!

huguanglong commented Jan 22, 2017

@lcy-seso @reyoung 上述多GPU训练速度无提升的问题,有哪位更专业的同学帮忙看看么?谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment