Machine learning 为什么higher需要深度复制基础模型的参数来创建功能模型?

Machine learning 为什么higher需要深度复制基础模型的参数来创建功能模型?,machine-learning,pytorch,Machine Learning,Pytorch,我在高等图书馆发现: self.param_groups = _copy.deepcopy(other.param_groups) 我不明白为什么需要这样 如果有什么我认为是有害的,就像我所说的。你可以去看看我的理由,但要点是: 拥有深度复制难道不意味着(外循环)优化器将针对计算图中不存在的参数计算梯度吗?自: 与初始参数/权重相比,可微/内部优化器的参数是一个深度副本 外部优化器(如Adam)将具有原始/初始参数,因此这些参数的梯度应始终为零。 这是我能想到的解释我过去的问题的唯一解释(梯度

我在高等图书馆发现:

self.param_groups = _copy.deepcopy(other.param_groups)
我不明白为什么需要这样

如果有什么我认为是有害的,就像我所说的。你可以去看看我的理由,但要点是:

拥有深度复制难道不意味着(外循环)优化器将针对计算图中不存在的参数计算梯度吗?自:

与初始参数/权重相比,可微/内部优化器的参数是一个深度副本 外部优化器(如Adam)将具有原始/初始参数,因此这些参数的梯度应始终为零。 这是我能想到的解释我过去的问题的唯一解释(梯度出乎意料地为零),但似乎更高的MAML教程有效,这应该与我的理论相违背。如果我的理论在MAML内部循环的末尾是正确的,并且当外部优化器(通常是Adam)计算梯度时,它们应该是零(我有时会观察到)。但我假设它们不是零,否则教程就不起作用了

因此,我想知道在创建内部优化器时是否需要使用深度复制。它的目的是什么?为什么它不会引起我在更高版本的原始MAML教程中描述的问题。深度复制如何不破坏前向传递,从而使梯度的整个计算不破坏外部优化器将使用的初始化


我认为我困惑的核心是我不明白为什么我们首先需要做
deepcopy
。如果没有所有其他代码(对我来说似乎很复杂),我们甚至有可能希望使用外部优化器训练的初始化无法训练的风险,因为外部/元优化器有一个指向原始模型参数的指针,而不是内部优化器可能拥有的深度副本的副本

为什么开发人员要通过添加似乎具有高风险的大量代码来完成这些工作



关于初始参数复制如何在更高版本中发生的相关问题:

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

如果您跟踪如何使用
self.param_组
,您会发现每个元素的
“params”
实际上只是稍后被None替换


此处可微优化器的初始化需要复制参考
其他
优化器拥有的所有参数(包括张量和非张量参数,如
lr
,以及状态,如
momentum\u buffer
,但状态稍后复制)。这有效地创建了
other
优化器的所有参数的快照,除了可训练权重
other
应将梯度累积到中。因此总体而言,梯度不会通过这些副本传播-它们通过
fmodel
的初始权重传播(如果该模型的
copy\u initial\u weights=False
)和/或通过需要梯度的张量传递给可微优化器,使用
覆盖

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

如果您跟踪如何使用
self.param_组
,您会发现每个元素的
“params”
实际上只是稍后被None替换


此处可微优化器的初始化需要复制参考
其他
优化器拥有的所有参数(包括张量和非张量参数,如
lr
,以及状态,如
momentum\u buffer
,但状态稍后复制)。这有效地创建了
other
优化器的所有参数的快照,除了可训练权重
other
应将梯度累积到中。因此总体而言,梯度不会通过这些副本传播-它们通过
fmodel
的初始权重传播(如果该模型的
copy\u initial\u weights=False
)和/或通过需要梯度的张量传播,这些张量使用
覆盖

这一行
组['params]=[无]*len(组['params')
非常令人不安。它为什么会在那里?它的存在正是因为那里的代码的目的是复制所有东西,但优化器的参数除外。参数是单独处理的。复制它们只是因为您无法告诉
deepcopy
不要复制它们。由于不需要这些额外的副本,因此在这一行中,对它们的所有引用都被无值替换。可微优化器的实际参数由
fmodel
提供。
fmodel
monkeypatch
函数创建,该函数具有
copy\u initial\u weights=False
copy\u initial\u weights=True
。根据第二种情况,渐变将传播到初始模型的参数或不传播
innerloop\u ctx
正在创建fmodel。我感到困惑的是,来自更高级别的代码是否在某个地方执行
group['params']=fmodel.parameters()
?设置
params=self.\u fmodel.fast\u params(如果params不是其他参数)
后,是否是代码的一部分:
group['params'][i]=params[index]
。如果不是这样的话,那么我不知道原始初始参数的梯度如何不是
None
。是的,您提到的是,为微分优化器提供最新版本的快速模型参数,以创建更新版本的快速模型参数。第一次完成时,最新版本是“慢速”模型参数的克隆版本