Основные вопросы о подборе формулы с помощью градиентного спуска или генетического алгоритма

Я пытался закодировать следующую проблему. Я определил функцию, зависящую от ряда параметров (в моем случае брэгговского зеркала и рентгеновского луча). Теперь я пытаюсь сравнить результаты с результатами, смоделированными другой программой по той же формуле, но, похоже, некоторые из моих параметров отключены, поэтому результаты не совсем то же самое.

Что мне делать, если я хочу выяснить правильные параметры? Единственное, что у меня есть, это формула f (x1, x2,..), экспериментальная кривая, с которой я сравниваю свои результаты, и некоторое представление о том, как должны выглядеть параметры (x1 +- dx1, x2 +- dx2,.. ).

Что я использую, чтобы минимизировать остаток? Я знаю, что Multifitting использует формат алгоритм Левенберга-Марквардта, и я читал, что это возможно с помощью генетический алгоритм или стохастический градиентный спуск (хотя, насколько я понимаю, они чаще используются для задач с нейронными сетями). У меня возникли проблемы с тем, чтобы понять, что и как мне кодировать: вычисление функции занимает пару минут, поэтому генетический алгоритм может быть не идеальным, и я признаю, что не могу понять известную мне SCG, реализованную на Python.

Что бы вы предложили мне использовать в моем более простом случае? Если здесь должны быть реализованы другие алгоритмы, кроме того, который использует модуль GA, есть ли для них четкое базовое объяснение? Я задаю этот вопрос в правильном месте? Заранее спасибо.


person user55702    schedule 25.04.2020    source источник


Ответы (2)


Я не знаком с GA или использованием SGD ни в чем, кроме нейронных сетей. Но похоже, что когда значения reflected energy по оси Y становятся ниже 10^-4, подгонке трудно выполнять свою работу. Просто пара идей:

  1. Глядя на то, что происходит с градиентом при значениях для y < 10^-4. Он исчезает, когда функция погружается? Возвращает странные значения?
  2. Проверка lmfit и оптимизаторы и установщики scipy, если вы еще этого не сделали.
  3. Проверка того, возвращает ли ваша функция значения NaN, когда функция падает или опускается до малых значений y.
person sbjartmar    schedule 02.05.2020

Я согласен с точками, сделанными sbjartmar, но я подозреваю, что есть более простое объяснение разницы и пути к исправлению подгонки, которую вы получаете. Должен сказать, что я не знаком с программным обеспечением Multifitting, но подозреваю, что оно делает то, чего не делаете вы, и мне тоже стоит попробовать:

Поскольку вы строите график в логарифмическом масштабе, вы подчеркиваете очень низкие значения интенсивности. Фактически, он довольно хорошо подходит для значений высокой интенсивности и постепенно ухудшается при низких интенсивностях. Это понятно — небольшое несоответствие при высокой интенсивности вносит гораздо больший вклад в общее несоответствие, чем большое несоответствие при очень низкой интенсивности.

Один из хороших способов решить эту проблему — поместиться в журнале. То есть пусть ваша модель вычисляет log(Intensity) и передает данные для log(Intensity).

Это не зависит от метода, используемого для решения проблемы, — оно переделывает проблему, которую необходимо решить. Здесь могут быть полезны генетические алгоритмы, но если метод Левенберга-Марквардта (который будет намного быстрее) работает так же хорошо, как вы показываете, он, вероятно, достаточно хорош или, по крайней мере, стоит продолжать работать с ним. Как правило, ГА лучше следят за тем, чтобы решение не застревало в «локальном минимуме». До сих пор нет никаких доказательств того, что это происходит (но всегда следует помнить об этом). Я думаю, что метод SGD, на который вы указываете, направлен на решение другого класса задач.

person M Newville    schedule 02.05.2020