Привет, Хабр! Мы продолжаем серию статей о суррогатном моделировании, на этот раз расскажем, как мы применили нейросети при создании сложных технических систем – приспособили GRU в качестве суррогатной модели для испытаний. Реальный кейс для клиента в рамках реального проекта. Итак, давайте поставим нейросети обучение на службу проектировщику. Полетели! Какой чудесный вид открывается через иллюминатор авиалайнера, не правда ли... Элероны, спойлеры, интерцепторы, предкрылки, закрылки… Собственно, элерон, о котором идет речь в нашей статье – небольшая отклоняемая поверхность на задней кромке крыла, ближе к законцовке. Элеронов обычно два, их основная роль состоит в управлении креном самолета. Как они это делают? В режиме управления креном, левый и правый элероны отклоняются дифференциально, а поскольку они расположены далеко от фюзеляжа, даже легкое отклонение создает заметный крутящий момент, которой и кренит самолёт. В основном, все эти отклоняемые поверхности нужны летательному аппарату для того, чтобы изменять подъемную силу и лобовое сопротивление и, в конечном итоге, чтобы стабилизироваться и осуществлять навигацию. Воздух может оказывать их движению значительное сопротивление, поэтому подвижные поверхности авиалайнера «с дистанционным управлением» приводятся в движение мощными гидравлическими приводами. Так что, если заглянуть внутрь ниши шасси, мы увидим другой, не менее прекрасный инженерный ландшафт: гидробаки, фильтры, патрубки, насосы... Если элерон находится на конце крыла, то почему приводы находятся около шасси? Посмотрите упомянутую статью. Но чего мы не увидим, так это нейросетей... Интересно, откуда тут возьмутся MATLAB, Python и фреймворки машинного обучения? "А давайте протестируем нашу программу управления на паре триллионов сценариев" скажет кто-то... и все резко изменится. Или, имея только аэродинамические характеристики, сгенерируем код для стенда имитатора, не рисуя никаких промежуточных схем. Суррогатные модели находят свое применение как в модельно-ориентированном проектировании, так и в программно-аппаратном тестировании, но есть одно "но". Включайте аэродинамические трубы, несите мешки с песком… На всех этапах модельно-ориентированного проектирования нам нужны детальные и точные модели. Как минимум, они нам пригодятся для следующих применений: При проектировании – чтобы найти оптимальную конфигурацию системы, протестировав модель в большом количестве сценариев; При разработке – компоненты нужно согласовывать между собой, для этого нужно прогнать много интеграционных тестовых сценариев; При развертке – из моделей моделей можно генерировать код компонентов и настраивать среду на основе испытаний; При валидации и верификации – некоторые критические компоненты придется протестировать на всем диапазоне входных значений и их комбинаций. Главная проблема, которая у нас возникнет – как запустить модель несколько триллионов раз, в пространстве всех комбинаций параметров, за разумное время, да еще и на имеющихся компьютерах? Сложные технические системы могут быть описаны очень разными способами. Как минимум, в модели будет система из обычных и дифференциальных уравнений, которые будут как-то связаны между собой, например, через вычислительный граф (типичная модель Simulink) или расчетную сетку (модели в конечных элементов для газовой динамики и пр.). Как вычислительные графы, так и модели в конечных элементах могут выполняться очень медленно... Гораздо медленнее реального времени. Запуск во всех нужных сценариях может занимать дни, возможно даже недели. Чтобы ускорить эксперименты над моделью такой системы, нужно как-то ускорить ее выполнение (симуляцию). На замену детальным моделям можно создать суррогатные. Их основная задача – скоростное выполнение, небольшой объем занимаемой памяти и соблюдение заданного порога ошибки относительно детальной модели. Чтобы подробнее ознакомиться с мотивацией и приемами суррогатного моделирования, у нас есть целая серия материалов: Введение в суррогатные модели. Часть 1: Актуальность Введение в суррогатные модели. Часть 2: Прикладной пример Введение в суррогатные модели. Часть 3: Выходим в топ А теперь, к практике – о том, как мы в динамической модели отдали часть расчетов нейронной сети, и что из этого вышло. Наша базовая модель была представлена вычислительным графом в 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). 👏  Инженер – это звучит горгорг