如何计算两个网络权重的平均值?

13

假设在PyTorch中我有model1model2,它们具有相同的架构。 它们使用相同的数据进行训练或者其中一个模型是另一个模型的早期版本,但这对问题来说并不重要。现在我想将model的权重设置为model1model2权重的平均值。 在PyTorch中我该怎么做?


1
例如,我可能想要进行Polyakov平均。 - patapouf_ai
@MatiasValdenegro 举个例子:https://arxiv.org/abs/1412.6651 或用于可视化目的:https://openreview.net/forum?id=HkmaTz-0W&noteId=HkmaTz-0W - patapouf_ai
2
@Dr.Snoopy:“权重的平均值根本没有任何意义。”这是完全错误的。联邦学习使用平均值。几乎所有SOTA DeepRL算法中的软更新目标网络也是如此。随机权重平均是一种可能改善收敛性的技术,此外它还提供了另一种贝叶斯深度学习的方式。更不用说无数其他情况下,权重的平均值类似于熟悉的深度学习结构(例如集成、丢弃、正则化)了。 - kyriakosSt
1
@Dr.Snoopy我并不是指梯度平均(像A3C一样)。我提到的每个系列都使用权重平均。对于最后两种情况,我特别指出权重平均“类似于”那些操作。事实上,通过类似于贝叶斯MC Dropout论文中提出的论点,很容易表明“激活平均”和权重平均非常密切相关。尽管如此,权重平均仍然是一个值得研究的合理操作,因为它已经在2018年被发现了许多以上领域之一。 - kyriakosSt
1
@Dr.Snoopy,最初的vanilla DQN没有包括软目标更新。DDPG有,自那以后,许多DQN的实现都有了(1)(2),以及后续的论文(3)。既然您正在研究BDL,我不明白为什么我们还在争论权重平均是否有意义。 - kyriakosSt
显示剩余11条评论
1个回答

15
beta = 0.5 #The interpolation parameter    
params1 = model1.named_parameters()
params2 = model2.named_parameters()

dict_params2 = dict(params2)

for name1, param1 in params1:
    if name1 in dict_params2:
        dict_params2[name1].data.copy_(beta*param1.data + (1-beta)*dict_params2[name1].data)

model.load_state_dict(dict_params2)

摘自pytorch论坛。您可以获取参数,进行转换并重新加载,但请确保维度匹配。

此外,我对您的研究结果非常感兴趣。


2
通常在stackoverflow上,当你链接到外部资源时,你也想在你的答案中重新复制相关信息,因为链接可能最终会成为死链接或者那里的信息可能会发生变化。我已经点赞了,但如果你能通过重新复制页面上相关部分来提供完整的答案,我将能够接受这个答案。 - patapouf_ai
2
@patapouf_ai 没有想到,谢谢你。 - Littleone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接