Мой опыт летней стажировки!

Летом 2018 года у меня была прекрасная возможность пройти стажировку в Женеве, Швейцария, в Haute École du Payasage, d’Ingénierie et D’Architecture de Genève.

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

Проэкт

Как следует из названия, проект включал замену сложных вычислений в методе Решетки Больцмана на модель машинного обучения для повышения производительности симулятора под названием Palabos - Pa rallel La ttice Bo ltzmann S olver.

Я буду здесь полностью честен; Я был немного потрясен, когда узнал об этом проекте там. У меня нет физического образования, и я был новичком в машинном обучении. Я не думал, что у меня достаточно квалификации, чтобы работать над чем-то вроде этого - наличие синдрома самозванца должно быть 100%, похоже, никогда не упускать шанс! В любом случае, я решил сделать все возможное и посмотреть, как далеко я смогу зайти, потому что именно так мы учимся.

Фон

Решеточный метод Больцмана (LBM) - это параллельный алгоритм в вычислительной гидродинамике (CFD) для моделирования однофазных и многофазных потоков жидкости. Это помогает моделировать сложные граничные условия и многофазные границы раздела фаз.

Он моделирует жидкость как фиктивные частицы, которые выполняют последовательные шаги столкновения и потока по дискретной сетке решетки. Обычно используемое обозначение решетки - DnQm, что означает, что решетка имеет пространственные размеры n и дискретные скорости м. На каждом временном шаге частицы в любом узле могут перемещаться только к своим ближайшим соседним узлам с одной из дискретных скоростей. Как только частицы переместятся в одно из своих соседних мест, они будут сталкиваться с другими частицами, которые прибывают на то же место в одно и то же время.

В прямом численном моделировании - моделировании вычислительной гидродинамики - численно решаются уравнения Навье – Стокса без какой-либо модели турбулентности.

Моделирование больших вихрей (LES) - это математическая модель вычислительной гидродинамики, используемая для моделирования турбулентных течений. Размер расчетной области должен быть по крайней мере на порядок выше, чем масштабы, характеризующие энергию турбулентности, в то же время расчетная сетка должна быть достаточно мелкой, чтобы разрешить наименьший динамически значимый масштаб длины для точного моделирования.

Если все водовороты - сетка должна быть мельче, чем самый маленький турбулентный водоворот, который по сути является круговым потоком воды - разрешены точно, прямым решением уравнения Навье-Стокса с использованием очень мелкой сетки, это приведет к большим вычислительным затратам. Чтобы преодолеть эти вычислительные затраты, в LES только крупномасштабные движения (большие водовороты) вычисляются напрямую, в то время как мелкомасштабные (подсеточные (SGS)) движения моделируются.

В заключение, LBM сообщает нам, что мы можем представить жидкость как фиктивные частицы в пространстве и времени, DNS сообщает нам, как моделировать поведение каждой частицы - с учетом физических условий системы - на каждом временном шаге, а LES позволяет делать такие вещи для турбулентных потоков, когда диапазон масштабов сильно варьируется путем аппроксимации вихрей подсеточного масштаба.

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

Постановка задачи

Изучить модель движений в масштабе подсетки (SGS) в моделировании крупных вихрей с использованием машинного обучения и интегрировать ее с существующим симулятором для замены текущих расчетов подсетки.

  • Используемый язык: C ++, так как он быстрый.
  • Модель должна быть небольшой по размеру и быстрой, чтобы ее можно было легко развернуть без увеличения нагрузки на память или задержки моделирования.
  • Не рекомендуется использовать внешние фреймворки, такие как TensorFlow или PyTorch.

Решение

Лучший подход к решению большой сложной проблемы - разбить ее на более мелкие и простые проблемы. Я сделал то же самое, разбив свою на следующие три задачи:

  1. Разработать простую архитектуру для моделирования движений в масштабе подсетки.
  2. Обучить и оптимизировать модель в соответствии со временем и другими ограничениями.
  3. Для интеграции модели с существующим программным обеспечением.

Подзадача №1 - Архитектура модели и обучающие данные:

У обучающих данных было девять входных атрибутов:
1: плотность
2–3: скорость
4–6: напряжение
7: завихренность
8–9: градиент плотности

На выходе было 3 атрибута, представляющих тензор остаточных напряжений. В нем было примерно 1 миллион кортежей.

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

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

Следующей задачей было найти размеры каждого слоя в модели. Выходной слой имел 3 узла, каждый из которых соответствовал атрибуту выходной части обучающих данных.

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

После того, как было определено оптимальное количество скрытых узлов, я также поиграл с количеством входов для нашей модели. Удивительно, но если я уменьшил количество вводимых до 6, результаты не упали так резко. Так что, если требовалось дальнейшее уменьшение размера модели, у меня тоже была эта возможность. Спустя годы я узнал, что это известно как «исследование абляции», при котором удаляются элементы модели и оценивается их влияние на результат, и это хорошая практика, которой следует следовать.

Все вышесказанное было сделано на подмножестве исходных обучающих данных, чтобы закрепить проект.

Я потратил примерно две недели на эту часть, изучая библиотеку OpenNN, кодируя модель и просто играя с набором данных, чтобы получить вышеуказанные значения.

Подзадача № 2 - Обучение модели:

После того, как наша архитектура модели была окончательно доработана, я оказался в поисках наилучшей скорости обучения для данной архитектуры на подмножестве набора данных. Опять же, я следовал стратегии, очень похожей на бинарный поиск - начиная с крайностей, а затем сужая их оттуда. Я использовал квазиньютоновские методы для оптимизации веса, которые были доступны в библиотеке OpenNN на C ++.

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

Это был медленный процесс, так как каждая тренировка занимала 0,5–0,75 дня. Я потратил на это примерно три недели.

Подзадача №3 - Интеграция с Palabos:

Первым делом нужно было запустить код без какой-либо IDE; Я обновил пути к нужным пакетам и соединил необходимые библиотеки.

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

Общий опыт

Я прекрасно провел время во время стажировки. Я многому научился, работая над этим проектом; такие вещи, как решение большой проблемы, методология разработки решения ИИ для данной проблемы, среди прочего.

Выводы:
- Сделал бы я что-то так же, если бы мне пришлось сделать это снова сейчас? По большей части да. Но я бы уделил больше внимания аспектам тестирования и проверки проекта. Если бы у меня было больше времени, я бы, вероятно, сделал это и тогда, но да, если бы я сделал это сейчас, я бы выделил некоторое время во время планирования исключительно для этого - как до, так и после интеграции.
- Я понял, что люблю использовать машинное обучение и применять его для решения новых проблем или улучшения существующих решений. Так что да, я сейчас ищу способы, как это сделать - новые приложения AI / ML - чаще!
- Хороший наставник имеет огромное значение. Я был единственным человеком, работавшим над этим проектом. Но мой наставник действительно мне помог. Он выслушивал то, что я хотел сказать, и затем руководил мной. Я полностью контролировал, как я хочу делать этот проект, но в то же время он всегда руководил мной. Я думаю, это то, что сделало этот опыт таким полноценным и удовлетворяющим.

Я также встретил очень добрых и удивительных людей, с которыми до сих пор дружу. Спасибо Summer’18 за этот прекрасный опыт, который я никогда не забуду. ❤

Ссылки и дополнительная информация

Другие мои статьи, которые, я думаю, вам понравятся: D

Рад, что вы дочитали до конца статьи. 🎉
Надеюсь, ваш опыт чтения был таким же обогащающим, как и тот, который я получил при написании этой статьи. 💖

Обязательно ознакомьтесь с другими моими статьями здесь.

Если вы хотите связаться со мной, я выберу Twitter.