Могут ли результаты драйвера DOE подавать компонент Metamodel?
Я заинтересован в изучении суррогатной оптимизации. Я пока не пишу код опендао, просто пытаюсь выяснить, в какой степени OpenMDAO будет поддерживать эту работу.
Я вижу, что у него есть драйвер DOE для генерации обучающих данных ( http://openmdao.readthedocs.org/en/1.5.0/usr-guide/tutorials/doe-drivers.html), я вижу, что у него есть несколько суррогатных моделей это можно добавить в метамодель ( http://openmdao.readthedocs.org/en/1.5.0/usr-guide/examples/krig_sin.html). Тем не менее, я не нашел пример, где результаты DOE передаются в качестве обучающих данных в метамодель.
Во многих примерах / учебных пособиях / сообщениях на форуме кажется, что данные для обучения создаются непосредственно в метамодели или внутри нее. Так что не ясно, как эти вещи работают вместе.
Могут ли разработчики объяснить, как данные обучения передаются из DOE в метамодель? Спасибо!
1 ответ
В openmdao 1.x этот процесс не поддерживается напрямую (пока) через DOE, но это определенно возможно. Есть два пути, которые вы можете выбрать, которые предлагают различные преимущества в зависимости от вашей конечной цели.
Я выделю различные сценарии на основе единой классификации высокого уровня:
1) Вы хотите провести оптимизацию на основе градиента вокруг всей комбинации DOE/Metamodel. Это может быть в том случае, если, например, вы хотите использовать CFD для прогнозирования сопротивления в нескольких ключевых точках, а затем использовать метамодель для создания полярности сопротивления для анализа миссии. Отличный пример такого моделирования можно найти в этой статье об одновременной оптимизации конструкции самолета.,
2) Вы не хотите делать градиентную оптимизацию вокруг всей модели. Возможно, вы захотите сделать оптимизацию без градиента (например, генетический алгоритм). Возможно, вы захотите провести оптимизацию на основе градиента непосредственно вокруг суррогата с фиксированными данными обучения. Или вы можете вообще не захотеть заниматься оптимизацией...
Если ваш вариант использования подпадает под сценарий 1 (или в будущем будет подпадает под этот вариант использования), то вы хотите использовать многоточечный подход. Вы создаете один экземпляр вашей модели для каждого обучающего случая, а затем можете преобразовать результаты в массив, который вы передаете в метамодель. Это необходимо для того, чтобы производные могли распространяться по всей модели. Многоточечный подход будет хорошо работать и очень распараллелен. В зависимости от структуры модели, которую вы будете использовать для создания самих обучающих данных, вы можете также рассмотреть несколько иной многоточечный подход с распределенным компонентом или рядом распределенных компонентов, соединенных вместе. Если ваша модель будет поддерживать его, подход с распределенными компонентами является наиболее эффективной структурой модели для использования в этом случае.
Если ваш вариант использования попадает в сценарий 2, вы все равно можете использовать многоточечный подход, если хотите. Это будет работать из коробки. Тем не менее, вы также можете подумать об использовании обычного DOE для генерации тренировочных данных. Чтобы сделать это, вам нужно использовать подход с вложенными задачами, когда вы помещаете генерацию обучающих данных DOE в подзадачу. Это также будет работать, хотя с вашей стороны потребуется немного дополнительного кодирования, чтобы получить массив результатов из DOE, потому что это в настоящее время не реализовано.
Если вы хотите использовать DOE для генерации данных, а затем передать их вниз суррогату, который будет оптимизирован, вы можете использовать пару проблемных экземпляров. Это не обязательно потребует от вас выполнения вложенных задач. Вместо этого вы просто создаете run-скрипт, в котором есть один проблемный экземпляр, в котором используется DOE, а по завершении вы собираете данные в массив. Затем вы можете вручную назначить это обучающим входам метамодели во втором экземпляре задачи. Что-то вроде следующего псевдокода:
prob1 = Problem()
prob1.driver = DOE()
#set up the DOE variables and model ...
prob1.run()
training_data = prob1.driver.results
prob2 = Problem()
prob2.driver = Optimizer()
#set up the meta-model and optimization problem
prob2['meta_model.train:x'] = training_data
prob2.run()