В этой статье представлена ​​реализация на Python алгоритма, представленного в статье Подход на основе нейронных сетей для вычисления собственных векторов и собственных значений симметричной матрицы Чжан И и Ян Фу.

Введение

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

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

Архитектура нейронной сети

Нейронная сеть вычисляет собственный вектор заданной матрицы, используя следующее дифференциальное уравнение. Пусть A — симметричная матрица размера nxn, x(t) — пробный собственный вектор (то есть выход нейронной сети), а I — единичная матрица размера nxn.

Когда x(t), выход нейронной сети, полностью сходится (т.е. больше не меняется), тогда:

Следовательно, нейронная сеть сходится, и ее выход (пробный собственный вектор) x равен значению f(x). Функция потерь нейронной сети определяется как MSE (x, f(x)), где MSE — функция среднеквадратичной ошибки.

На практике начальный пробный собственный вектор x(0) должен быть вектором случайных чисел правильной размерности. Однако можно показать, что любое предположение для собственного вектора приведет к тому, что нейронная сеть сойдется к истинному собственному вектору матрицы (см. Теорему 3 вышеуказанной статьи).

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

Отклонение от алгоритма газеты

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

Код

Ниже приведен код для реализации вышеуказанного алгоритма.

Примечание: этот код написан с использованием Tensorflow 1. Чтобы запустить код с помощью Tensorflow 2, замените строку «import tensorflow as tf» на

Метод для функции f(x), определенный выше. Это будет использовано позже.

Код для нейронной сети. Код разбит на пять разделов:

Настраивать

Первый раздел кода определяет единичную матрицу I и начальный пробный собственный вектор x0. Затем их необходимо преобразовать в тензоры, чтобы использовать с Tensorflow.

Настройка нейронной сети

Затем нейронная сеть настраивается с использованием аргумента nn_structure, списка чисел. Длина списка указывает, сколько скрытых слоев в схеме сети, а каждое число в списке указывает количество скрытых нейронов в этом слое. В конец скрытых слоев добавляется последний выходной слой, размер которого равен размеру собственного вектора.

Функция потери

Функция потерь определяется как среднеквадратическая ошибка между x, выходом нейронной сети, и f(x), с дополнительным членом, добавленным для управления найденным собственным вектором. Аргумент eigen_guess определяет, какой собственный вектор будет найден. Предположение, большее, чем наибольшее собственное значение матрицы, всегда будет приводить к нахождению наибольшего собственного вектора, а предположение, меньшее, чем наименьшее собственное значение, всегда будет приводить к нахождению наименьшего собственного вектора. На практике, когда приблизительные собственные значения неизвестны, предположения можно заменить очень большим числом с положительным знаком для наибольшего собственного вектора и отрицательным знаком для наименьшего собственного вектора. Аргумент eigen_lr контролирует, насколько этот член вносит вклад в общую функцию потерь. Установка этого члена в ноль означает, что нейронная сеть найдет любой собственный вектор данной матрицы.

Настройка обучения

Настройка обучающей части нейронной сети путем определения оптимизатора и указания нейронной сети минимизировать функцию потерь.

Обучение

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

Полный код

Объединение вышеуказанных пяти сегментов кода в один метод дает код для нейронной сети.

Тестовые матрицы

Вышеупомянутая нейронная сеть будет работать с любой симметричной положительно определенной матрицей. Матрицу A можно сделать симметричной, используя следующую формулу:
Aˢʸᵐ = (A + Aᵀ)/2. Симметричную матрицу, заполненную случайными числами, можно создать с помощью следующего кода.

Симметричные матрицы также могут иметь физическую значимость. Следующее устанавливает гамильтониан для модели 4-частичных пар с 4 дырками без разорванных пар. Более подробную информацию о модели сопряжения можно найти в главе 10 этой книги.

Проверьте точность нейронной сети

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

Выводы

При выполнении этого кода получаемое собственное значение обычно отличается от аналитического собственного значения, начиная с 12–14-го знака после запятой. Это очень хороший уровень точности, который подходит для большинства приложений.

Для дальнейшего изучения этого кода просмотрите этот проект на Colab или просмотрите этот проект на GitHub.