如何将两个经过训练的神经网络权重矩阵合并为一个?

时间:2018-04-23 18:49:39

标签: python matrix machine-learning neural-network mnist

我有两个相同的神经网络在两台独立的计算机上运行(以减少训练网络所需的时间),每个神经网络都有一个完整数据集(MNIST)的子集。

我的问题是;我可以将两个网络的两个权重矩阵组合成一个矩阵,同时保持适当的精度吗?我看过几篇关于“配料”的文章。或者'随机梯度下降'但我不认为这适用于我的情况。

如果可以的话,你能给我一些伪代码吗? 任何输入都很有价值!

谢谢,

1 个答案:

答案 0 :(得分:4)

一般情况下,如果您在训练后完全合并重量/偏差,则不太可能产生良好的效果。但是,有一些方法可以使它发挥作用。

关于组合权重的直觉请考虑以下简单示例:您有一个带有一个隐藏图层的MLP。如果隐藏层中的节点被置换,则任何两个MLP实例可以产生相同输入的相同输出,权重输入 - >隐藏以相同方式置换,并且权重隐藏 - >输出使用逆置换来置换。换句话说,即使您最终得到的最终网络没有随机性,哪个隐藏节点对应于特定特征也是随机的(并且根据初始化的噪声确定)。

如果你在不同的数据(或相同数据的随机子集)上训练两个这样的MLP,即使初始化都是相同的,它们也可能最终会有隐藏节点的不同排列,因为它们的噪声很大。训练期间的渐变。

现在,如果输入的某个属性最强烈地激活网络A的第i个节点和网络B的第j个节点(并且通常是i!= j),则平均i-之间的权重B的A节点和第i节点(对应于不同的特征)可能会降低性能,甚至产生产生无意义输出的网络。

这里有两种可能的修复方法 - 您可以同时使用其中一种或两种。我们的想法是找出两个网络之间匹配的节点,或者强制节点匹配。

解决方案A :在不同数据上训练两个网络几次迭代。平均两者的权重,并用平均权重替换两个网络。重复。这使得每个网络的第i个节点学习与其他网络的匹配节点相同的特征,因为它们不能分得太远。它们经常从平均权重重新初始化,因此一旦确定了排列,它就可能保持稳定。

平均值的合理值是介于每个时期一次和每几个小时之间。学习仍然比在所有数据上顺序训练一个网络更快,尽管在2个网络上不是快2倍。通信开销远低于每个小批量后的平均权重(或梯度)。这可以在集群中的不同机器上运行:传输权重并不是禁止的,因为它相对不频繁。此外,同时训练的任意数量的网络(以及数据的分割)可以超过两个:在实践中,最多10-20个工作正常。

(提示:为了获得更好的结果,在每个时代之后,在您正在训练的网络之间对数据进行新的随机拆分)

这类似于"梯度聚合"这里提到过,但聚合的次数要少得多。您可以将其视为"懒惰聚合"。

解决方案B :在平均之前尝试确定哪些隐藏层节点匹配。计算权重的一些相似性度量(可以是L2或沿着这些线的任何东西),并平均来自两个网络的最相似节点对的权重。你也可以做一个不仅仅是一对节点的加权平均值;例如,您可以平均所有节点或k个最相似的节点,其中使用的权重是相似性的函数。

对于深度网络,您必须从输入一直跟踪配对,并在计算下一级别的相似度之前根据较低级别的最高相似性配对来置换权重(或者如果进行加权平均,传播权重) 这可能适用于具有几层的网络,但我认为对于非常深的网络,这不太可能完美地工作。对于前几个层,它仍然可以正常工作,但是当您到达网络顶部时,跟踪排列可能无法找到匹配良好的节点。

处理深层网络的另一种方法(其他跟踪从底部开始的排列)是在测试数据集上运行两个网络并记录每个输入的所有节点的激活,然后平均具有相似性的节点的权重激活模式(即通过相同输入强烈激活的激活模式)。同样,这可以基于仅对A和B中最相似的对进行平均,或者对两个以上节点进行适当的加权平均。

您可以将此技术与"解决方案A"一起使用。以上,平均重量稍低一些。您还可以使用节点相似性的加权平均来加速"解决方案A"的收敛。在这种情况下,如果"解决方案B"中的方法是可以的。由于网络偶尔被组合网络取代,因此不能完美地工作 - 但如果组合网络是通过某种匹配方法而不是简单平均产生的,那么组合网络可能会更好。额外的计算是否值得它与集群中减少的通信开销和更快的收敛取决于您的网络架构等。