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

How do I merge two trained neural network weight matrices into one?

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

我的问题是;我可以将两个网络的两个权重矩阵组合成一个矩阵,同时保持适当的精度吗?我看过几篇关于'batching'或'stochastic gradient descent'的文章,但我认为这不适合我的情况。

如果可以,能不能也给我一些伪代码? 任何意见都是有价值的!

谢谢,

一般来说,如果你在训练后完全结合权重/偏差,这不太可能产生好的结果。但是,有一些方法可以让它发挥作用。

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

如果你在不同的数据(或相同数据的随机子集)上训练两个类似的 MLP,即使初始化完全相同,它们也可能会以不同的隐藏节点排列结束,因为噪声训练期间的梯度。

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

此处有两种可能的修复方法 - 您可以使用其中一种,也可以同时使用两种方法。这个想法是要么弄清楚哪些节点在两个网络之间匹配,要么强制节点匹配。

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

平均频率的合理值介于每个时期一次和每几个小批量一次之间。学习仍然比按顺序在所有数据上训练一个网络要快,尽管 2 个网络的速度没有快 2 倍。通信开销比每个小批量之后的平均权重(或梯度)低很多。这可以是 运行 在集群中的不同机器上:转移权重并不令人望而却步,因为它相对不常见。此外,同时训练的任意数量的网络(和数据拆分)可以超过两个:在实践中最多 10-20 个可以正常工作。

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

这与此处提到的 "gradient aggregation" 的效果相似,但聚合频率要低得多。您可以将其视为 "lazy aggregation"。

解法B:在求平均之前,尝试找出哪些隐藏层节点匹配。计算一些关于权重的相似性度量(可以是 L2 或任何沿着这些线的东西),并平均来自两个网络的最相似节点对的权重。您还可以对不止一对节点进行加权平均;例如,您可以平均所有节点或 k 个最相似的节点,其中使用的权重是相似性的函数。

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

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

您可以将此技术与上面的 "Solution A" 结合使用,以减少对权重进行平均的次数。您还可以使用节点相似度的加权平均来加速 "Solution A" 的收敛。在那种情况下,如果 "Solution B" 中的方法不能完美工作也没关系,因为网络偶尔会被组合网络替换 - 但如果它是由某种匹配方法生成的组合网络可能会更好而不是简单的平均。与集群中减少的通信开销和更快的收敛相比,额外的计算是否值得取决于您的网络架构等。