pytorch динамически регулирует скорость обучения

искусственный интеллект

задний план

Углубленная алхимия похожа на тушение ребрышек: их нужно сначала разогреть на большом огне, затем томить на среднем огне, чтобы получить питательные вещества, и, наконец, поставить на слабый огонь, чтобы собрать сок.
В этой статье дается несколько методов настройки «теплового регулятора» в алхимии — скорости обучения.pytorch

1. Настройте, чтобы изменить скорость обучения в соответствии с эпохой.

Этот метод распространен в открытом исходном коде, вот код в официальном экземпляре pytorch.adjust_lr

def adjust_learning_rate(optimizer, epoch):
    """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
    lr = args.lr * (0.1 ** (epoch // 30))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

Примечание. При вызове этой функции вам необходимо ввести используемый оптимизатор и соответствующую эпоху, а также необходимо указать args.lr в качестве начальной скорости обучения.

Используйте пример кода:

optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
for epoch in range(10):
    adjust_learning_rate(optimizer,epoch)
    train(...)
    validate(...)

2. Установите разные скорости обучения для разных слоев модели.

Когда мы используем предварительно обученную модель, нам нужно изменить и инициализировать слой классификации отдельно, а параметры других слоев инициализируются параметрами предварительно обученной модели, В это время мы надеемся, что в процессе обучения слои кроме слоя классификации Выполняется только тонкая настройка, и нет необходимости слишком сильно изменять параметры, поэтому необходимо установить небольшую скорость обучения. Слой скорректированной классификации должен сходиться большими шагами, а скорость обучения часто устанавливается большей.Возьмите в качестве примера resnet101 и установите скорость обучения в слоях.

model = torchvision.models.resnet101(pretrained=True)
large_lr_layers = list(map(id,model.fc.parameters()))
small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
optimizer = torch.optim.SGD([
            {"params":large_lr_layers},
            {"params":small_lr_layers,"lr":1e-4}
            ],lr = 1e-2,momenum=0.9)

Примечание: скорость обучения large_lr_layers составляет 1e-2, скорость обучения small_lr_layers составляет 1e-4, и два параметра имеют общий момент.

3. Измените l в соответствии с конкретными потребностями

Когда я раньше использовал keras, мне нравился ReduceLROnPlateau, который может изменять lr в зависимости от изменений потерь или точности. Недавно обнаружил, что pytorch также реализует эту функцию.

class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)

В качестве примера возьмем acc, когда для режима установлено значение «max», если acc не улучшается в течение заданного терпения, тогда уменьшите lr в множитель множителя.

Пример использования:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'max',verbose=1,patience=3)
for epoch in range(10):
    train(...)
    val_acc = validate(...)
    # 降低学习率需要在给出 val_acc 之后
    scheduler.step(val_acc)

4. Вручную установите диапазон затухания LR

Пример использования

def adjust_learning_rate(optimizer, lr):
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

for epoch in range(60):        
    lr = 30e-5
    if epoch > 25:
        lr = 15e-5
    if epoch > 30:
        lr = 7.5e-5
    if epoch > 35:
        lr = 3e-5
    if epoch > 40:
        lr = 1e-5
    adjust_learning_rate(optimizer, lr)

5. Косинусный отжиг

бумага: SGDR: Stochastic Gradient Descent with Warm Restarts

Пример использования

epochs = 60
optimizer = optim.SGD(model.parameters(),lr = config.lr,momentum=0.9,weight_decay=1e-4) 
scheduler = lr_scheduler.CosineAnnealingLR(optimizer,T_max = (epochs // 9) + 1)
for epoch in range(epochs):
    scheduler.step(epoch)

В настоящее время существует не так много наиболее часто используемых категорий.Конечно, есть много других категорий.Подробнее см.how-to-adjust-learning-rate

использованная литература