如何为模型不同层设置不同的学习率?

  • Post author:
  • Post category:其他


在模型调参中常用的一种方法是针对不同层设置不同的学习率,以此避免因难易程度不一致引起的过拟合等问题。

一、模型举例

class Model(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(self, Model).__init__()
        self.linear_in = nn.Linear(input_size, hidden_size)
        self.global_gru = DynamicLSTM(hidden_size, hidden_size, bidirectional=True, rnn_type='GRU')
        self.linear_out = nn.Linear(2 * hidden_size, output_size)
        self.dropout = nn.Dropout(0.3)
    
    def forward(self, x, length):
        x = self.linear_in(x)
        x = self.global_gru(x, length)
        x = F.relu(self.linear_out(x))
        x = self.dropout(x)
        return x

假设现在我们需要对GRU层设置一个较大的学习率,对模型其余层设置一个较小的学习率,那么应该怎么做呢?

二、设置方法

model = Model(1024, 400, 512)

# 获取模型GRU层参数ID
gru_layer = torch.nn.ModuleList([model.global_gru])
gru_layer_params = list(map(id, gru_layer.parameters()))

# 获取模型其余层参数ID
rest_layers_params = filter(lambda p: id(p) not in gru_layer_params, model.parameters())

# 使用Adam优化器, weight_decay统一设定为0.00001

optimizer = Adam([{"params": model.global_gru.parameters(), "lr": 0.0002},
                  {"params": rest_layers_params, "lr": 0.00005}],
                   , weight_decay=0.00001)

此种方法通常也可以用在多任务学习中,针对不同的任务设置不同的学习率,可以使模型获得更好的效果。



版权声明:本文为weixin_45684362原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。