Optimization 在pytorch中使用两个不同的优化器进行交替优化 我有两个损失函数l1和l2,每个都由两个独立的ADAM优化器opt1和opt2优化 我的参数的当前值是x 我想分别使用opt1和opt2更新x,然后根据梯度的大小“合并”生成的x新值

Optimization 在pytorch中使用两个不同的优化器进行交替优化 我有两个损失函数l1和l2,每个都由两个独立的ADAM优化器opt1和opt2优化 我的参数的当前值是x 我想分别使用opt1和opt2更新x,然后根据梯度的大小“合并”生成的x新值,optimization,pytorch,gradient-descent,Optimization,Pytorch,Gradient Descent,伪码 grad1 = get_grad(l1) grad2 = get_grad(l2) n1 = norm(grad1) n2 = norm(grad2) x1 = opt1(grad1) x2 = opt2(grad2) w = n1 / (n1 + n2) x = w*x1 + (1-w)*x2 我怎样才能在pytorch中完成它?我不知道如何使用backward()和step()在@umaggupta注释之后,我初始化了x的三个副本:两个用于x1和x2,一个用于备份x。那么我做如下 d

伪码

grad1 = get_grad(l1)
grad2 = get_grad(l2)
n1 = norm(grad1)
n2 = norm(grad2)
x1 = opt1(grad1)
x2 = opt2(grad2)
w = n1 / (n1 + n2)
x = w*x1 + (1-w)*x2

我怎样才能在pytorch中完成它?我不知道如何使用
backward()
step()
在@umaggupta注释之后,我初始化了
x
的三个副本:两个用于
x1
x2
,一个用于备份
x
。那么我做如下

def拷贝(目标,源):
对于zip中的x,y(target.parameters(),source.parameters()):
x、 数据。复制(y.data)
def合并(目标、源1、源2、tau):
对于zip中的x、y1、y2(target.parameters()、source1.parameters()、source2.parameters()):
x、 数据复制(tau*y1.data+(1.0-tau)*y2.data)
def梯度标准(x)
n=0。
对于x.parameters()中的p:
p_norm=p.grad.data.norm(2)
n+=p_标准项()**2
返回n**(1/2)
...
拷贝(x_备份,x)
opt1.zero_grad()
l1.向后()
n1=梯度标准(x)
opt1.步骤()
拷贝(x1,x)
拷贝(x,x_备份)
#opt2、x2、n2的情况相同
合并(x,x1,x2,n1/(n1+n2))

如果可能的话,我仍然希望有一种更干净的方法(不确定复制值是否会使我的代码速度变慢)。

在@umaggupta注释之后,我初始化了三份
x
:两份用于
x1
x2
,一份用于备份
x
。那么我做如下

def拷贝(目标,源):
对于zip中的x,y(target.parameters(),source.parameters()):
x、 数据。复制(y.data)
def合并(目标、源1、源2、tau):
对于zip中的x、y1、y2(target.parameters()、source1.parameters()、source2.parameters()):
x、 数据复制(tau*y1.data+(1.0-tau)*y2.data)
def梯度标准(x)
n=0。
对于x.parameters()中的p:
p_norm=p.grad.data.norm(2)
n+=p_标准项()**2
返回n**(1/2)
...
拷贝(x_备份,x)
opt1.zero_grad()
l1.向后()
n1=梯度标准(x)
opt1.步骤()
拷贝(x1,x)
拷贝(x,x_备份)
#opt2、x2、n2的情况相同
合并(x,x1,x2,n1/(n1+n2))

如果可能的话,我仍然希望有一种更简洁的方法(不确定复制值(这种情况经常发生)是否会使我的代码变慢)。

我的最佳猜测是,您必须维护两种不同的模型,分别执行优化步骤,然后在合并步骤中更新每个模型的参数我的最佳猜测是,您必须维护两个不同的模型,分别执行优化步骤,然后在合并步骤中更新每个模型的参数