OpenMDAO v0.13: Градиенты ограничений и целей

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

Есть ли способ обеспечить градиенты для ограничения или цели, определенной следующим образом (с математикой в ​​заявлении об ограничении/цели): self.driver.add_constraint('separation/10 > %s/10' % minimum_distance), когда компонент обеспечивает только градиент separation, а не separation/10.


person jthomas    schedule 11.09.2015    source источник


Ответы (1)


Моя первая мысль — сделать 10. вместо 10, чтобы избежать целочисленного деления. Кроме того, вы должны заменить %s на %f. %s для строк.

OpenMDAO использует сложный шаг для вычисления производных для таких строковых функций. Должно получиться правильное значение производной, но я не знаю, каково значение минимального_расстояния. Если это целое число, или если %s все испортит для сложного шага (что в любом случае представляет собой сложная часть строки?)

Так что взгляните на это в первую очередь. SNOPT, который, как я предполагаю, вы используете через pyoptsparse, имеет средство проверки градиента. Если вас беспокоят градиенты, вы можете включить их.

Кстати, в OpenMDAO 1.0 мы собираемся изменить способ обработки ограничений. Вместо того, чтобы предоставлять такую ​​​​строку, вы должны вместо этого вычислить значение переменной separation, а затем вызвать что-то вроде

driver.add_constraint('separation', lower=minimum_distance/10., scaler=1/10.)
person Justin Gray    schedule 11.09.2015
comment
Я реализовал ваши предложения (спасибо, что уловили ошибки), и похоже, что это решило основную проблему. Я все еще наблюдаю поведение, при котором цель прыгает вверх и вниз по мере продвижения оптимизации, но все еще сходится. Это нервное поведение ухудшается по мере увеличения масштаба проблемы (больше переменных и ограничений). Я думаю, что эта проблема, вероятно, связана с моей проблемой, но есть ли шанс, что скачкообразная конвергенция связана с тем, как openmdao обрабатывает цель? - person jthomas; 11.09.2015
comment
Так он работает, может быть? По крайней мере, производные теперь выглядят хорошо, а сам оптимизатор сильно прыгает? Возможно, вы видите операции линейного поиска из SNOPT. В конечном итоге они выглядят как зубчатые пики на выходе. - person Justin Gray; 11.09.2015
comment
Спасибо также за объяснение того, как OpenMDAO обрабатывает градиент, когда математика включена в назначение цели или градиента. Это полезно знать. - person jthomas; 11.09.2015
comment
Хм, я не думал о неровности поиска по строке. Это звучит разумно. Пики чередуются высокие, низкие, высокие, низкие, но с последовательной восходящей тенденцией. Однако величина пиков очень велика. - person jthomas; 11.09.2015
comment
Ага. Это линейный поиск, который требует больших шагов и делает возврат. Это ожидаемое поведение - person Justin Gray; 11.09.2015