
Я попробовал считать нейросетевой слой в конечном поле Галуа GF(137): 4x по памяти, ARM NEON и честные ограничения
ankro 2 часа назад Я попробовал считать нейросетевой слой в конечном поле Галуа GF(137): 4x по памяти, ARM NEON и честные ограничения Средний 6 мин 2.2K C++ * Машинное обучение * Алгоритмы * Open source * Математика *...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
В сфере искусственного интеллекта произошло заметное событие. ankro 2 часа назад Я попробовал считать нейросетевой слой в конечном поле Галуа GF(137): 4x по памяти, ARM NEON и честные ограничения Средний 6 мин 2. 2K C++ * Машинное обучение * Алгоритмы * Open source * Математика * Кейс Из песочницы В современных нейросетях критически важно, сколько физической памяти занимает каждый параметр. В этой работе я попытался уйти от классического float32 в нейросетевом слое к uint8 без квантования.
Для этого все вычисления проводились сразу по правилам арифметики остатков в конечном поле Галуа GF(137). Стоит сказать, что это не замена обычному инференсу и не попытка доказать, что все должны срочно переписать модели на вычеты по модулю 137. Я взял небольшой слой, байтовые веса, нативное ядро, ARM NEON и несколько базовых реализаций для сравнения.
Технические детали
Спойлер: на маленьком контрольном запуске байтовая модель заняла около 1. 50 KB, при этом 1000 прямых проходов в ARM NEON режиме заняли всего 12. В лучшем случае на выборке это дает около 4x по памяти и до 4.
86x по времени относительно базовой NumPy float32-реализации. Коротко про идеюОбычный плотный слой можно записать так:y = activation(x*W + b) В моём прототипе это было заменено на конечнополевой вариант:r = (x*W + b) mod 137 y = 1, если r >= 42 y = 0, если r < 42 То есть матричное умножение остается на месте, но накопленная сумма приводится по модулю 137, а затем проходит через простой порог. Отдельная операция в ядре выглядит так:mac137(a, b, c) = (c + a*b) mod 137 Как видите, это не квантизация готовой float32-модели.
В моем решении значения изначально живут в байтовом конечнополевом представлении: веса и активации хранятся как uint8, а вычисления идут в арифметике по модулю 137. Уже предвосхищаю вопрос почему именно 137? Потому что это простое число меньше 256, а значит все значения от 0 до 136 помещаются в uint8.
Отраслевые последствия
Сама арифметика по модулю 137 образует конечное поле GF(137). В поле Галуа у любого ненулевого элемента есть обратный ему. Это значит, что для любого a !
= 0 можно найти такое число a^{-1}, чтоa * a^{-1} ≡ 1 (mod 137) Например, обратный элемент к 2 по модулю 137 — это 69:2 * 69 = 138 ≡ 1 (mod 137) То есть деление тоже можно заменить умножением на обратный элемент. В обычной арифметике это звучит естественно, но по модулю так работает не всегда. Например, если взять модуль 256, то у 2 нет обратного элемента: 2*x всегда будет чётным и никогда не даст остаток 1.
Поэтому простой модуль удобнее. И хоть он и даёт маленький дискретный алфавит, но работать с ним удобнее из-за “нормальной” алгебры. В GF(137) можно складывать, умножать и, где нужно, делить на ненулевые элементы.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




