Кратко о KAN для самых неподготовленных
В апреле практиками-исследователями и математики анонсировали новую архитектуру нейросетей. Крупного резонанса открытие не принесло, хотя с нашей точки зрения, KAN может претендовать на интересную технологию Важнее, что это не просто новая вариация трансформера или исправленная рекуррентная нейронная сеть — это новый подход к нейросетям в принципе, новая архитектура вместо MLP.
Мы написали большую статью по KAN со всеми подробностями, здесь мы совсем кратко пробежимся по основным положениям архитектуры и ее проблемах для самых неподготовленных читателей.
Но надеемся, что некоторое понимание базовой линейной алгебры и математического анализа присутствует.
MLP — обычная полносвязная нейросеть, где благодаря послойной активации нейронов мы получаем какой-то конечный результат (данные) на последнем слое. Похоже на имитацию действия мозговых нейронов: благодаря передаче импульса от нейрона к нейрону — мы получаем результат в виде ассоциации, воспоминаний…
Так вот суть KAN сводится к переносу акцента с «активации нейронов» к активации «связей» между ними.
Конечно, сами связи никуда не деваются, но. Теперь вместо обычных весовых отношений между нейронами — мы получаем обучаемые функции активации — связываем нейроны B-spline«ами. Веса — это такие числовые коэффициенты, которые определяют уровень активации нейронов. Больше вес — сильней сигнал.
Нейросети с большим числом слоев превращаются в черный ящик. Мы не можем понять, как конкретно числовые значения отвечают за те или иные признаки — и как именно признаки в них преобразуются. Поэтому внутренняя часть нейросети нам недоступна.
Напомним, как выглядит классическая формула MLP:
Функцию активации и сложения можно представить себе в виде фильтра, который подсказывает нейрону «активизироваться или нет»…
MLP — базовый уровень устройства нейросетей, на подобной архитектуре работают и другие модели: от генеративных до рекуррентных. Поэтому KAN немного переворачивает подход.
Kolmogorov-Arnold Network (KAN) использует B-сплайны для аппроксимации функций из-за их вычислительной эффективности, локальной поддержки, которая снижает сложность обработки, и способности обеспечивать гладкость и гибкость представления функций.
Аппроксимация здесь / восстановление функции — практически восстановление закономерностей из данных.
Ключевое слово — локальность. Именно локальность позволяет нам гибко перестраивать функции — этим обеспечивается «обучаемость» кривых. B-сплайны позволяют точно моделировать нелинейные зависимости, легко реализуются и предлагают контроль над параметрами аппроксимации…
Гибкость позволяет нейросети обучать функции активации так, чтобы получить наилучший результат. Функции активации в нейронных сетях помогают решить, активируется ли нейрон (будет ли он передавать сигнал дальше) или нет.
Для начала стоит вернуться к ключевой задаче нейросети — нахождении закономерностей и скрытых зависимостей. Выбирается датасет (упорядоченный набор данных), который становится источником входных данных. На выходе благодаря активациям и обработке мы получаем конечный результат. Основная вычислительная задача — аппроксимация многомерной функции.
Но «Проклятие размерности» — это проблема, с которой сталкиваются нейросети, когда работают с данными высокой размерности, то есть с большим числом признаков или переменных. Тут мы расписали о ней подробнее.
— мы можем положить в аргументы разыскиваемой функции много признаков. А наши аргументы, точнее их число — это размерность функции.
В простых терминах, чем больше измерений (или признаков) у данных, тем труднее становится анализировать их и строить модели, которые бы хорошо работали.
Хотим классифицировать в нашей нейронке по тысячам признаков — тогда предлагайте данных , где — количество точек данных на одно измерение.
Модели могут хорошо работать на тренировочных данных, но плохо обобщаться на новые, невидимые данные, так как в высоких размерностях вероятность переобучения вырастает в разы.
Но, что нам делать то с этой суперпозицией функции (разными аргументами) и не потерять данные, не втягиваться в костыли? — разбить функцию на простые нелинейные функции…
Многомерную функцию, множество значений которой — буквально сотни комбинаций пар (если вы решили исследовать функцию с множеством переменных) можно перевести в простые, человеческие одномерные действительные числа….
Мы можем превратить «многомерность» в «одномерность».
Больше не нужно решать проблемы с десятками и сотнями размерностей данных — теперь мы работаем в одном измерении.
Так гласит теорема Колгоморова-Арнольда.
Еще точнее: любую функцию в суперпозиции можно представить в виде суммы нелинейных «одномерных функций».
Наверное, все помнят еще со школы те самые функции, где нужно найти «область определения»…
Такие функции можно разложить. Общая формула выглядит так:
Мы суммируем «одномерные» функции с двумя/одной переменными и получаем исходную функцию с множеством признаков/аргументов. Если вам больше интересна математическая сторона вопроса, переходите по ссылке.
Теперь кодеры могут использовать символьные формулы.
B-spline в этой формуле играют роль функций, которые можно задавать кусками (только те области значений, которые нам нужны), а еще гибко управлять ими.
Лучше показать визуально:
Касательные — благодаря им строятся изменения в сплайнах.
Подвинули касательную — изменили поведение графика нелинейной функции, B-spline. Касательные, как мы помним еще со школы, строятся через линейные функции На графиках они показывают скорость убывания или возрастания значений функции.
Вычисление конкретной скорости в отдельной точке — производная функции. Естественно, чтобы адекватно менять сплайны — нам нужно, чтобы эта «скорость» графика менялась равномерно без скачков. Функции, где производные меняются последовательно, грубо говоря, называют гладкими.
Но тут возникает ключевая проблема. А кто сказал, что при разложении функции от многих переменных по теореме Колгоморова-Арнольда мы будем получать только сумму нелинейных и гладких функций?
Одна из проблем KAN — мы можем получать фрактальные функции в сумме многомерной функции.
Фрактальные функции, область значений которых выходит в комплексные числа. Комплексные числа — расширенная версия действительных/обыденных чисел. Зачастую формулы фракталов сложны и пугающи, считать их даже без учета комплексных чисел сложно.
С другой стороны, такой подход по теореме предлагает нам возможность переписать стандартный MLP и подойти к нейросетям с новой стороны — теперь мы ищем закономерности, обучая функции активации B-spline.
Они гибкие и легко поддаются изменениям из-за своей локальности, активно обучают другие функции активации.
Получается, что стандартная формула нейросетей переписана, процесс приближения к изначальной функции (закономерности) становится эффективнее. Бенчмарки на тестах показали растущую эффективность в 10 раз, но мы жертвуем «скоростью» обучения, которая пропорционально уменьшается — в те же 10 раз.
Конечно, интересно, как подобную архитектуру реализуют на популярных фреймворках Keras и TensorFlow. Мы написали большой материал, где рассматриваем архитектуру подробнее. Там мы оставили вариант реализации архитектуры на PyTorch и пример работы с официального Гитхаба KAN на библиотеке PyKAN, специально заточенной под нейросеть Колмогорова-Арнольда.
Если вам хочется сразу перейти к делу на основе примеров — заходите в репозиторий KAN на Гитхабе.
И сразу переходите к блокноту с кодом и объяснениями или читайте документацию.
Для математиков полный вариант статьи можно почитать на английском — тут.