Обновить

На практике пробуем KAN – принципиально новую архитектуру нейросетей

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели51K
Всего голосов 56: ↑56 и ↓0+76
Комментарии17

Комментарии 17

В оригинальной статье написано, что у них есть метод suggest_symbolic, который сам предлагает функцию вместо сплайна (чтобы не гадать по картинке и делать это автоматически), но не написано, как оно работает. Не смотрели?

Спасибо за интересные примеры и статью!

Интересно, там Макс Тегмарк в соавторах. Вот этот https://github.com/KindXiaoming/pykan/tree/master официальный? Разобраться бы, как они back propagation сделали, по моему опыту, немонотонные функции активации стандартными методами обучаются плохо.

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

А мне вот не понятен один момент. В "еньтих ваших тырнетах" восторгаются перфомансом и эффективностью таких сетей. И при этом обходят стороной тему количества параметров модели. Я ещё не углубился в тему KAN, но мне видится такое сравнение.

Традиционная модель со скалярным весами на рёбрах (например, Stable Diffusion) мы имеем одномчисло FP16 на ребро, видимо. При этом все нейроны в слое имеют одну функцию активации всегда. Т.е. не отличаются между разными чекпоинтами.

А тут получается мы на каждое ребро должны указать класс функции активации, плюс у каждой функции активации свой набор числовых параметров, наверное. Таким образом, одно ребро уже кодируется целым числом класса функции и как минимум одним параметром функции (масштабный коэффициент). И на самом деле коэффициентов должно быть несколько (масштабный и напр. наклон какой-нибудь). Логично предположить что длину параметров сделают фиксированной по максимальному количеству. Объем чекпоинта будет в несколько раз больше. Значит эта сетка должна кратно лучше справляться с задачей просто чтобы сравняться со стандартной архитектурой сетки.

А ещё не понятно как это все будет превращаться в тензор для GPU. Оператор IF или SWITCH для GPU завезли? Видеокарта же должна налёту при операциях "тензор-тензор" менять функцию активации для миллиардов связей между нейронами.

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

Т.е. не отличаются между разными чекпоинтами

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

на самом деле коэффициентов должно быть несколько

когда они заменяют сплайны на функцию, их всегда 4: a * f(b*x + c) + d

чтобы сравняться со стандартной архитектурой сетки

Да, они всегда брали гораздо более скромное число вершин и ребёр, чем для полносвязок, с которыми сравнивали.

Оператор IF или SWITCH для GPU завезли? Видеокарта же должна налёту при операциях "тензор-тензор" менять функцию активации для миллиардов связей между нейронами

Функции CUDA поддерживают операторы if и switch и даже указатели на функции, так что в принципе можно писать и так y[i] = func[i] (x[i] * a[i]) и т.п. Но это на самом деле и не требуется, просто при замене функции меняется граф вычисления, снова все загружается на видеокарту и поехало стандартным образом. Ведь здесь не требуется регулярно изменять функции в ходе обучения, это довольно редкое событие, сначала все пытается аппроксимировать сплайнами.

Есть ли где-то сравнение "стандартных" MLP моделей и KAN на вот таких реальных кейсах?

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

я попробовал сделать элементарное сравнение линейной регресии на KAN и обычной из пакета sklearn. На данных 20% от выборки и ручной настройки как в примере KAN показал себя лучше. Линейная регрессия - MSE: 1.5022919153867573 MAE: 0.9659086981162798 R^2: 0.7849837136936388
KAN - MSE: 1.4126656877976367 MAE: 0.9042094479176999 R^2: 0.7978115126150622.
Но, на автопараметрах (dataset, opt="LBFGS", steps=50) все выглядит на так радужно
Линейная регрессия - MSE: 4.54727560052927 MAE: 1.2385682701351006 R^2: 0.5989117291667839
KAN - MSE: 5.424334130717595 MAE: 1.3351252002666314 R^2: 0.5215515864800699

>> Successfully installed pykan-0.0.2

Попробовал - сразу получил в лоб:

ModuleNotFoundError: No module named 'kan'

С каким бубном танцевать?

Мне кажется KAN по своему принципу напоминает обычную нейронку, у которой каждый признак на входе дополняет кучка искусственно созданных (x², x³, sin(x) и т.д.). Только в случае KAN это делается для всех слоев, а не только входного

Что ни день, то какой-нибудь прорыв в ИИ... Это всё круто, конечно. Но иногда хочется сказать "горшочек, не вари ! Я не вывожу !"

Дочитал до названия библиотеки и на всякий случай проверил дату статьи, не первое ли апреля

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

  • За счет того, что в KAN мы обучаем функции, а не числа, можно повысить точность сети без переобучения ее с нуля. В MLP, чтобы добиться лучшей точности, мы можем увеличивать количество слоев и нейронов, но это требует полноценного ретрейнинга и вообще-то работает далеко не всегда. В KAN достаточно просто добавить больше точек в сетку аппроксимации. Это гарантирует лучший результат, и при этом не нужно переучивать нейросеть.

могу предположить, что изначально сеть vожно разделить на подсети (и сами данные тоже) и обучать параллельно. А затем объединить в одну общую сеть.

Использовал похожую идею. Только не разделял и потом объединял, а эранировал при ообучении новому домену. Ну или мы про одно и то же. Результаты 0 деградации выученного материала - это главная победа тут, а не скорость. Правда сеть так растет быстрее, но и тут есть выход... =) Про скорость читай ниже, х10 побеждается. Сейчас у меня +10% а не х10, по сравнению с MLP, просто не надо в лоб идти. Сейчас еще тестирую всякие адаптации под cuda-ядра, чтобы пользоваться магией GPU, может еще удаться выжать.

Тезис: у архитектуры есть бутылочное горлышко: KAN учится медленнее MLP примерно в 10 раз.

Ответ: это верно про наивную реализацию, но не про архитектуру — и разрыв закрывается стандартными средствами.

Да, «из коробки» KAN действительно медленнее: на стенде замерил ~3.6× на сплайн-слое, а для неоптимизированного KAT в литературе сообщают и до 123×. Но важно, откуда берётся это замедление. Прогнали профилировщик — и оказалось, что время уходит не на вычисления сети (главное умножение у KAN быстрое, FLOPs даже меньше, чем у MLP), а на подготовку и пересчёт базисных функций и их градиентов — то есть на трафик по памяти. Это memory-bound узкое место реализации, а не фундаментальное свойство.

А раз причина — беготня по памяти, лечится она дёшево. Двумя изменениями, без единой строчки кастомного CUDA-кода:

  • заменили «возведение в квадрат» на умножение (убрали самый дорогой шаг в backward — математически идентично, качество бит-в-бит);

  • включили автокомпилятор (torch.compile), который склеил мелкие операции в одно ядро.

Результат: сплайн-слой с ×3.6 сжался до ×1.1 относительно MLP, а обучение целиком вышло на паритет — при неизменном качестве (проверено на трёх сидах).

И это не только наш результат. Индустрия уже решила ту же проблему на масштабе: FlashKAT (AAAI 2026) нашёл, что тормоз KAT сидит в атомарных операциях backward, переписал ядро — и ускорил обучение в 86.5×, сократив разрыв с обычным трансформером со ~123× до ~1.4×. MatrixKAN даёт ~40× переписыванием рекурсии сплайна в матричную форму.

Вывод: «в 10 раз медленнее» — это описание конкретной наивной реализации, а не потолок архитектуры. Настоящее горлышко — память вокруг базиса, и оно снимается фьюзингом ядер. С ним KAN обучается практически вровень с MLP.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации