在模型调参中常用的一种方法是针对不同层设置不同的学习率,以此避免因难易程度不一致引起的过拟合等问题。
一、模型举例
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 版权协议,转载请附上原文出处链接和本声明。