ShuffleNet 中优化器的参数

Parameters for Optimizer in ShuffleNet

在 ShuffleNet 中,发送到优化器的参数首先从以下函数传递,该函数生成权重字典:

def get_parameters(model):
    group_no_weight_decay = []
    group_weight_decay = []
    for pname, p in model.named_parameters():
        if pname.find('weight') >= 0 and len(p.size()) > 1:
            # print('include ', pname, p.size())
            group_weight_decay.append(p)
        else:
            # print('not include ', pname, p.size())
            group_no_weight_decay.append(p)
    assert len(list(model.parameters())) == len(group_weight_decay) + len(group_no_weight_decay)
    groups = [dict(params=group_weight_decay), dict(params=group_no_weight_decay, weight_decay=0.)]
    return groups

然后:

optimizer = optim.Adam(get_parameters(model), lr=0.01)

但是这个函数和仅仅使用 model.parameters 而不是 get_parameters(model) 有什么区别呢?

model.parameters() yo get all 单个“组”中的模型参数,因此优化器的所有超参数对于所有 model.parameters().

相比之下,get_parameters()model.parameters() 分为两组:group_weight_decaygroup_no_weight_decay。顾名思义,对于第二组的参数,优化器将 weight_decay 超参数设置为零。