pytorch обычно используемый оптимизатор оптимизатор

машинное обучение

Десять часто используемых оптимизаторов

  1. torch.optim.SGD Алгоритм стохастического градиентного спуска (импульс необязателен)

  2. torch.optim.ASGD Алгоритм среднего стохастического градиентного спуска

  3. torch.optim.Rprop упругое обратное распространение ---Для полной партии, а не для мини-партии

  4. torch.optim.Adagrad адаптивный метод оптимизации --- Адаптивно назначайте разные скорости обучения каждому параметру, и на изменение скорости обучения будут влиять размер градиента и количество итераций. Чем больше градиент, тем меньше скорость обучения; чем меньше градиент, тем больше скорость обучения. Недостатком является то, что на более позднем этапе обучения скорость обучения слишком мала.

  5. факел.оптим.Ададельта ---Adadelta является усовершенствованием Adagrad, позволяющим избежать слишком низкой скорости обучения на более позднем этапе обучения.

  6. torch.optim.RMSprop

  7. факел.оптим.Адам(АМСГрад) ---Адам – это адаптивный метод оптимизации скорости обучения. Адам использует оценку момента градиента первого порядка и оценку момента второго порядка для динамической настройки скорости обучения. Добавляя дополнительные ограничения, скорость обучения всегда положительна.

  8. факел.оптим.Адамакс --- Адамакс - это концепция добавления верхнего предела скорости обучения к Адаму.

  9. torch.optim.SparseAdam

  10. torch.optim.LBFGS

Введение

torch.optim это библиотека, которая реализует различные алгоритмы оптимизации.

Чтобы использовать torch.optim, вам необходимо создать объект оптимизатора. Этот объект может поддерживать текущее состояние параметров и обновлять параметры на основе вычисленных градиентов.

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

Задайте параметры индивидуально для каждого параметра

model.baseПараметры будут использовать скорость обучения 1e-2,model.classifierПараметры будут использовать скорость обучения 1e-3, а импульс 0,9 будет использоваться для всех параметров.

optim.SGD([	{'params': model.base.parameters()},
            {'params': model.classifier.parameters(), 'lr': 1e-3}  ], 
            lr=1e-2, momentum=0.9)

функция оптимизации

Адаград (адаптивный градиент)

Градиент каждой итерации каждого параметра возводится в квадрат, накапливается, а затем возводится в квадрат, а базовая скорость обучения делится на это число для динамического обновления скорости обучения.

RMSprop

Чтобы смягчить быстрое снижение скорости обучения Adgrad, RMSprop разлагает накопленную информацию

Ададельта

Adadelta является расширением Adagrad, Adagrad не нужно устанавливать начальную скорость обучения, но использует размер предыдущего шага для оценки размера следующего шага.

Импульсный метод импульса

Моделирует концепцию физического импульса, накапливая предыдущий импульс вместо истинных градиентов. Увеличьте обновление в том же направлении, уменьшите обновление в противоположном направлении.

Ускоренный градиент Нестерова (NAG)

Сделайте большой скачок в направлении ранее ускоренного градиента (коричневый вектор), рассчитайте градиент и затем скорректируйте его (зеленый вектор градиента).

тренировочный код

Код обучения задаче классификации

#----------------data------------------
 
data_num = 100
x = torch.unsqueeze(torch.linspace(-1,1,data_num), dim=1)
y0 = torch.zeros(50) 
y1 = torch.ones(50)
y = torch.cat((y0, y1), ).type(torch.LongTensor)  #数据
 
#----------------train------------------
optimizer = torch.optim.SGD(mynet.parameters(),lr=0.1) #优化器
loss_func = torch.nn.CrossEntropyLoss() #损失函数
for epoch in range(1000):
    optimizer.zero_grad()
 
    #forward + backward + optimize
    
    pred = mynet(x)
    loss = loss_func(pred,y)
    loss.backward()
    optimizer.step()
 
#----------------prediction---------------
test_data = torch.tensor([-1.0])
pred = mynet(test_data)
print(test_data, pred.data)

Код обучения проблеме регрессии

#--------------data--------------------
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2)
 
#--------------train-------------------
optimizer = torch.optim.SGD(mynet.parameters(),lr=0.1) #优化器
loss_func = torch.nn.MSELoss() #损失函数
 
 
for epoch in range(1000):
    optimizer.zero_grad()
 
    #forward + backward + optimize
    
    pred = mynet(x)
    loss = loss_func(pred,y)
    loss.backward()
    optimizer.step()
 
#----------------prediction---------------
test_data = torch.tensor([-1.0])
pred = mynet(test_data)
print(test_data, pred.data)

tips:optimizer.zero_grad() Градиент должен быть обнулен перед каждым обратным распространением, иначе градиенты будут накапливаться вместе и результат не будет сходиться.