Инвертирование функции с помощью нейронной сети (с кодом)
1. Введение
Хотя инвертировать такую функцию, как y = mx, чтобы получить обратную, x = y/m, несложно, некоторые функции не так-то просто инвертировать. Одной из таких функций является кумулятивная функция распределения (CDF) нормального распределения вероятностей (уравнение 1), где ни CDF, ни обратная CDF (функция квантиля) не могут быть выражены в закрытой форме. В данной статье представлен метод обращения функции с помощью нейронной сети вне зависимости от того, можно ли решить задачу аналитически.
В предыдущей статье на Medium интегрирующая нейронная сеть была представлена как метод интегрирования функции без аналитического решения. Например, CDF нормальной функции вероятности был получен путем обучения нейронной сети для получения интеграла функции плотности вероятности (PDF). В этой статье квантильная функция будет получена путем обучения нейронной сети инвертированию CDF. Затем из функции квантиля будут генерироваться случайные выборки из нормального распределения посредством выборки с обратным преобразованием.
Для справки графики функций PDF, CDF и квантилей представлены на рис. 1 и рис. 2.
2. Инвертирующая нейронная сеть
Инвертирующая нейронная сеть обучена производить обратную функцию. Инверсия функции y = f(x) выполняется путем обучения инвертирующей нейронной сети таким образом, чтовыход функции с входом, предоставленным выходом сети, равен входу сети, в результате чего выход сети становится обратной функцией, т. е. x = f ⁻¹(y).
2.1 Обучение нейронной сети
Ниже приведены этапы процедуры обучения:
- Примените обучающую точку yᵢ ко входу нейронной сети:
(Примечание. Модель нейронной сети x = nn_model(y) содержит один вход, y, несколько скрытых слоев и один выход, x.)
2. Подайте выход нейронной сети на вход инвертируемой функции y = f(x):
2 3. Обучите нейронную сеть с помощью функции потерь (потеря 2 в разделе 2.2), которая устанавливает следующую связь:
Затем, после обучения нейронной сети:
Подставляя y = f(x):
Уравнение 6 является определением обратной функции, поэтому:
2.2 Функция потерь нейронной сети
Обычно нейронная сеть обучается на паре известных входных и выходных данных. Входные данные обучения представляются нейронной сети, а результирующие выходные данные сравниваются с выходными данными обучения с использованием функции потерь. Потери, возвращаемые этой функцией, используются посредством обратного распространения для корректировки весов сети для уменьшения потерь. Инвертирующая нейронная сеть использует пользовательскую функцию потерь, чтобы заставить нейронную сеть выдавать ответ, соответствующий обратной функции, x = f ⁻¹(y).
Для нормального распределения CDF f(x) задается уравнением 1. Поскольку для этого уравнения нет решения в закрытой форме, обученная нейронная сеть, описанная в предыдущей статье Medium, используется для поставьте эту функцию. Он представлен как cdf = nn_cdf (x), где x – это вход сети, а cdf – выход CDF. (Модель обученной нейронной сети CDF доступна на Github.)
Функция потерь для инвертирующей нейронной сети, рис. 3, состоит из двух компонентов. Потеря 2, описанная в процедуре обучения выше (раздел 2.1), заставляет выходные данные нейронной сети соответствовать обратной функции, x = f ⁻¹(y). Потеря 1 с единственным условием точки (x_init, y_init) стабилизирует процесс обучения.
3. Реализация инвертирующей нейронной сети
Ниже приведен код Python для инвертирующей нейронной сети, реализующей функцию квантиля нормального распределения. Полный код доступен на Github.
3.1 Определение модели нейронной сети
Модель инвертирующей нейронной сети имеет два полностью связанных скрытых слоя, каждый из которых содержит 256 нейронов. Имеется один вход для точек домена и один выход для соответствующих значений инвертированной функции.
3.2 Инициализация
Модель нейронной сети, обученная с помощью функции CDF, cdf = nn_cdf (x), загружается в строке 3. Модель используется в определении инвертируемой функции в строках 6–8.
Очки обучения yᵢ из раздела 2.1 для потери 2 определены в строках 11–15 ниже. Порядок этих точек случайным образом перетасовывается в строке 17, чтобы способствовать стабильному обучению нейронной сети. Условие потери 1 определено в строках 21–22.
3.3 Этапы пакетного обучения
В листинге 3 показана функция шага обучения, применяемая к каждому набору точек обучения. Общая потеря (сумма потери 1 и потери 2) в строке 21 используется для обновления весов нейронной сети с помощью градиентного спуска (строки 23-27). Каждая эпоха обучения включает в себя несколько пакетов, которые совместно используют все точки обучения в обновлениях модели.
Строка 9 выдает ответ нейронной сети на начальное условие y_init. Ответ сравнивается с соответствующим начальным условием, x_init , что приводит к убытку 1 (строка 10).
В строке 13 выводится ответ сети на обучающую точку yᵢ (уравнение 2). Ответ сети подается на вход инвертируемой функции в строке 14 (уравнение 3), а в строках 16–17 выходные данные инвертируемой функции сравниваются с обучающей точкой yᵢ (уравнение 4), принося убытки 2.
4. Результаты
Рисунок 4 представляет собой квантильный отклик (красная кривая) на выходе обученной квантильной нейронной сети. Для проверки точности результатов включен квантильный отклик от функции ppf.cdf в библиотеке Python SciPy (зеленые точки).
Рисунок 5 представляет собой потери от общей функции потерь по сравнению с эпоха, зарегистрированная в процессе обучения.
Рисунок 6 представляет собой гистограмму нормально распределенных выборок, полученных с помощью выборки с обратным преобразованием. Выборка осуществляется путем применения равномерно распределенных выборок от 0 до 1 к вероятностному входу квантильной нейронной сети, в результате чего на выходе сети получаются нормально распределенные выборки. Гистограмма содержит 500 интервалов и 30 000 выборок. Для справки: красная кривая — это PDF нормального распределения.
5. Вывод
В этой статье демонстрируется метод обучения нейронной сети инвертированию функции с использованием пользовательской функции потерь. Показано, что метод эффективен и для обращения функций, не имеющих решения в замкнутой форме. Это было продемонстрировано путем обучения нейронной сети для предоставления квантильной функции нормального распределения путем инвертирования функции CDF.
PDF-файл этой статьи доступен на Github.
Все изображения, если не указано иное, принадлежат автору.