Как в Torch добавить импульс моему стохастическому спуску?

Я реализую многоуровневую нейронную сеть персептрона в Torch, следуя этому примеру ( из раздела «Пример: обучение нейронной сети» в раздел «Основы Torch: тестирование вашей нейронной сети»).

Теперь мне нужно добавить некоторый импульс к этой модели нейронной сети, но я не могу понять, как это сделать. сделай это. Часть градиентного спуска:

criterion = nn.MSECriterion()  
trainer = nn.StochasticGradient(mlp, criterion)
trainer.learningRate = 0.01
trainer:train(dataset)

Я хотел, чтобы была какая-то команда типа: train.momentum = 1, но такой вещи нет.

Кто-нибудь знает, как добавить импульс моей модели нейронной сети Torch?


person DavideChicco.it    schedule 17.12.2015    source источник


Ответы (2)


С помощью пакета optim (см. https://github.com/torch/optim) для оптимизации можно сделать таблица Lua для параметров. Вот пример;

optimState = { 
learningRate = 0.001,
weightDecay = 0,
momentum = 0.9,
learningRateDecay = 0 
}

Затем вы можете передать эту таблицу параметров в функцию optim.method (которая оптимизирует вашу функцию потерь), например;

optim.method(func, x, optimState)
person mattdns    schedule 23.01.2016
comment
Спасибо @mattdns. Я проверил optim, но мне это кажется немного сложным. Должен ли я всегда самостоятельно определять функцию func и ее производную? - person DavideChicco.it; 18.02.2016
comment
См. rnduja.github.io/2015/10/26/. Существует функция с именем feval, которой вы по существу заменяете func. Просто немного отредактируйте код внутри feval, чтобы он соответствовал вашему коду. Вы в основном, но все это внутри цикла for, который перебирает ваши данные. - person mattdns; 18.02.2016

Вы можете сделать одно из двух:

  • реализовать SGD самостоятельно - на самом деле это очень простой алгоритм. Это займет всего несколько строк кода факела, а затем добавит импульс
  • используйте другую библиотеку для обучения, например optim пакет из torch https://github.com/torch/optim/blob/master/doc/index.md с несколькими методами обучения, включая SGD с импульсом
person lejlot    schedule 15.01.2016
comment
Спасибо @leijot. Я уже реализовал стохастический градиентный спуск (SGD) самостоятельно, но что мне сделать, чтобы добавить импульс? Вот мой код: bit.ly/1XyxHFv - person DavideChicco.it; 18.02.2016
comment
на каждом шаге вы перемещаете свои параметры в сторону отрицательного градиента - импульс просто указывает, а не просто добавляет Learning_step * градиент также немного перемещается в сторону последнего градиента. См. en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum. - person lejlot; 18.02.2016