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

Ger*_*tra 6 python machine-learning matrix neural-network mnist

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

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

如果这是可能的,你还可以提供一些伪代码吗?任何输入都很有价值!

谢谢,

Ale*_*x I 7

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

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

如果您在不同的数据(或相同数据的随机子集)上训练两个 MLP,即使初始化都相同,由于训练期间梯度的噪声,它们最终可能会得到不同的隐藏节点排列.

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

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

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

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

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

这实际上类似于此处提到的“梯度聚合”,但聚合的频率要低得多。您可以将其视为“惰性聚合”。

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

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

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

您可以将此技术与上面的“解决方案 A”一起使用,以稍微降低权重的平均频率。您还可以使用节点相似度的加权平均来加速“解决方案 A”的收敛。在这种情况下,如果“解决方案 B”中的方法不能完美运行也没关系,因为网络偶尔会被组合网络替换 - 但如果组合网络是通过某种匹配方法生成的,则可能会更好而不是简单的平均。额外的计算与集群中减少的通信开销和更快的收敛是否值得取决于您的网络架构等。