Estrategia de disminución de la tasa de aprendizaje

Recientemente, encontré un problema en el entrenamiento de la red, y luego comencé a buscar información. Vi que la estrategia de atenuación de la tasa de aprendizaje podría resolver mi problema, y ​​luego lo estudié por un tiempo. Resuelva y cambie su mente, y será conveniente para futuras referencias.

El siguiente contenido principal proviene de: pytorch----la estrategia de disminución de la tasa de aprendizaje en el aprendizaje profundo , si está interesado, vaya al texto original.

Por qué ajustar la tasa de aprendizaje

El mecanismo de actualización de parámetros de red neuronal es descenso de gradiente + propagación hacia atrás , y el error de salida se propaga hacia atrás a los parámetros de red para ajustarse a la salida de la muestra. En esencia, es un proceso de optimización , que gradualmente tiende a la solución óptima. Pero cada vez que se actualiza un parámetro 利用多少误差, necesita ser controlado por un parámetro, que es el índice de aprendizaje (Learning rate), también conocido como tamaño de paso.

La tasa de aprendizaje es un hiperparámetro importante en la optimización de redes neuronales. El valor de la tasa de aprendizaje es muy crítico. Cuanto mayor sea la tasa de aprendizaje, más rápido se actualizarán los pesos. En el método de descenso de gradiente, si es demasiado grande, no convergerá, y si es demasiado pequeño, la velocidad de convergencia será demasiado lenta . Cuanto mayor sea la tasa de aprendizaje, mayor será el impacto del error de salida en los parámetros y más rápido se actualizarán los parámetros, pero al mismo tiempo, cuanto mayor sea el impacto de los datos anormales, es fácil divergir.

En términos generales, esperamos que la tasa de aprendizaje sea mayor en la etapa inicial del entrenamiento, para que la red converja rápidamente, y la tasa de aprendizaje sea menor en la etapa posterior del entrenamiento, para que la red evite la oscilación cuando converge al punto óptimo, para converger mejor a la solución óptima. Por lo tanto, se puede lograr un ajuste de la tasa de aprendizaje relativamente simple y directo mediante el decaimiento de la tasa de aprendizaje (Learning Rate Decay).

categoría gran tasa de aprendizaje pequeña tasa de aprendizaje
velocidad de aprendizaje rápido lento
tiempo de uso Al comienzo del entrenamiento (convergencia rápida) Después de un cierto número de rondas (no es fácil de oscilar)
defecto 1. Explosión de valor fácil de perder 2. Fácil de oscilar 1. Fácil de adaptar 2. Convergencia lenta

Mecanismo de disminución de la tasa de aprendizaje

La tasa de aprendizaje ideal no es un valor fijo, sino un valor que cambia con el número de veces de atenuación del entrenamiento, es decir, en la etapa inicial del entrenamiento, la tasa de aprendizaje es relativamente grande y, a medida que avanza el entrenamiento, la tasa de aprendizaje continúa. disminuir hasta que el modelo converja.

Los mecanismos de atenuación comúnmente utilizados son: atenuación de la tasa de aprendizaje de políticas fijas y atenuación de la tasa de aprendizaje adaptativa ,

El decaimiento de la tasa de aprendizaje fijo incluye el decaimiento segmentario , el decaimiento de tiempo inverso , el decaimiento exponencial , etc.

El decaimiento de la tasa de aprendizaje adaptable incluye AdaGrad , RMSprop , AdaDelta, etc., y se pueden configurar diferentes tasas de aprendizaje para cada parámetro. Por lo general, las dos estrategias se usan en combinación.

El código utilizado en este artículo:

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt


# 定义模型
class TheModelClass(nn.Module):
    def __init__(self):
        super(TheModelClass, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
 
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


# 初始化模型
model = TheModelClass()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)


scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.96)#指数衰减
# scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.65)#固定步长衰减
# scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[50, 55, 65, 75, 80], gamma=0.8)#多步步长衰减
# scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=80, eta_min=0.0000001)#余弦衰减
# scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',factor=0.999, patience=10,verbose=True, threshold=0.0001, threshold_mode='rel',cooldown=0, min_lr=0, eps=1e-08)
# lambda2 = lambda epoch: 0.95 ** epoch
# scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda2], last_epoch=-1)


learning_all = []  # 存放损失的数组
for epoch in range(100):
#adjust_learning_rate(optimizer, epoch)
    scheduler.step()
    learning_all.append(optimizer.state_dict()['param_groups'][0]['lr'])


plt.figure(figsize=(12, 4))
plt.plot(range(100), learning_all,"r.-", label="learning-rate")
plt.xlabel("epoch")
plt.ylabel("learning")
plt.legend()
plt.show()

Método de ajuste lr_scheduler: según épocas

Decrecimiento exponencial

Decaer exponencialmente la tasa de aprendizaje es una estrategia común y la más efectiva. En primer lugar, es necesario determinar qué optimizador implementará la estrategia de ajuste dinámico de la tasa de aprendizaje, primero defina un optimizador y luego vincule un controlador de tasa de aprendizaje de decaimiento exponencial a este optimizador:

#定义优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
#指数衰减学习率控制器: 即每个epoch都衰减lr = lr * gamma,即进行指数衰减
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.96)

El parámetro gamma representa la base de la atenuación, y se pueden seleccionar diferentes valores de gamma para obtener curvas de atenuación con diferentes amplitudes.

inserte la descripción de la imagen aquí

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.ExponentialLR.html?highlight=exponentiallr#torch.optim.lr_scheduler.ExponentialLR

inserte la descripción de la imagen aquí

decaimiento del segmento

A veces se espera que la tasa de aprendizaje decaiga a una parte de la gamma original cada cierto tamaño de paso (o época), es decir, la tasa de aprendizaje se actualiza de acuerdo con una longitud de intervalo fija, o se espera que diferentes intervalos adopten una actualización diferente. frecuencias, y algunos intervalos actualizan la tasa de aprendizaje, algunos intervalos no actualizan la tasa de aprendizaje , el optimizador todavía se define primero cuando se usa, y el controlador StepLR o MultiStepLR está vinculado al optimizador para realizar el control de la longitud del intervalo:

#即在规定步长都衰减lr = lr * gamma,进行衰减
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
#固定步长衰减,gamma参数表示衰减的程度,step_size参数表示每隔多少个step进行一次学习率调整
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.65)
#多步长衰减 ,gamma参数表示衰减的程度,,milestones参数为表示学习率更新的起止区间,
scheduler=torch.optim.lr_scheduler.MultiStepLR(optimizer,
                            milestones=[50, 55, 65, 75, 80], gamma=0.8)

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.StepLR.html?highlight=steplr#torch.optim.lr_scheduler.StepLR

inserte la descripción de la imagen aquí

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.MultiStepLR.html?highlight=multisteplr#torch.optim.lr_scheduler.MultiStepLR

inserte la descripción de la imagen aquí

decaimiento de recocido de coseno

Hace que la tasa de aprendizaje varíe según el periodo. Contiene los mismos parámetros que el conocimiento del coseno. El parámetro T_max indica el periodo del coseno, eta_min indica el valor mínimo de la tasa de aprendizaje. Por defecto es 0 para indicar que el aprendizaje tasa es al menos un valor positivo. Para determinar una función de coseno, debe conocer el valor máximo y el período, donde el período es T_max y el valor máximo es la tasa de aprendizaje inicial. Se define de la siguiente manera:

#定义优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
# 余弦退火衰减,T_max表示余弦周期,eta_min表示学习率的最小值
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=80, eta_min=0.0000001)

inserte la descripción de la imagen aquí

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CosineAnnealingLR.html?highlight=cosineannealinglr#torch.optim.lr_scheduler.CosineAnnealingLR

inserte la descripción de la imagen aquí

Comparación de diferentes métodos de atenuación

La siguiente figura da ejemplos de diferentes métodos de descomposición (suponiendo una tasa de aprendizaje inicial de 1)

inserte la descripción de la imagen aquí

Método de ajuste lr_scheduler: Ajuste adaptativo según indicadores de prueba

Cuando el índice de evaluación no mejora, por ejemplo, cuando la pérdida del conjunto de verificación ya no disminuye, ajuste la tasa de aprendizaje; o controle la precisión del conjunto de verificación, y ajuste la tasa de aprendizaje cuando la precisión ya no aumenta El rendimiento de la red se puede mejorar reduciendo la tasa de aprendizaje de la red.

La clase utilizada por torch.optim.lr_scheduler.ReduceLROnPlateaueste método proporciona una reducción dinámica de la tasa de aprendizaje basada en algunas mediciones durante el entrenamiento. Al usarlo, debe seleccionar la métrica (test_loss) de la red , y los corchetes son la pérdida del conjunto de verificación que generalmente usa el indicador. Use el método de paso de la siguiente clase para implementar

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
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)
for epoch in range(10):
     train(...)
     val_loss = validate(...)
     # Note that step should be called after validate()
     scheduler.step(val_loss)
  • optimer , un optimizador para la red
  • mode (str) , puede elegir 'min' o 'max', min significa que cuando la cantidad de monitoreo deja de caer (como la pérdida de monitoreo), la tasa de aprendizaje disminuirá, max significa cuando la cantidad de monitoreo deja de aumentar (como el monitoreo precisión), la tasa de aprendizaje disminuirá. El valor predeterminado es 'min'
  • factor , cuánto se reduce la tasa de aprendizaje cada vez, new_lr = old_lr * factor
  • Paciencia , el número de veces que el rendimiento de la red de tolerancia no mejora, la tasa de aprendizaje se reduce si el número es mayor que este número y la tasa de aprendizaje se reduce cuando el número de tiempos de paciencia consecutivos del índice no ha mejorado.
  • verbose (bool) , si es True, envía un mensaje a stdout para cada actualización. Valor predeterminado: falso
  • umbral (flotante) , el umbral en el que medir el nuevo óptimo, centrándose solo en los cambios significativos. Predeterminado: 1e-4
  • Enfriamiento , después de ajustar la tasa de aprendizaje, deje que la estrategia de ajuste de la tasa de aprendizaje se enfríe (espere algunas épocas), deje que el modelo entrene por un tiempo y luego reinicie el modo de monitoreo. Valor predeterminado: 0.
  • min_lr , el límite inferior de la tasa de aprendizaje, puede ser flotante o lista, cuando hay varios grupos de parámetros, se puede configurar con lista.
    eps , la atenuación mínima para lr. Si la diferencia entre el lr antiguo y el nuevo es inferior a eps, la tasa de aprendizaje no se ajusta. . Predeterminado: 1e-8.

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.ReduceLROnPlateau.html?highlight=reducelronplateau#torch.optim.lr_scheduler.ReduceLROnPlateau

inserte la descripción de la imagen aquí

Método de ajuste lr_scheduler: ajuste personalizado

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)

Establece la tasa de aprendizaje para cada grupo de parámetros en un lr inicial multiplicado por la función dada. Cuando last_epoch=-1, establezca el lr inicial en lr.

Estrategia de actualización :

nuevo _ lr = λ × inicial _ lr nuevo\_lr = \lambda×inicial\_lrnuevo _ l r _ _=yo×ini t ia l _ l r

# Assuming optimizer has two groups.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()
lambda1 = lambda epoch: epoch // 30

inserte la descripción de la imagen aquí

lambda2 = lambda epoch: 0.95 ** epoch

inserte la descripción de la imagen aquí

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.LambdaLR.html?highlight=lambdalr#torch.optim.lr_scheduler.LambdaLR

inserte la descripción de la imagen aquí

Uso en modelos

Para estas clases responsables del ajuste de la tasa de aprendizaje, la actualización completa de la tasa de aprendizaje se completa después de llamar a la función step(). El significado expresado por este paso puede ser una iteración. Por supuesto, en la mayoría de los casos, debe realizarse después de una época Un programador.paso (), que se determina de acuerdo con el problema específico. La llamada a la función scheduler.step() debe realizarse después de la actualización del optimizador :

scheduler = ...
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()

La estrategia de disminución de la tasa de aprendizaje depende en gran medida de la experiencia y de problemas específicos, y los parámetros no se pueden copiar. La tasa de aprendizaje exponencialmente decreciente es un método relativamente utilizado en el proceso de ajuste de parámetros de aprendizaje profundo. Al comienzo del entrenamiento, la tasa de aprendizaje debe ser de 0.01 ~ 0.001. Cuando el entrenamiento se acerca al final, la tasa de aprendizaje debe atenuarse en más de 100 veces Establecer parámetros relevantes de acuerdo con esta experiencia ayudará en gran medida a la precisión del modelo.

Referencias

Pytorch----La estrategia de atenuación de la tasa de aprendizaje en el aprendizaje profundo

Supongo que te gusta

Origin blog.csdn.net/qq_41990294/article/details/129001482
Recomendado
Clasificación