我有一个训练了 30 个 epoch 的 tensorflow seq2seq 模型,并为每个 epoch 保存了一个检查点。我现在要做的是组合这些检查点中最好的 X(基于开发集的结果)。具体来说,我正在寻找一种方法,让我平均不同的模型权重并将它们合并到可用于解码的新模型中。但是,似乎没有固定的方法,加载不同的模型可能有点棘手。但即使成功了,我也无法找到如何在新模型中组合权重的好答案。
任何帮助将不胜感激。
相关问题(我认为不足以回答):
在同一图形中构建多个模型
如何将多个相同的模型从保存文件加载到Tensorflow中的一个会话中
如何在张量流中创建融合?
首先,一些术语:
-
在融合中(据我所知),您在测试时有 N 个模型,并且您组合它们的预测(通过投票,甚至更好地组合概率分布,并在自回归 seq2seq 解码器的情况下用作进一步解码的输入)。您可以拥有独立的融合(从头开始独立训练每个模型,使用不同的随机初始化)或检查点融合(获取 N 个最后检查点,或者可能是 N 个具有最佳验证分数的检查点)。例如,参见Sennrich等人,2017年对这两种类型的融合进行比较。
-
在求平均值时,您可以平均 N 个模型的权重,因此在测试时您只有一个平均模型。这通常比真实融合给出更差的结果,但它要快得多,因此您可以负担得起更高的 N。如果模型是使用不同的随机初始化完全独立训练的,则平均根本不起作用。但是,如果模型共享合理数量的初始训练步骤,则平均可能会起作用。一种特殊情况是检查点平均,其中最后 N 个检查点是平均的,但您甚至可以尝试"分叉"训练并使用"半独立"模型进行平均(除了检查点平均)。使用恒定或周期学习率可能非常有用,参见Izmailov等人,2018。
至于你的问题,如何对 Tensorflow 检查点进行平均: 请参阅 avg_checkpoints.py 或 t2t-avg-all。
对几个模型的权重进行平均以生成一个新模型不太可能产生有用的结果。
举一个简单的例子,想想像AlexNet这样的经典CNN。它的第一层将包含一系列寻找不同图像特征的 2D 过滤器。对于从头开始训练的每个模型,筛选器中可能会出现类似的特征,但它们出现的顺序将非常不同,因此仅平均权重会破坏大部分信息。