Десять часто используемых оптимизаторов
-
torch.optim.SGD Алгоритм стохастического градиентного спуска (импульс необязателен)
-
torch.optim.ASGD Алгоритм среднего стохастического градиентного спуска
-
torch.optim.Rprop упругое обратное распространение ---Для полной партии, а не для мини-партии
-
torch.optim.Adagrad адаптивный метод оптимизации --- Адаптивно назначайте разные скорости обучения каждому параметру, и на изменение скорости обучения будут влиять размер градиента и количество итераций. Чем больше градиент, тем меньше скорость обучения; чем меньше градиент, тем больше скорость обучения. Недостатком является то, что на более позднем этапе обучения скорость обучения слишком мала.
-
факел.оптим.Ададельта ---Adadelta является усовершенствованием Adagrad, позволяющим избежать слишком низкой скорости обучения на более позднем этапе обучения.
-
torch.optim.RMSprop
-
факел.оптим.Адам(АМСГрад) ---Адам – это адаптивный метод оптимизации скорости обучения. Адам использует оценку момента градиента первого порядка и оценку момента второго порядка для динамической настройки скорости обучения. Добавляя дополнительные ограничения, скорость обучения всегда положительна.
-
факел.оптим.Адамакс --- Адамакс - это концепция добавления верхнего предела скорости обучения к Адаму.
-
torch.optim.SparseAdam
-
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() Градиент должен быть обнулен перед каждым обратным распространением, иначе градиенты будут накапливаться вместе и результат не будет сходиться.