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

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

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

MLP – обычная полносвязная нейросеть, где благодаря послойной активации нейронов мы получаем какой-то конечный результат (данные) на последнем слое. Похоже на имитацию действия мозговых нейронов: благодаря передаче импульса от нейрона к нейрону – мы получаем результат в виде ассоциации, воспоминаний...

Так вот суть KAN сводится к переносу акцента с “активации нейронов” к активации “связей” между ними. 

Конечно, сами связи никуда не деваются, но. Теперь вместо обычных весовых отношений между нейронами – мы получаем обучаемые функции активации – связываем нейроны B-spline’ами. Веса – это такие числовые коэффициенты, которые определяют уровень активации нейронов. Больше вес – сильней сигнал.

Нейросети с большим числом слоев превращаются в черный ящик. Мы не можем понять, как конкретно числовые значения отвечают за те или иные признаки — и как именно признаки в них преобразуются. Поэтому внутренняя часть нейросети нам недоступна.

Напомним, как выглядит классическая формула MLP: 

Функцию активации и сложения можно представить себе в виде фильтра, который подсказывает нейрону "активизироваться или нет"...
Функцию активации и сложения можно представить себе в виде фильтра, который подсказывает нейрону "активизироваться или нет"...

MLP – базовый уровень устройства нейросетей, на подобной архитектуре работают и другие модели: от генеративных до рекуррентных. Поэтому KAN немного переворачивает подход.

Kolmogorov-Arnold Network (KAN) использует B-сплайны для аппроксимации функций из-за их вычислительной эффективности, локальной поддержки, которая снижает сложность обработки, и способности обеспечивать гладкость и гибкость представления функций. 

Аппроксимация здесь / восстановление функции – практически восстановление закономерностей из данных.

Ключевое слово – локальность. Именно локальность позволяет нам гибко перестраивать функции – этим обеспечивается “обучаемость” кривых. B-сплайны позволяют точно моделировать нелинейные зависимости, легко реализуются и предлагают контроль над параметрами аппроксимации… 

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

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

Но "Проклятие размерности" — это проблема, с которой сталкиваются нейросети, когда работают с данными высокой размерности, то есть с большим числом признаков или переменных. Тут мы расписали о ней подробнее.

f(x,y,z,e,d...) – мы можем положить в аргументы разыскиваемой функции много признаков. А наши аргументы, точнее их число – это размерность функции. 

В простых терминах, чем больше измерений (или признаков) у данных, тем труднее становится анализировать их и строить модели, которые бы хорошо работали.

Хотим классифицировать в нашей нейронке по тысячам признаков – тогда предлагайте данных N^d, где N — количество точек данных на одно измерение. 

Модели могут хорошо работать на тренировочных данных, но плохо обобщаться на новые, невидимые данные, так как в высоких размерностях вероятность переобучения вырастает в разы. 

Но, что нам делать то с этой суперпозицией функции (разными аргументами) и не потерять данные, не втягиваться в костыли? – разбить функцию на простые нелинейные функции… 

Многомерную функцию, множество значений которой – буквально сотни комбинаций пар (если вы решили исследовать функцию с множеством переменных) можно перевести в простые, человеческие одномерные действительные числа…. 

Мы можем превратить “многомерность” в “одномерность”. 

Больше не нужно решать проблемы с десятками и сотнями размерностей данных – теперь мы работаем в одном измерении. 

Так гласит теорема Колгоморова-Арнольда. 

Еще точнее: любую функцию в суперпозиции можно представить в виде суммы нелинейных “одномерных функций”. 

Наверное, все помнят еще со школы те самые функции, где нужно найти “область определения”... 

Такие функции можно разложить. Общая формула выглядит так:

Мы суммируем “одномерные” функции с двумя/одной переменными и получаем исходную функцию с множеством признаков/аргументов. Если вам больше интересна математическая сторона вопроса, переходите по ссылке.

Теперь кодеры могут использовать символьные формулы. 

B-spline в этой формуле играют роль функций, которые можно задавать кусками (только те области значений, которые нам нужны), а еще гибко управлять ими. 

Лучше показать визуально: 

Касательные – благодаря им строятся изменения в сплайнах. 

Подвинули касательную – изменили поведение графика нелинейной функции, B-spline. Касательные, как мы помним еще со школы, строятся через линейные функции kx + c. На графиках они показывают скорость убывания или возрастания значений функции. 

Вычисление конкретной скорости в отдельной точке – производная функции. Естественно, чтобы адекватно менять сплайны – нам нужно, чтобы эта “скорость” графика менялась равномерно без скачков. Функции, где производные меняются последовательно, грубо говоря, называют гладкими. 

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

Одна из проблем KAN – мы можем получать фрактальные функции в сумме многомерной функции. 

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

С другой стороны, такой подход по теореме предлагает нам возможность переписать стандартный MLP и подойти к нейросетям с новой стороны – теперь мы ищем закономерности, обучая функции активации B-spline. 

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

Получается, что стандартная формула нейросетей переписана, процесс приближения к изначальной функции (закономерности) становится эффективнее. Бенчмарки на тестах показали растущую эффективность в 10 раз, но мы жертвуем “скоростью” обучения, которая пропорционально уменьшается – в те же 10 раз. 

Конечно, интересно, как подобную архитектуру реализуют на популярных фреймворках Keras и TensorFlow. Мы написали большой материал, где рассматриваем архитектуру подробнее. Там мы оставили вариант реализации архитектуры на PyTorch и пример работы с официального Гитхаба KAN на библиотеке PyKAN, специально заточенной под нейросеть Колмогорова-Арнольда. 

Если вам хочется сразу перейти к делу на основе примеров – заходите в репозиторий KAN на Гитхабе. 

И сразу переходите к блокноту с кодом и объяснениями или читайте документацию

Для математиков полный вариант статьи можно почитать на английском – тут

Комментарии (0)