PyTorch中如何针对不同参数同时最小化与最大化同一损失
优化目标
我有一个目标函数,输入X为图像,需要针对编码器f1、f2最大化损失,同时针对双射卷积g最小化该损失,目标公式如下:
当前实现代码
以下是目前设想的实现方式:
obs_ch1, obs_ch23 = self.infomin.split_RGB_into_R_GB(obs=obs_RGB) obs_ch1, obs_ch23 = self.infomin.R_GB_to_frame_stacked_R_GB( obs_R=obs_ch1, obs_GB=obs_ch23) # minimize wrt g logits = self.infomin.compute_logits(anchor=obs_ch1, pos=obs_ch23) loss = self.cross_entropy_loss(logits, labels) self.infomin_discrim_optimizer.zero_grad() loss.backward() self.infomin_discrim_optimizer.step() # maximize wrt f1, f2 logits = self.infomin.compute_logits( anchor=obs_ch1.detach(), pos=obs_ch23.detach()) labels = torch.arange(logits.shape[0]).long().to(self.device) loss = self.cross_entropy_loss(logits, labels) self.infomin_encoders_optimizer.zero_grad() (-loss).backward() self.infomin_encoders_optimizer.step()
现有实现逻辑说明
- 为f1和f2配置了同一个优化器
infomin_encoders_optimizer,为g单独配置优化器infomin_discrim_optimizer - 先仅针对g计算NCE损失,完成g的参数更新
- 将张量执行detach操作切断梯度流后,再针对f1和f2计算NCE损失,对该损失取反后反向传播完成编码器参数更新
- 采用分步更新的原因是两个优化目标方向相反,无法同步更新;此外必须对g的输出做detach操作,否则会触发g的重复梯度更新报错
核心问题
如何正确实现针对不同参数,同时对同一目标函数执行最小化和最大化操作?
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

