Привет, Хабр! Мы продолжаем серию статей о суррогатном моделировании, на этот раз расскажем, как мы применили нейросети при создании сложных технических систем – приспособили GRU в качестве суррогатной модели для испытаний. Реальный кейс для клиента в рамках реального проекта.
Итак, давайте поставим нейросети обучение на службу проектировщику. Полетели!
Какой чудесный вид открывается через иллюминатор авиалайнера, не правда ли... Элероны, спойлеры, интерцепторы, предкрылки, закрылки…
Собственно, элерон, о котором идет речь в нашей статье – небольшая отклоняемая поверхность на задней кромке крыла, ближе к законцовке. Элеронов обычно два, их основная роль состоит в управлении креном самолета. Как они это делают? В режиме управления креном, левый и правый элероны отклоняются дифференциально, а поскольку они расположены далеко от фюзеляжа, даже легкое отклонение создает заметный крутящий момент, которой и кренит самолёт.
В основном, все эти отклоняемые поверхности нужны летательному аппарату для того, чтобы изменять подъемную силу и лобовое сопротивление и, в конечном итоге, чтобы стабилизироваться и осуществлять навигацию. Воздух может оказывать их движению значительное сопротивление, поэтому подвижные поверхности авиалайнера «с дистанционным управлением» приводятся в движение мощными гидравлическими приводами.
Так что, если заглянуть внутрь ниши шасси, мы увидим другой, не менее прекрасный инженерный ландшафт: гидробаки, фильтры, патрубки, насосы... Если элерон находится на конце крыла, то почему приводы находятся около шасси? Посмотрите упомянутую статью.
Но чего мы не увидим, так это нейросетей... Интересно, откуда тут возьмутся MATLAB, Python и фреймворки машинного обучения?
"А давайте протестируем нашу программу управления на паре триллионов сценариев" скажет кто-то... и все резко изменится.
Или, имея только аэродинамические характеристики, сгенерируем код для стенда имитатора, не рисуя никаких промежуточных схем. Суррогатные модели находят свое применение как в модельно-ориентированном проектировании, так и в программно-аппаратном тестировании, но есть одно "но".
Нужны модели. Много моделей.
Включайте аэродинамические трубы, несите мешки с песком… На всех этапах модельно-ориентированного проектирования нам нужны детальные и точные модели. Как минимум, они нам пригодятся для следующих применений:
При проектировании – чтобы найти оптимальную конфигурацию системы, протестировав модель в большом количестве сценариев;
При разработке – компоненты нужно согласовывать между собой, для этого нужно прогнать много интеграционных тестовых сценариев;
При развертке – из моделей моделей можно генерировать код компонентов и настраивать среду на основе испытаний;
При валидации и верификации – некоторые критические компоненты придется протестировать на всем диапазоне входных значений и их комбинаций.
Главная проблема, которая у нас возникнет – как запустить модель несколько триллионов раз, в пространстве всех комбинаций параметров, за разумное время, да еще и на имеющихся компьютерах?
Суррогатные модели, на помощь!
Сложные технические системы могут быть описаны очень разными способами. Как минимум, в модели будет система из обычных и дифференциальных уравнений, которые будут как-то связаны между собой, например, через вычислительный граф (типичная модель Simulink) или расчетную сетку (модели в конечных элементов для газовой динамики и пр.).
Как вычислительные графы, так и модели в конечных элементах могут выполняться очень медленно... Гораздо медленнее реального времени. Запуск во всех нужных сценариях может занимать дни, возможно даже недели.
Чтобы ускорить эксперименты над моделью такой системы, нужно как-то ускорить ее выполнение (симуляцию).
На замену детальным моделям можно создать суррогатные. Их основная задача – скоростное выполнение, небольшой объем занимаемой памяти и соблюдение заданного порога ошибки относительно детальной модели.
Чтобы подробнее ознакомиться с мотивацией и приемами суррогатного моделирования, у нас есть целая серия материалов:
А теперь, к практике – о том, как мы в динамической модели отдали часть расчетов нейронной сети, и что из этого вышло.
Модель системы управления элероном
Наша базовая модель была представлена вычислительным графом в Simulink. Перед нами модель привода (2) и модель его электронного блока управления (1).
Входные сигналы – нагрузка от элерона и сигнал управления на входе электронного блока. А на выходе – положение штока привода, оно же выступает в качестве сигнала обратной связи для блока управления.
Предположим, что мы отлаживаем параметры ЭБП. Для этого нам нужна модель привода, которую можно запускать много раз в разных условиях. Ее мы и будем заменять на суррогатную модель. Сценарий нагрузки у нас не меняется, значит – либо моделируем небольшие отклонения, либо ждем более обширного кейса, ведь это только начало нашей серии рассказов об практике применения суррогатных моделей.
Входят нейросети!
Цель этого проекта заключалась в том, чтобы заменить модель привода на рекуррентную сеть GRU (управляемый рекуррентный блок).
Один классический слой GRU рассчитывается по такой системе уравнений:
Собственно, в отличие от нейронов обычной нейросети, в GRU-нейроне сразу три функции активации. Вектор h (hidden state) хранит состояние слоя GRU. Он используется нейросетью сразу и как вектор выходных значений, и как память, из которой нейрон может доставать что-то, выученное много шагов назад. Векторы z и r – просто внутренние данные каждого нейрона. Ну, и матрицы W – это наборы весов, которые сеть должна выучить (смещения, судя по всему, уже занесены во входной вектор; нотация отсюда).
Как видно, это весьма несложная модель – несколько нелинейностей и перемножений. За компромисс между точностью и скоростью выполнения отвечает в основном количество нейронов. За скорость обучения и глубину выученных зависимостей отвечает длина примеров в обучающей выборке.
Кроме рекуррентного слоя, нам понадобится слой пакетной нормализации (BatchNorm) для стабилизации и ускорения обучения нейронной сети. На выходе также располагается полносвязный слой для предсказания нового положения штока нашего привода. Например:
на случай нескольких выходных переменных, или
для усложнения архитектуры нейросети, когда слой GRU предсказывает ряд компонентов выходной переменной (эмбеддинг), а линейный слой учится их объединять.
В конце концов, можно предсказывать предысторию или будущее поведение выходной переменной. Но осторожно, обратная связь в динамической системе, в таком сценарии, уже не учитывается, поэтому мы брали только одну точку прогноза.
И вот, как здорово выглядит Simulink-модель после добавления обученной нейросети.
Сеть можно обучать в MATLAB Deep Learning App или в Python (и импортировать через ONNX), поэтому тут легко учесть все пожелания и создать удобную и гибкую методику обучения.
При каждом вызове нейросеть обновляет свое состояние и рассчитывает следующую выходную переменную – положение штока.
Результаты моделирования
На этом раннем этапе проекта мы просто хотели применить довольно классическую процедуру обучения GRU, поэтому договорились о довольно грубых параметрах оценки: при расчете с заданным шагом 0.001, относительная ошибка не должна превышать 10%.
Эти параметры сеть выбивает легко и просто. Например, вот так сеть прогнозировала поведение нашего объекта в ходе колебательных процессов (шаг за шагом):
Мы видим пару систематических ошибок – в момент после резких скачков наблюдаются самые большие отклонения, но в целом сеть предсказывает сигнал довольно хорошо.
Заключение
Нейросети все еще очень редко применяются в промышленности, проблемы остаются по части интерпретируемость полученных моделей и доступности самого подхода моделирования нейросетями. Ведь вы должны быть в состоянии попробовать несколько вариантов моделей, не прибегая к организации НИОКР.
Поэтому нам так важно делиться с вами своими соображениями и выслушивать ваши мысли.
Какие преимущества имеют нейросети как суррогатные модели?
Легко управлять скоростью и точностью модели
Чем больше нейронов в слое, тем медленнее (и точнее) будет работать нейросеть;
GRU слой нейросети позволяет сэкономить память по сравнению с LSTM-слоем за счет меньшего числа параметров;
Нейросети легко можно распараллелить
Но только те, которые работают без обратной связи;
В пакетном режиме вычисление всей кривой происходило бы мгновенно.
Рекуррентные нейросети, пожалуй, не стоит рассматривать как первую модель в списке:
если у вас в целом небольшая модель, которую не особо нужно ускорять (как было в нашем случае);
если модель должна работать в потоковом режиме;
если в динамической системе есть обратная связь.
Ведь мы не избавились от большей части вычислительного графа, так что – чтобы усилить преимущества, можно спланировать другую процедуру обучения, если это не усложнит эксперименты на стороне заказчика. Но конкретно в задаче с GRU остановились на достигнутом и будем готовить для вас новые результаты по более обширным кейсам, чтобы мы все могли обсудить работу нейросетей в суррогатных моделях.
В целом, мы уверены что внедрение суррогатного моделирования в вашей команде может перевернуть весь рабочий процесс. Или уже перевернул? Расскажите!
PS: Основную работу по кейсу выполнил Игорь Матвеев, инженер Экспоненты (@Igorec_matveev). ?