Найти глобальный минимум с GD в PyTorch

1

Я обучил NN с векторным вводом и скалярным выходом (регрессией). Теперь я хочу найти глобальный minimun NN, используя GD с pytorch.

Я новичок в программировании вообще, python специально, и pytorch еще более определенно.

Я считаю, что то, что я пытаюсь сделать, должно было быть сделано тысячу раз раньше, если не десять тысяч раз. Я был бы очень счастлив и благодарен, если бы кто-нибудь мог указать мне какой-нибудь код где-нибудь (может быть, в github), где theres пример того, что я пытаюсь сделать, чтобы я мог приспособиться к моим потребностям.

  • 0
    смысл: хочу знать какие входы дадут минимальный (максимальный) вывод
  • 0
    Важно отметить, что оптимизация на основе градиента гарантирует только поиск локальных минимумов. Только для особых случаев вашей нейронной сети и потери (если функция потерь выпуклая) GD произведет глобальный минимум. Может быть полезно изучить, как производные работают более подробно, но градиент является локальным атрибутом, дающим самый крутой уклон в одной точке. Для действительно краткого введения прочитайте это
Теги:
pytorch
regression
gradient-descent
non-linear-regression

1 ответ

0

Вы делаете то, что вы сделали для обучения своей сети, но вместо обновления весов вы обновляете ввод:

input = torch.zeros([1,3,32,32], requires_grad=True) # Whatever the expected input size of your network is
output = model(input)
target = 0.0 # What kind of target should your network reach?
loss = ((target - output) ** 2) # Replace this with the loss you are using
grad = torch.autograd.grad(loss, input)

Вы можете применить градиент (возможно, умноженный на скорость обучения) на вход и повторить этот шаг много раз. Я обновил это с https://discuss.pytorch.org/t/gradient-of-loss-of-neural-network-with-respect-to-input/9482

Вы должны обратить внимание на то, что, вероятно, ваша сеть может создавать довольно шумные "входы", поэтому вам следует подумать о том, каким должен быть ваш исходный вход. Ранее Google делал что-то подобное, см., Например, https://www.networkworld.com/article/2974718/software/deep-dream-artificial-intelligence-meets-hallucinations.html

  • 0
    здорово! Благодарю. это работает отлично. мой код теперь выглядит так: для t в диапазоне (30): input = 100 * softmax (вход), output = net (input), loss = -output, loss_list.append (loss), grad = torch.autograd.grad (потеря, ввод), grad = torch.tensor (grad [0]), ввод - = learning_rate * grad. однако после нескольких обновлений вход становится вектором с одним горячим вектором, который после применения softmax становится 'Nan'. даже если я использую очень логичное начальное значение (из данных, использованных для обучения NN), есть мысли?
  • 0
    Ваша потеря - это просто отрицательный результат работы сети, в регрессии должно быть что-то вроде целевого значения. И не могли бы вы немного объяснить, почему вы применяете преобразование input=100*softmax(input) ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню