ПРИМЕНЕНИЕ НЕЙРОСЕТЕВЫХ МЕТОДОВ МАШИННОГО ОБУЧЕНИЯ К ЗАДАЧЕ РЕШЕНИЯ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИИ РАЗНЫХ ВИДОВ

APPLICATION OF NEURAL NETWORK MACHINE LEARNING METHODS TO THE PROBLEM OF SOLVING DIFFERENTIAL EQUATIONS OF DIFFERENT TYPES
Цитировать:
Есбаганбетов М.Б., Иманбаев К.С., Тергеуов О.С. ПРИМЕНЕНИЕ НЕЙРОСЕТЕВЫХ МЕТОДОВ МАШИННОГО ОБУЧЕНИЯ К ЗАДАЧЕ РЕШЕНИЯ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИИ РАЗНЫХ ВИДОВ // Universum: технические науки : электрон. научн. журн. 2022. 5(98). URL: https://7universum.com/ru/tech/archive/item/13767 (дата обращения: 04.05.2024).
Прочитать статью:
DOI - 10.32743/UniTech.2022.98.5.13767

 

АННОТАЦИЯ

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

ABSTRACT

In this paper, we consider the possibility of using neural networks to solve differential equations. With the use of neural networks, we get several opportunities for improvement at once: automatic differentiation, regularization using a priori knowledge of the subject area, for example, conservation laws in physics, modifying the network architecture to add knowledge of what diffuration solutions look like.

 

Ключевые слова: дифференциальные уравнения, нейронная сеть, язык Python

Keywords: differential equations, neural network, Python language

 

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

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

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

Широко дифференциальные уравнения используются при описании динамики физических систем. Кроме кратко упомянутых выше уравнений, приведем конкретный пример такой системы: уравнение Бюргерса, которое является частным случаем уравнения Навье-Стокса и описывает скорость жидкости в одномерном случае:

Untitled-1.jpg

где ν — вязкость жидкости.

Стоит упомянуть класс уравнений, которые называют жесткими. Их особенностью является то, что они плохо решаются с помощью явных методов [2] [3] [7]. Явными методами называются методы, которые в том или ином виде явно считают функцию в некоторых точках. Из-за того, что у некоторых уравнений значение производной решения велико, пересчет исходной функции через производную с помощью уравнения сильно меняет значения и поэтому для получения хорошего решения для таких уравнений приходится брать очень маленькие шаги, в которых считается функция.

Опишем, как будет происходить обучение нейронных сетей. Чаще всего для этого применяется метод градиентного спуска [1], в котором вычитают градиент функции потерь из весов нейросети до тех пор, пока функция потерь не будет достаточно мала. Чтобы применить этот метод, необходимо определить функцию потерь. Рассмотрим дифференциальное уравнения в самом общем виде: N f = 0, где N — некоторый дифференциальный оператор. Тогда функция потерь определяется следующим образом:

Loss = Lossborder + Lossequation

Где:

Untitled-1.jpg

{x1, ..., xNb} — точки на границе области, {y1, ..., yNb} — значения начальных условий в этих точках, {t1, ..., tNf} — точки внутри области.

Функция f, которая и должна в итоге представлять из себя решение, считается с помощью обучаемой нейронной сети. Уточним, что при вычислении N f понадобится вычисление производных функции f, то есть производных нейросети по входным переменным. Это можно сделать с помощью автоматического дифференцирования [2], релизованной в виде обьекта tf.GradientTape в библиотеке Tensorflow 2.

Это определение функции потерь достаточно общее, чтобы его можно было подстраивать под конкретные задачи. Например, можно добавить веса слагаемым:

Loss = λbLossborder + λeLossequation

чтобы придать большую важность приближению значений функции на границе или же самому дифференциальному уравнению. Далее, так как используется некий набор точек внутри области, то неважно какую форму имеет эта область: прямоугольную (отрезок, квадрат, куб), круглую или какую-либо другую. Точки внутри области так или иначе можно выбрать и посчитать функцию Loss. Некоторые исследования были проведены по тематике, рассматриваемой в данной работе. В статье Сириньяно Дж., Спилиопулос К. [7] проведено исследование использование нейронных сетей для решения дифференциальных уравнений большой размерности. Нейронная сеть обучалась на кластере, так как нужны большие вычислительные мощности для достижения приемлимого результата. Также использовалось полуаналитическое решение и приближение второй производной для вычисления функции потерь. В другой статье Раисси М., Пердикарис П., Карниадакис Джордж Эм. [8] исследовано применение нейросетей для задач решения дифференциальных уравнений и отыскания параметров уравнения по известным точкам решения. Также в работе проведено сравнение нескольких наборов гиперпараметров для изучения их влияния на качество обучения на примере нескольких уравнений в частных проивзодных. В статье Шах А. и др. [6] исследуется задание разными способами функции потерь и влияние использования этих функций потерь на качество обучения на примере двух уравнений в частных производных с известными решениями.

В упомянутых работах не представлены исследования того, как можно менять сам процесс обучения или архитектуру сети, чтобы улучшить качество получаемого решения. Данная работа покрывает некоторые из таких способов и их анализ. Для программной реализации используется язык Python и библиотеки для машинного обучения Tensorflow версии 2 и Keras [13]. Реализация алгоритма LBFGS была взята из библиотеки tensorflow_probability [11]. Также использовались библиотеки NumPy для задания числовых массивов и оперирования с ними, toolz [1] для удобной работы с Keras Functional API и Matplotlib [11] для построения графиков. Так как мы собираемся обучать нейросети без учителя, надо описать, как происходит процесс обучения. Для этого приведем псевдокод обучения и прокомментируем его:

model = model_builder(input_dim, output_dim) # 1 opt = Adam(learning_rate) # 2

def fit():

gradient = calc_loss_grad() # 3 opt.apply_gradients(zip(grads, model.trainable_variables)) # 4

for epoch in range(epochs): # 5

fit() # 6

f = transform(model, calc_loss) # 7 lbfgs_minimize(f, initial_position=model.params) # 8 print(f”Error:{error_f(solution, model)}”) #

1) Строим модель для обучения. Так как мы будем тестировать разные модели, то мы их параметризуем размерностями входного и выходного пространства решения и передаем их в функцию- конструктор модели. 2) Инициализация оптимизатора Adam. 3) Вычисление градиента весов. 4) Обновление весов нейросети. 5) Обучение с оптимизатором Adam. 6) Запуск одной эпохи обучения с оптимизатором Adam. 7) Преобразование модели в функцию. Обучение с использованием LBFGS. 8) Запуск обучения с оптимизатором LBFGS. 9) Вычисление ошибки решения и отображение.

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

def calc_loss_grad(y_true_border):

with tf.GradientTape() as g:

loss_border = tf.reduce_mean(tf.square(border())) # 1 loss_inside = tf.reduce_mean(tf.square(equation())) # 2 loss = loss_border + loss_inside # 3

return g.gradient(loss, model.trainable_variables) # 4

1. Вычисление Lossborder. 2. Вычисление Lossinside. Обе функции потерь вычисляются с помощью функций border и equation, задаваемых для каждого уравнения в зависимости от вида начальных условий и самого уравнения. 3. Вычисление Loss. 4. Вычисление градиента Loss по весам нейросети.

В задаваемой функции equation (и при необходимости в border) также используется tf.GradientTape для нахождения производной нейросети, но уже относительно входных данных. Полная реализация выложена на Github [10].

При реализации вышеприведенного алгоритма несколько раз возникала следующая проблема. В библиотеках Tensorflow и numpy числовые массивы называются тензорами и имеют одну или несколько размерностей. Совокупность размерностей принято называть формой тензора и записыватm как кортеж, содержащий размерности тензора, например, форма (2,2) соответствует матрице 2 × 2. Вектору, наоборот, соответствует форма (1000,), то есть одна размерность равная тысяче. Для удобства в этих библиотеках переопределены стандартные операции плюс и минус, а также при сложении (вычитании) тензора и константы эта константа прибавляется (вычитается) ко всем элементам тензора. Также реализованы векторные операции: когда к тензору формы (1000,) прибавляется тензор формы (1000,1), то считается, что к вектору прибавляется консанта и этих констант тысяча. В результате получается тензор из тысячи векторов формы (1000, 1000). Из-за этого может получиться неправильное значения разницы между результатом модели формы (1000, 1) на тысяче точек и решением, которое дает вектор формы (1000,) на той же тысяче точек. Для борьбы с этим нужно всегда явно преобразовывать тензоры формы (1000,) в тензор формы (1000,1). Эксперименты с обучением нейросетей для решения дифференциальных уравнений проводились для уравнений разной сложности. Для решения дифференциальных уравнений с помощью нейросети нужно выбрать базовую архитектуру нейронной сети. Приведем сравнение некоторых полносвязных архитектур, из которых можно выбрать базовую модель для сравнения с модифицированными архитектурами. Для выбора модели были проведены эксперименты со следующими полносвязными нейронными сетями (в квадратных скобках указаны размеры слоев): [16, 8, 4] и [32, 16, 8, 4] много нейронов на первом слое позволит построить много “низкоуровневых” характеристик, из которых будут строиться несколько “высокоуровневых” характеристик и из них соберется итоговый ответ. [4, 8, 16] и [4, 8, 16, 32] “низкоуровневых” характеристик будет меньше, на зато будет больше “высокоуровневых” характеристик для построения решения. [10, 10, 10] и [10, 10, 10, 10, 10, 10, 10] сбалансированное количество нейронов в начале и в конце. Также более глубокая связь позволит построить более “сложные” характеристики в конце. [200, 200, 200, 200] широкая неглубокая сеть, может выучить сложные связи, но ее труднее обучать.

В качестве оптимизатора использовался Adam [9]. Параметры обучения следующие: Nf = 1000 (точек внутри области), Nb = 100 (точек на границе), 2000 эпох, learning_rate = 0.01. Полученные результаты log10(Loss) и log10(Error) приведены на графиках 1 и 2. Error считается как средний квадрат отклонения от решения, если известно решение. Логарифмы функции потерь и ошибки приводятся для более удобного представления чисел. Оказывается, что при решении уравнений (L-ODE4), (L-ODEn2), (SODE1), (PDE1)-(PDE7), (PDE9), (PDE10) обучение нейронной сети останавливается в локальном минимуме, в котором сеть предсказывает тождественный ноль. На уравнениях (NL-ODE1), (NL-ODE2), (NL-ODE3), (NL-ODE4) из-за большого размера функции около нуля, значение log(Loss) относительно высоко. При решении уравнения (SODE3) нейросеть не сходится, и функция потери принимает очень большое значение.  На основании полученных данных, для дальнейших экспериментов была выбрана модель [10, 10, 10, 10, 10, 10, 10], так как она показывает результаты не хуже, а на уравнения (L-ODE5) и (SODE2) даже лучше, чем нейросети с остальными архитектурами.

 

Рисунок 1. Значения log10(Loss) для разных полносвязных архитектур. Чем светлее — тем лучше

 

Рисунок 2. Значения log10(Error) для разных полносвязных архитектур. Чем светлее — тем лучше

 

Алгоритм оптимизации LBFGS относится к квазиньютоновским методам, которые основаны на приближенном вычислении гессиана целевой функции и использовании его для более эффективной оптимизации целевой функции. Реализация алгоритма была взята из библиотеки Tensorflow Probability, в которой есть нужный нам метод lbfgs_minimize. Чтобы воспользоваться им, необходимо представить целевую функцию в виде функции, принимающей аргумент в виде вектора. Для функции потерь аргументами будут веса нейронной сети. Но проблема заключается в том, что эти веса хранятся в слоях сети в виде набора многомерных тензоров. В данной работе для решения этой проблемы использовалась реализация преобразования нейросети в функцию от pyChao [13].

Для проверки применимости LBFGS оптимизатора сравним следующие случаи: обучение только с оптимизатором Adam; обучение только с оптимизатором LBFGS; обучение сначала с оптимизатором Adam, а затем с оптимизатором LBFGS. Результаты представлены на тепловых рисунках 3 и 4.

 

Рисунок 3. Значения log10(Loss) для разных оптимизаторов, использованных для обучения. Чем светлее — тем лучше

 

Рисунок 4. Значения log10(Error) для разных оптимизаторов, использованных для обучения. Чем светлее — тем лучше

 

Видно, что один только LBFGS дает результат хуже, чем один только Adam. Однако, вместе эти алгоритмы дают точность больше, чем каждый по отдельности. Для обучения остальных моделей в данной работе использовались оба оптимизатора. Оказывается, что для некоторых уравнений несколько первых эпох нейросеть учит начальные условия и только после этого учит решение на остатке области. Действительно: ноль, к которому изначально близка нейросеть, дает малое значение Lossequation, но большое значение Lossborder. Иногда, однако, нейросеть остается в тождественном нуле, который удовлетворяет уравнению, но не удовлетворяет начальным усло-виям. Для борьбы с этими явлениями рассмотрим следующие методы: изменение border_loss_multiplier; “жесткое” задание начальных условий; динамическое изменение области обучения. Cлагаемым в функции потерь можно приписать веса, например так:

Loss = λbLossborder + Lossequation

Тогда λb назовем border_loss_multiplier. Так как изначально он равен единице, для того, чтобы придать большее значение выполнению начальных условий, можно присвоить λb значение больше единицы. Приведем результаты обучения для border_loss_multiplier равного 1, 10 и 100 на графиках 5 и 6. Видно, что увеличение border_loss_multiplier не уменьшает величину ошибки, а λb = 100 даже увеличивает ошибку.

 

Рисунок 5. Значения log10(Loss) для разных значений border_loss_multiplier. Чем светлее — тем лучше

 

Рисунок 6. Значения log10(Error) для разных значений border_loss_multiplier. Чем светлее — тем лучше

 

По аналогии со сверточными нейронными сетями, которые построены специально для работы с изображениями с помощью операций, используемых в обработке изображений, полносвязную архитектуру можно изменить специальными операциями под нужды решения уравнений. Для этого рассмотрим следующие подходы: нормализация входных переменных; разные функции активации; log-exp преобразование; соединения быстрого доступа. Для приведения входных данных в отрезок [0, 1] можно воспользоваться следующим преобразованием:

x  x0 xmin

xmax xmin

Посмотрим, как это преобразование влияет на результаты обучения. Причем рассмотрим только те уравнения, которые не заданы изначально на отрезке [0, 1] или квадрате [0, 1]2. Результаты представлены на графиках 7 и 8.

Для всех уравнений получается результат лучше, если была применена нормализация. Возможно, это влияние того, что уравнения, которые не были определены в нуле, например, (NL-ODEn1) и (PDE5) после нормализации стали определены в нуле и потому нейросети проще было найти решение.

 

Рисунок 7. Значения log10(Loss) для базового обучения и обучения с нормированными входными переменными. Чем светлее — тем лучше

 

Рисунок 8. Значения log10(Error) для базового обучения и обучения с нормированными входными переменными. Чем светлее — тем лучше

 

Исходя из проведенных экспериментов можно сделать несколько выводов относительно использования нейронных сетей для задачи решения дифференциальных уравнений. Из самой постановки задачи следует, что для обучения нейросети нужно очень мало данных: начальные данные и знание уравнения. Получается задача обучения без учителя, так как точки внутри области берутся случайные и значения на границе задаются начальными условиями. В итоге правильный ответ нейросети неизвестен и, следовательно, нет переобучения. Помимо этого, точек внутри и на границе области нужно достаточно мало. Даже с небольшим (порядка ста-тысячи точек) набором точек внутри области можно получить достаточно хорошие результаты. После того, как нейросеть была обучена, мы получаем замкнутую функцию, которую можно посчитать в любой точке области, а не только в точках, которые использовались для обучения. Кроме того, функция потерь достаточно общая, чтобы ее можно было определить для многих видов дифференциальных уравнений и граничных условий. Сам процесс обучения тоже можно улучшать в многие стороны. В данной работе было установлено, что хорошие результаты показывает использование оптимизатора Adam вместе с алгоритмом LBFGS, а также нормализация входных переменных. Некоторые модификации нейросети помогают находить более оптимальные решения при использовании разных функций активации и остаточных связей.

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

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

 

Список литературы:

  1. Мерриенбоер Б.В., Брелё О., Бержерон А. и др. Автоматическое дифференцирование в машинном обучении: где мы находимся и куда нам следует двигаться / // Препринт arXiv arXiv. – 2018. - №4. – С 1810.
  2. Буль Дж. Трактат о дифференциальных уравнениях // Макмиллан и компания. – 1987. - №3. – С.121.
  3. Кертисс Ч. Ф., Хиршфельдер Дж. О. Интегрирование жестких уравнений // Труды Национальной академии наук. – 1952. – Т. 38, №3. – С. 235.
  4. Хе К., Чжан С., Рен Ш., Сунь Ц. Глубокое остаточное обучение для распознавания изображений // Материалы конференции IEEE по компьютерному зрению и распознаванию образов. – 2016. – С. 770–778.
  5. Драбек П., Голубова Г. Классификация, типы уравнений, граничные и начальные условия // Элементы уравнений в частных производных. – 2008. – №4. - С. 9–20.
  6. Шах А., Сабир М., Касим М., Бастиан П. Эффективная численная схема решения уравнения Аллена-Кана // Численные методы решения уравнений в частных производных. – 2018. – Т. 34, №5. – С. 1820–1833.
  7. Сириньяно Дж., Спилиопулос К. DGM: Алгоритм глубокого обучения для решения уравнений в частных производных // Журнал вычислительной физики. – 2018. – № 375. – С. 1339–1364.
  8. Раисси М., Пердикарис П., Карниадакис Джордж Эм. Физико-информационное глубокое обучение: решения нелинейных дифференциальных уравнений в частных производных, управляемые данными // Препринт arXiv arXiv:1711.10561. – 2017.
  9. Крижевский А., Суцкевер И., Хинтон Дж. Классификация Imagenet с помощью глубоких сверточных нейронных сетей // Достижения в области нейронных систем обработки информации. – 2012. –№25. – С. 1097–1105.
  10.  Ле К. Я., Бенжио Й., Хинтон Дж. Глубокое обучение // Природа. – 2015. – №521. – С. 436–444.
  11.  Лю Д.С., Нокедаль Х. О методе BFGS с ограниченной памятью для оптимизации больших масштабов // Математическое программирование. – 1989. –№45. – С. 503–528.
  12.  Мейера Кеннета Р. Эллиптические функции с точки зрения динамических систем // The American Mathematical Monthly. – 2001. – Т. 8, №108. – С. 729–737.
  13.  Пардо Э., Веретенников А. Ю. Об уравнении Пуассона и диффузионном приближении. I // Анналы вероятностей. – 2001. – С. 1061–1085.
Информация об авторах

магистрант, Алматинский Технологический Университет, Казахстан, г. Алматы

Master’s degree student, Almaty Technological University, Kazakhstan, Almaty

к.ф.-м.н. ассоц. профессор, Алматинский Технологический Университет, Казахстан, г. Алматы

Candidate of physical and mathematical sciences, Associate Professor, Almaty Technological University, Kazakhstan, Almaty

магистрант, Алматинского Технологического Университета, Казахстан, г. Алматы

Master student, Almaty Technological University, Republic of Kazakhstan, Almaty

Журнал зарегистрирован Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор), регистрационный номер ЭЛ №ФС77-54434 от 17.06.2013
Учредитель журнала - ООО «МЦНО»
Главный редактор - Ахметов Сайранбек Махсутович.
Top