Вступление: зачем лезть в KAN
Это продолжение поста “Две нейросети по 15 КБ” - там были базовые цифры. А тут уже личная история: как делалось, что пошло не так, и что выяснилось по пути.
Май 2024 года. Выходит статья “KAN: Kolmogorov-Arnold Networks”. И происходит то, что бывает раз в несколько лет - кто-то предлагает альтернативу MLP.
Не модификацию и не лайфхак - альтернативу.
В MLP каждый нейрон делает weight × input + bias, и все 80 лет развития - это вариации на тему “как сделать этот вес точнее, быстрее, разреженнее”. KAN предлагает другое: заменить линейный вес на обучаемую функцию. Вроде мелкий трюк, а на практике - меньше параметров при той же точности и встроенная интерпретируемость.
К 2026 году уже появились QuantKAN (4-битное квантование), KANtize (2-3-битные B-spline таблицы), BiKA (аппаратный акселератор, вдохновленный KAN). И все они, по сути, про одно - сделать KAN меньше, чтоб работал не только на GPU.
Граница в три бита - она же психологическая. Ниже 4 бит у всех начинается «а вдруг всё сломается». И знаете что? Обычно так и есть. Любой, кто квантовал нейросети в 2 бита, знает: точность падает. Не чуть-чуть - катастрофически.
Но {-1, 0, +1} - это даже не два бита, это log₂(3) ≈ 1.58 бита. Формально - между binary и ternary, а по ощущениям - чистое безумие.
Ну я и решил попробовать.
Как я сломал правило “квантование убивает точность”
Эксперимент выглядел так: берем GraphKAN - мою графовую реализацию KAN, где нейроны соединены не слоями, а произвольными направленными связями. Обучаем в float, потом переводим веса в {-1, 0, +1} через Straight-Through Estimator. Потом - hard clamp. Потом - дообучение только scale и bias.
Четыре фазы, никакой магии.
Ожидал увидеть падение точности на 5-10 пунктов. До 85-88%. Ну норм: 15 КБ модель, которая хоть что-то распознаёт на MNIST, - уже результат.
Но на пятой эпохе float я получил 94.77%. Ничего выдающегося для полносвязной сети, но KAN есть KAN.
Дальше - STE ternary, и тут счётчик показал 95.78%.
Я перепроверил - и ещё раз. Hard clamp дал 96.09%, finetune - 96.15%.
Четыре фазы, точность растет на каждом шагу. Float → STE → clamp → finetune - и вместо потери точности я получил прирост в +1.38 процентных пункта.
Я полез гуглить, есть ли у кого-то такое. QuantKAN, KANtize, BiKA - у всех «negligible accuracy loss». То есть просто «ну почти не потеряли». А у меня ведь - выигрыш. Среди статей по KAN я такого не встречал.
Я перепроверил три раза на разных seed. Эффект стабильный.
Почему так вышло - гипотеза
Тернарный вес - это вентиль: пропустить сигнал как есть (+1), инвертировать (-1) или заблокировать (0). Никаких тонких настроек, никаких 0.0037, которые вносят шум, но формально считаются “информацией”.
Когда режешь вес до трех значений, ты режешь не только точность веса - ты режешь пространство гипотез. Модель не может выучить шумовые корреляции, потому что для этого нужны точные значения. В тернарном формате шум фильтруется округлением на этапе backward - мелкие градиенты просто не пробивают порог.
Короче говоря, эффект такой: веса, зажатые тремя значениями, сами работают как регуляризатор. Дискретность не даёт модели переобучаться - банально не хватает «разрешения» веса, чтобы запомнить шум. В литературе по KAN я такого не встречал.
На практике процесс split на четыре шага. Сначала тупо ограничиваем веса диапазоном [-1, 1] - чтобы они не разлетелись. Потом подключаем STE: на прямом проходе веса уже тернарные, а градиенты считаем как будто ничего не изменилось. Дальше - принудительная фиксация: каждый вес становится ровно -1, 0 или +1. И финальный шаг - дообучаем только масштаб и смещение, веса заморожены.
Каждая фаза агрессивнее предыдущей - и каждая даёт прирост. Если бы мне кто-то рассказал такой результат до эксперимента, я бы не поверил.
Что получилось: таблица
Модель |
Веса |
Размер |
MNIST |
Fashion-MNIST |
|---|---|---|---|---|
GraphKAN 256→100→10 |
float |
~15 КБ |
94.77% |
84.1% |
GraphKAN 256→100→10 |
{-1,0,+1} |
~15 КБ |
96.15% |
86.68% |
MLP 256→100→10 |
float |
~107 КБ |
~93% |
- |
MLP в 7 раз больше по размеру - и на 3 пункта хуже по точности. Я не про то, что мы победили SOTA - просто KAN с тернарными весами оказался эффективнее обычного MLP при тех же нейронах и в 7 раз меньшем объеме.
Пять доменов
Проверял на всем, что подворачивалось под руку:
MNIST - 96.15%. Цифры, классика.
Fashion-MNIST - 86.68%. Одежда, сложнее цифр - но тернарная версия все равно бьет float.
HAR (Human Activity Recognition) - акселерометры с телефона. Тернарный KAN работает на временных рядах без RNN.
FSDD (Free Spoken Digit Dataset) - аудио, цифры голосом. Распознает без DSP-предобработки.
CIFAR-10 - тут честно: 47.83% на 8x8 входе. KAN с такой архитектурой не тянет сложные картинки как CNN - для 32x32 входов нужно больше параметров или сверточная структура.
На всех доменах, кроме CIFAR, тернарная версия по точности либо совпадает с float, либо бьет его.
ELM-режим: 99.3% от full BP accuracy без обучения скрытого слоя
Еще штука, которую я не упомянул в прошлый раз - GraphKAN умеет работать в режиме Extreme Learning Machine.
Случайная инициализация скрытого слоя → заморозка → решение только выходного веса через Least Squares. Никакого backprop через скрытые нейроны. На Fashion-MNIST это дало 78.7% при скрытом слое 500 - то есть 99.3% от accuracy полного backprop (79.2%).
Зачем это нужно? Ну типа ELM-режим означает, что piecewise-linear структура KAN генерирует естественно дискриминативные признаки даже из случайных весов. Для TinyML это критично: можно загрузить модель, заморозить 99% параметров и дообучать только последний слой - прямо на устройстве.
Размер скрытого слоя |
Accuracy |
% от BP |
Размер модели |
|---|---|---|---|
H=50 |
74.5% |
94.1% |
3.7 КБ |
H=100 |
77.0% |
97.3% |
6.8 КБ |
H=200 |
77.7% |
98.1% |
14 КБ |
H=500 |
78.7% |
99.3% |
31.6 КБ |
Это работает не только на KAN
Я проверил QAT-пайплайн на обычной CNN (Conv2d + ReLU + MaxPool + FC). Те же 4 фазы, та же gamma absorption. Результат:
Конфигурация |
Float |
STE ternary |
True ternary |
|---|---|---|---|
CNN (Fashion-MNIST) |
91.57% |
91.83% |
92.02% |
График сжатия |
1x |
8x |
16x |
Тернарная CNN не просто сохранила точность - она ее повысила на 0.45 п.п. То есть эффект регуляризации квантованием работает и на других архитектурах, не только на KAN. Не сошлось на одной конфигурации.
Сравнение с тем, что было до
До нас KAN квантовали вот как:
Работа |
Биты |
Метод |
Результат |
|---|---|---|---|
QuantKAN |
4-bit |
QAT для KAN |
loss, не gain |
KANtize |
2-3 bit |
B-spline таблицы |
loss, не веса |
BiKA |
аппаратный |
компараторы |
не KAN, HW |
BitNet b1.58 |
1.58 bit |
ternary Transformer |
lossless, но Transformer |
Мы - GraphKAN |
1.58 bit |
STE + gamma abs + clamp |
+1.4% к float |
И бонус: тот же pipeline дает +0.45% на CNN. Похоже, эффект регуляризации квантованием - это скорее не особенность KAN, а общее свойство ternary QAT с gamma absorption.
Куда это помещается: поход по железу
15 КБ - и проблема выбора чипа просто исчезает.
Устройство |
Flash |
L1 кэш |
FPU |
GraphKAN влезает? |
|---|---|---|---|---|
ARM Cortex-M0+ (STM32G0, $0.50) |
16-64 КБ |
- |
нет |
✅ целиком |
ARM Cortex-M4 (STM32F4) |
512 КБ |
16 КБ |
есть |
✅ в L1 |
ARM Cortex-M7 (STM32H7) |
2 МБ |
64 КБ |
есть |
✅ в L1 |
RISC-V (GD32V) |
32 КБ |
- |
нет |
✅ |
ESP32-S3 |
384 КБ |
16 КБ |
нет |
✅ в L1 |
Arduino Nano RP2040 |
264 КБ |
- |
нет |
✅ |
И главное: тернарные веса заменяют умножение на условное сложение/вычитание/пропуск - два-три такта против 15-20 на float32. Никакого FPU, никаких DSP-инструкций - нафиг не нужно.
Где это применить
TinyML. Датчик вибрации на STM32G0 за $0.50 с батарейкой CR2032 на 5 лет. GraphKAN предсказывает поломку подшипника. Без Wi-Fi, без облака - всё на месте.
Умные часы. Анализ ЭКГ прямо на чипе, без Bluetooth на телефон. Медицинские данные не покидают устройство.
LoRa-сенсоры. 15 КБ - размер, который можно передать по радио за пару секунд. Ардуино с камерой - снимок, GraphKAN, результат. Все локально.
Edge AI без GPU. Графовая архитектура позволяет добавить нейрон на новый сенсор без перестройки сети - для IoT с разными конфигурациями датчиков это gold.
Образование. 15 КБ - модель, которую можно разобрать побайтово. Понять, как работает нейросеть, не имея GPU.
Ограничения (честно)
Не хочу, чтобы пост выглядел как “мы всех победили, patent pending”. Давайте честно.
CIFAR-10: 47.83%. KAN в своей базовой форме не тянет сложные изображения. Для 32x32 цветных картинок нужна сверточная архитектура. Вот тут фундаментальная проблема: piecewise-linear функции хуже масштабируются на высокоразмерные входы, чем свертки.
MNIST 96.15% - это не SOTA. SOTA на MNIST - 99.8%+ (Ensemble CNN). Но SOTA требует ~10+ МБ модели и GPU для инференса. 96.15% при 15 КБ - это другой класс задач: TinyML, где нет мегабайт и нет GPU. Сравнивать эти цифры напрямую - как сравнивать скорость Formula-1 и вездехода. Разные трассы.
Граф собирается вручную. Топология (кто с кем соединён) не обучается - фиксируется до обучения. Тут нет обучения adjacency matrix, как в graph neural network. Граф, но структура фиксирована до обучения.
Умножение все равно нужно на этапе training. Тернарность - только для inference. Training идет в float с STE.
Эпилог: почему 15 КБ важнее, чем 99% accuracy
Логичный вопрос: а почему бы просто не взять CNN и не сжать ее до 15 КБ?
Ответ: попробуйте.
Возьмите ResNet-18 (44 MB), квантизуйте до 2 бит - получите ~2.75 MB. Не 15 КБ. Mobilenet (4 MB) - ~500 КБ. Все равно не 15 КБ.
Чтобы получить 15 КБ, нужно либо резать архитектуру до неприличия (один слой, 10 нейронов - и 60% accuracy), либо менять саму парадигму.
В общем, GraphKAN меняет парадигму: вес - это не число для умножения, а один из трех символов. Пропустить, инвертировать или заблокировать - и всё.
Это уже не совсем нейросеть в привычном смысле. По духу оно ближе к конечному автомату с обучаемыми переходами, где каждый переход - {-1, 0, +1}. И этот автомат размером с три JPEG-фотографии угадывает цифры с точностью 96%.
Дело не в рекордах. SOTA будет обновляться каждые полгода - да и пофиг. А 15 КБ - это порог, после которого модель уже не «большая нейросеть», а библиотечная функция.
Нейросеть не загружается на микроконтроллер отдельно - она компилируется вместе с прошивкой. Одна функция на одну структуру - и никаких тебе DMA, внешних flash или драйверов.
15 КБ - это размер не модели.
Это размер решения.
Ссылки:
Комментарии (10)

ENick
19.06.2026 23:42Как контролируется переобучение без графика loss-test?

Fakeonomics Автор
19.06.2026 23:42Контроль - кросс-доменная валидация. Модель обучалась на MNIST, но проверялась на 5 доменах: Fashion-MNIST, HAR (акселерометры), FSDD (аудио), CIFAR-10. Если бы было переобучение - на доменах, отличных от MNIST, точность бы рухнула. На Fashion-MNIST ternary даже бьет float (86.68% vs 84.1%). А сам эффект ternary весов - это по сути регуляризация: три значения не дают модели запомнить шум, потому что "разрешения" веса банально не хватает.

Biga
19.06.2026 23:42Но ведь всё равно вес хранится в 2 битах. Так где сравнение с 4 состояниями (например, +2, +1, 0, -1)?

Fakeonomics Автор
19.06.2026 23:42Логика простая: 3 состояния = 3 операции. Пропустить (+1), инвертировать (-1), заблокировать (0). Это конечный автомат, где каждый вес - это switch. Четвертое состояние (+2) потребовало бы уже умножение на коэффициент - а тернарность как раз в том, чтобы заменить умножение на условное сложение/вычитание/пропуск. log2(3) ≈ 1.58 бита - это уже между binary и ternary. Если нужен +2 - лучше просто добавить еще один нейрон с +1, чем вводить четвертое значение веса

kinh
19.06.2026 23:42Можно и без switch обойтись. В моей статье Умножение троичных матриц для нейросетей я показал, как быстро перемножать троичные матрицы.

FD4A
19.06.2026 23:42А высокий процент на MNIST это вообще валидная метрика? Я как-то разглядывал эти циферки, и если бы кто-то про некоторые из них стал бы утверждать, что это какая-то конкрентная цифра, то как будто ему надо 2 поставить и оставить после занятий заниматься чистописанием.

Fakeonomics Автор
19.06.2026 23:42Так MNIST в статье не как метрика "смотрите мы крутые", а как демонстрация что ternary ≥ float (94.77 → 96.15%). Весь смысл не в высоте процента, а в том что квантование не убило точность, а подняло. На Fashion-MNIST то же самое: 84.1 → 86.68%. На CNN: 91.57 → 92.02%. Эффект не на одном MNIST, а на всех архитектурах. Сам MNIST тут — это просто понятный бенчмарк, чтобы показать трюк, а не SOTA.

FD4A
19.06.2026 23:42Это я понял, скорее к тому что возможно 96% это и есть оптимум, а 99% уже с мусором.
xolod7
Привет! Альтернатива нейросетям? Не модификацию, не лайфхак.... как на счет...
график обучения полигармонического каскада... без сверток.. просто тест... изображение как плоский вектор (мешок пикселей).... не нейросеть, не градиентный спуск, не бустинг и не лес... приглашаю, пожалуйста, заглянуть сюда Поиск черной кошки в 2000-мерной темной комнате. Турнир алгоритмов машинного обучения / Хабр
Fakeonomics Автор
кое что интересное попробую...