从保存的检查点重新启动后,Tensorflow指标急剧下降

时间:2019-09-27 00:26:02

标签: tensorflow tensorflow-estimator

这个问题困扰了很多同事过去和现在。如果我杀死并tensorflow训练实例并重新启动,则文档说明它将从保存在model_dir下的最新检查点恢复。但是通常情况下,我们会看到指标(例如AUC,对数损失等)有相当大的下降。我从未真正理解过这种下降的原因。所有相关信息都保存在检查点文件中,以便tensorflow在状态被杀死之前重建状态,可能是输入数据集的迭代器(在估计器框架下)。从历史上看,这使我和其他人不愿意通过从现有检查点加载来重新开始张量流训练,因为几乎可以保证指标会恶化。

今天,我通过在没有参数服务器的情况下在一台机器上建立一个由1名负责人和7名工人组成的培训实例来做一些更积极的事情。这应该在STANDALONE分发策略下运行,其中首席生成多个工作线程。但是,当我取消训练并使用相同的分布式设置从最新的检查点重新开始时,指标自成立以来下降了几乎全部收益的一半!请注意,以下张量板图中的多次跳转是由于我从同一保存的检查点启动的多次重新启动。

然后,我开始查看梯度直方图/分布图,并注意到重新启动后,所有偏差权重(尤其是最后一个bias_3)的偏差均显着增加。显然有问题,但是在重新启动之前和之后比较检查点中的变量,发现这些值仍在不断变化,尽管其跳跃幅度大于正常范围。为了防止无意间过度拟合,我使用不同的随机种子对输入文件(大约100个)进行了混洗,以使重新启动不会回到原始训练时期的开始。无论如何,培训已经持续了多个时期,因此不太可能出现过度拟合可见培训数据的情况。

除此之外,我想不出为什么梯度会经历如此巨大的跳跃,从而导致指标下降的任何原因。

更新:

奇怪的是,我发现DNN的最后一层的偏差向量的Adagrad保持恒定为0.1,即使梯度显然非零,尽管很小。我不认为这可以解释重启后的跳转,因为序列化的Adagrad值应该接近存储在内存中的值。

python -m inspect_checkpoint --file_name model.ckpt-720730 --tensor_name bias_3/Adagrad
tensor_name:  bias_3/Adagrad
[0.1]

python -m inspect_checkpoint --file_name model.ckpt-591678 --tensor_name bias_3/Adagrad
tensor_name:  bias_3/Adagrad
[0.1]

为进行比较,bias2的Adagrad似乎在200k步长(批次大小1024)中发生了巨大变化。

python -m inspect_checkpoint --file_name model.ckpt-720730 --tensor_name bias_2/Adagrad
tensor_name:  bias_2/Adagrad
[80.608215    1.0615484   1.1355964  89.86574    90.919426   80.83253
  1.7569603   1.2538469  69.11257    77.651375   89.71191     0.7492978
...

python -m inspect_checkpoint --file_name model.ckpt-591678 --tensor_name bias_2/Adagrad
tensor_name:  bias_2/Adagrad
[47.73241     1.0530229   1.1187999  50.532574   51.123966   40.66552
  1.7377361   1.2532469  36.016315   45.788876   50.346928    0.7473773
...

为了完整起见,我在整个DNN中都使用了dropout,但是没有任何形式的正则化。没有花哨的梯度乘数,梯度衰减函数等。只是普通的老Adagrad。任何帮助或建议都将受到高度赞赏。

enter image description here

enter image description here enter image description here enter image description here

enter image description here

enter image description here

enter image description here

0 个答案:

没有答案