- PVSM.RU - https://www.pvsm.ru -

NN vs фракталы: может ли нейросеть выучить красивые математические функции?

В процессе прохождения курса от MIT про нейросети наткнулась на интересную тему, представленную одним из лекторов. Он задался вопросом: «А может ли нейросеть выучить функцию Вейерштрасса (непрерывная функция на вещественной прямой, не имеющая производной ни в одной точке)?». Я решила проверить это на практике. Мною было принято решение не останавливаться на фракталах, а поискать другие функции, обладающие интересными для математика свойствами: лестница Кантора, функция Римана (Томаэ) и др. В данной статье представлена только функция Вейерштрасса.


Большинство тех, кто работал с нейросетями знает об их возможности аппроксимировать функции. Например, очевидно, что такую простую зависимость как f(x)=sin(x) + frac{x}{2}.

Может легко выучить нейросеть с архитектурой (здесь и ниже для эксперимента использовалась библиотека PyTorch):

super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(1,64)
        self.relu1 = nn.ReLU()
        self.fc2 = nn.Linear(64, 64)
        self.relu2 = nn.GELU()
        self.fc3 = nn.Linear(64,1)

С учетом параметров ниже, получилось (см. рис. ниже):

  • 1 000 точек

  • criterion = nn.MSELoss()

  • optimizer = optim.Adam(model.parameters(), lr = 0.1)

  • 1 000 эпох

вывод простой модели

вывод простой модели

Но что насчет зависимостей посложнее? Для следующего анализа были взяты функции (результаты 1 представлены в этой статье, результаты 2 и 3 — нет):

  1. Функция Вейерштрасса Weir(x)=sum_{n=0}^{50} a^n cdot cos(b^n cdot pi x) с параметрами a=0.5, b=3

  2. Лестница Кантора с глубиной 7:

    f(x)=sum_{n=1}^{N(x)} frac{a_n}{2^n}, quad text{где } x=sum_{n=1}^{infty} frac{2a_n}{3^n} in C

  3. Функция Римана (Томаэ):

f(x)=begin{cases}  frac{1}{q}, & text{если } x=frac{p}{q} in mathbb{Q} text{ --- несократимая дробь}, q > 0; \  0, & text{если } x notin mathbb{Q} text{ или } x=0.  end{cases}

Функция Вейерштрасса (часть 1)

Для начала нейросеть вида:

self.layers = nn.Sequential(
            nn.Linear(1, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 1)
        )

была обучена на «левой половине» графика, то есть на для точек с абсциссой из отрезка [-1, 0] (см. рис. ниже).

функция Вейерштрасса "левая половина"

функция Вейерштрасса «левая половина»

При следующих параметрах обучения

  • 1 000 точек

  • criterion = nn.MSELoss()

  • optimizer = optim.Adam(model.parameters(), lr = 0.001)

  • scheduler = lr_scheduler.ReduceLROnPlateau( optimizer, mode = “min”, factor = 0.5, patience = 200, ) — планировщик был добавлен для улучшения качества обучения

  • 15 000 эпох

ошибка 0.0020 была достигнута на примерно 7 000-й эпохе и не менялась вплоть до 15 000. Предположительно, сеть переобучилась под конкретный участок.

Однако, как известно, если нейросеть выучила одну часть графика это еще не значит, что она «уловила» всю зависимость, что и случилось в нашем случае. Если построить график на [-1, 1] и взять точки с уже обученной нейросети выше, то получаем катастрофическую разницу на промежутке [0, 1]:

NN vs фракталы: может ли нейросеть выучить красивые математические функции? - 11

Функция Вейерштрасса (часть 2)

Для честности эксперимента, мы дадим шанс предыдущей нейросети и обучим ее на выборке точек из полного отрезка [-1, 1] (2 000 точек) при полном копировании остальных параметров. Результат на рисунке ниже:

функция Вейерштрасса полная версия

функция Вейерштрасса полная версия

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

предсказание функции Вейерштрасса

предсказание функции Вейерштрасса

Вывод

Таким образом, мы видим, что ключевым фактором является репрезентативность обучающей выборки: нейросеть не смогла симметрично продолжить график вторую половину области определения. При этом на данном примере мы получили положительный ответ на вопрос о возможности нейросети воспроизведения сложной структуры математической зависимости при условии репрезентативности выборки. Далее планируется проверить упомянутые выше лестницу Кантора, функцию Римана и некоторые другие.

Автор: Ir1na

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/matematika/456889

Ссылки в тексте:

[1] Источник: https://habr.com/ru/articles/1072024/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1072024