【发布时间】:2020-10-07 19:13:24
【问题描述】:
我在上级库中找到了this line of code:
self.param_groups = _copy.deepcopy(other.param_groups)
我不明白为什么需要这样做。
如果有什么我认为它是有害的,我已经概述了here。你可以去这个问题看看我的原因,但要点是:
深拷贝不是意味着(外循环)优化器将根据计算图中不存在的参数计算梯度吗?自:
与初始参数/权重相比,可微/内部优化器的参数是深度副本 外部优化器(例如 Adam)将具有原始/初始参数,因此这些参数的梯度应始终为零。 这是我能想到的解释我过去的问题的唯一解释(梯度意外为零),但似乎更高的 MAML 教程有效,这应该与我的理论背道而驰。如果我的理论正好位于 MAML 内部循环的末尾,并且当外部优化器(通常是 Adam)计算梯度时,它们应该为零(我有时会观察到)。但我假设它们不为零,否则该教程将无法正常工作。
所以我询问在创建内部优化器时是否需要使用深拷贝。它的目的是什么,为什么它不会导致我在更高版本的原始 MAML 教程中描述的问题。为什么深拷贝不会破坏前向传播,因此整个梯度计算不会破坏外部优化器将使用的初始化?
我认为我困惑的核心是我不明白为什么我们首先需要做deepcopy。如果没有所有其他代码(这对我来说似乎很复杂),我们甚至可能会冒着我们可能想用外部优化器训练的初始化可能无法训练的风险,因为外部/元优化器有一个指向原始模型参数的指针,而不是一个内部优化器可能拥有的深层副本的副本。
为什么开发人员要通过添加看似具有高风险的大量代码来经历所有这些?
关于初始参数的复制如何在更高层发生的相关问题:What does the copy_initial_weights documentation mean in the higher library for Pytorch?
【问题讨论】: