在pytorch中,仍然可以在不向优化器添加模型参数的情况下进行训练

fquxozlt  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(191)

据我所知,模型的参数不放到优化器中是不能训练的,但是最近我在github上运行一个项目的时候,发现模型的参数不放到优化器中也可以训练,这个项目给优化器添加参数的代码地址是https://github.com/zjunlp/HVPNeT/blob/main/modules/train.py#L500。

def multiModal_before_train(self):
        # bert lr
        parameters = []
        params = {'lr':self.args.lr, 'weight_decay':1e-2}
        params['params'] = []
        for name, param in self.model.named_parameters():
            if 'bert' in name:
                params['params'].append(param)
        parameters.append(params)

        # prompt lr
        params = {'lr':self.args.lr, 'weight_decay':1e-2}
        params['params'] = []
        for name, param in self.model.named_parameters():
            if 'encoder_conv' in name or 'gates' in name:
                params['params'].append(param)
        parameters.append(params)

        # crf lr
        params = {'lr':5e-2, 'weight_decay':1e-2}
        params['params'] = []
        for name, param in self.model.named_parameters():
            if 'crf' in name or name.startswith('fc'):
                params['params'].append(param)

        self.optimizer = optim.AdamW(parameters)

        for name, par in self.model.named_parameters(): # freeze resnet
            if 'image_model' in name:   par.requires_grad = False

        self.scheduler = get_linear_schedule_with_warmup(optimizer=self.optimizer, 
                                                            num_warmup_steps=self.args.warmup_ratio*self.train_num_steps, 
                                                            num_training_steps=self.train_num_steps)
        self.model.to(self.args.device)

可以发现crf和fc的参数被添加到params中,而不是参数中。但它们仍然可以训练,有人知道为什么吗?

um6iljoc

um6iljoc1#

该模型基于提示学习,如果训练了提示,则可以在不训练分类器的情况下训练分类器。

相关问题