【问题标题】:Why does higher need to deep copy the parameters of the base model to create a functional model?为什么higher需要对基础模型的参数进行深度复制来创建功能模型?
【发布时间】: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?

【问题讨论】:

    标签: machine-learning pytorch


    【解决方案1】:

    该行的主要原因是复制所有内容根据后面的代码判断可训练的权重。不幸的是,如果不复制权重也很难实现,因此只需调用 deepcopy。

    如果您跟踪self.param_groups 的使用方式,您会发现每个元素的'params' 实际上只是后来被替换为无here

    这里初始化可微优化器需要复制引用other优化器的所有参数(包括张量和非张量如lr,以及状态如momentum_buffer,但状态稍后复制@ 987654322@)。这有效地创建了other 优化器的所有参数的快照,除了应该将梯度累积到的可训练权重other。所以总的来说,梯度不会通过这些副本传播——它们通过fmodel 的初始权重(如果该模型为copy_initial_weights=False)和/或通过使用override 传递给可微优化器的需要梯度的张量传播。

    【讨论】:

    • 这条线group['params'] = [None] * len(group['params']) 非常令人不安。为什么会在那里?
    • 它的存在正是因为代码的目的是复制所有内容,但是优化器的参数。参数单独处理。它们被复制只是因为你不能告诉deepcopy 不要复制它们。由于不需要这些额外的副本,因此在这一行中对它们的所有引用都替换为 None 值。
    • 可微优化器的实际参数由fmodel提供。而fmodelmonkeypatch 函数与copy_initial_weights=Falsecopy_initial_weights=True 创建。根据第二个,梯度将传播到初始模型的参数或不传播。 innerloop_ctx 正在创建 fmodel here
    • 我很困惑的是,如果更高版本的代码曾经在某个地方出现过group['params'] = fmodel.parameters() ?是他们拥有的代码部分:设置params = self._fmodel.fast_params if params is None else params之后的group['params'][i] = params[index]。如果不是这样,那么我不知道原始初始参数的渐变不是None
    • 是的,您提到的this line 为可微优化器提供了最新版本的快速模型参数,以创建更新版本的模型参数。第一次完成时,最新版本是“慢”模型参数的克隆版本(取决于copy_initial_weights,它有时也被分离)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多