我怎么知道在 seq2seq 模型中是不是达到了纪元点?
Posted
技术标签:
【中文标题】我怎么知道在 seq2seq 模型中是不是达到了纪元点?【英文标题】:How can I know if the epoch point is reached in seq2seq model?我怎么知道在 seq2seq 模型中是否达到了纪元点? 【发布时间】:2016-05-09 16:37:53 【问题描述】:我在自定义并行语料库上训练 seq2seq 模型已经很多天了,该语料库包含大约一百万个句子,默认设置为 seq2seq 模型。 以下是教程中提到的经过 350k 步的输出日志。我看到bucket perplexity突然显着增加了整个train perplexity很长时间以来一直保持在1.02,学习率也被初始化为0.5但现在显示为0.007左右,所以学习率也显着下降,也是系统的输出不能令人满意。 我如何知道是否已达到纪元点,是否应该停止并重新配置参数调整和优化器改进等设置?
全局步长 372800 学习率 0.0071 步长 1.71 困惑度 1.02 评估:桶 0 困惑 91819.49 评估:桶 1 困惑 21392511.38 评估:桶 2 困惑 16595488.15 评估:桶 3 困惑 7632624.78 全局步长 373000 学习率 0.0071 步长 1.73 困惑度 1.02 评估:桶 0 困惑 140295.51 评估:桶 1 困惑 13456390.43 评估:桶 2 困惑 7234450.24 评估:桶 3 困惑 3700941.57 全局步长 373200 学习率 0.0071 步长时间 1.69 困惑度 1.02 评估:桶 0 困惑 42996.45 评估:桶 1 困惑 37690535.99 评估:桶 2 困惑 12128765.09 评估:桶 3 困惑 5631090.67 全局步长 373400 学习率 0.0071 步长 1.82 困惑度 1.02 评估:桶 0 困惑 119885.35 评估:桶 1 困惑 11166383.51 评估:桶 2 困惑 27781188.86 评估:桶 3 困惑 3885654.40 全局步长 373600 学习率 0.0071 步长 1.69 困惑度 1.02 评估:桶 0 困惑 215824.91 评估:桶 1 困惑 12709769.99 评估:桶 2 困惑 6865776.55 评估:桶 3 困惑 5932146.75 全局步长 373800 学习率 0.0071 步长 1.78 困惑度 1.02 评估:桶 0 困惑 400927.92 评估:桶 1 困惑 13383517.28 评估:桶 2 困惑 19885776.58 评估:桶 3 困惑 7053727.87 全局步长 374000 学习率 0.0071 步长 1.85 困惑度 1.02 评估:桶 0 困惑 46706.22 评估:桶 1 困惑 35772455.34 评估:桶 2 困惑 8198331.56 评估:桶 3 困惑 7518406.42 全局步长 374200 学习率 0.0070 步长 1.98 困惑度 1.03 评估:桶 0 困惑 73865.49 评估:桶 1 困惑 22784461.66 评估:桶 2 困惑 6340268.76 评估:桶 3 困惑 4086899.28 全局步长 374400 学习率 0.0069 步长 1.89 困惑度 1.02 评估:桶 0 困惑 270132.56 评估:桶 1 困惑 17088126.51 评估:桶 2 困惑 15129051.30 评估:桶 3 困惑 4505976.67 全局步长 374600 学习率 0.0069 步长 1.92 困惑度 1.02 评估:桶 0 困惑 137268.32 评估:桶 1 困惑 21451921.25 评估:桶 2 困惑 13817998.56 评估:桶 3 困惑 4826017.20什么时候会停止?
【问题讨论】:
将全局步乘以批量大小并除以训练示例的数量,得到您当前的时期 什么时候停止? 不熟悉 seq2seq,但通常当您到达训练循环结束时训练结束,或者您的输入管道用完示例(默认情况下您永远不会用完) @YaroslavBulatov 你从来没有用完意味着什么?是在无限循环重复这些例子吗? 【参考方案1】:您的开发数据和训练数据之间似乎存在差异:
global step 374600 learning rate 0.0069 step-time 1.92 perplexity 1.02
eval:bucket 0 perplexity 137268.32
您的训练困惑度为 1.02 - 该模型在接收到的训练数据上基本上是完美的。但是您的开发困惑是巨大的,该模型根本不适用于开发集。它在更早的时代看起来如何?我怀疑有一些不匹配。也许训练和开发的标记化不同?也许你加载了错误的文件?也许原始翻译模型中的桶大小不适合您的开发数据?不知道更多细节很难说。
至于何时停止:原始翻译模型具有无限的训练循环,因为它具有庞大的数据集和容量,并且可以在数周的训练中继续改进。但是当学习率不再提高时,它也会降低学习率,所以如果你的学习率非常低(就像你的情况一样),这是一个明确的信号,你可以停止。
【讨论】:
我检查了以下文件:newstest2013.en newstest2013.fr 用于开发,我没有用我的自定义并行语料库替换,这是原因吗?如果是,那么如何在不停止训练的情况下将文件替换回来以反映正确的分数。 是的,这可能就是原因。每次打印输出时都会保存模型的检查点,因此您可以停止训练,替换开发文件,然后再次开始训练——它将加载最新的检查点,但开发分数应该会改变。希望对您有所帮助! 感谢成功,这是否像在线学习一样,在 data_dir 中添加新数据后,我可以从最后一个检查点继续学习? 我认为当前文件总是读取整个数据集并每次选择一个随机批次。但是是的,你可以停下来,修改数据,然后继续,看看之前的数据读取功能(纯python,没有tensorflow,很容易适应,如果你需要……)。 所以它会在我停止后从最后一个检查点初始化?是否会重新生成更新对应的wordid文件和词汇?以上是关于我怎么知道在 seq2seq 模型中是不是达到了纪元点?的主要内容,如果未能解决你的问题,请参考以下文章