Pull to refresh

Comments 15

В оригинальной статье написано, что у них есть метод 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ожно разделить на подсети (и сами данные тоже) и обучать параллельно. А затем объединить в одну общую сеть.

Sign up to leave a comment.

Articles