LLM ошибаются в элементарной математике. Корпорации тратят миллиарды, но в конечном счете вынуждены прикручивать калькуляторы к вычислительным машинам невероятнLLM ошибаются в элементарной математике. Корпорации тратят миллиарды, но в конечном счете вынуждены прикручивать калькуляторы к вычислительным машинам невероятн

Нейросимвольный ИИ: архитектура семантической нейросети. Как научить LLM считать

2026/02/19 12:11
18м. чтение

LLM ошибаются в элементарной математике. Корпорации тратят миллиарды, но в конечном счете вынуждены прикручивать калькуляторы к вычислительным машинам невероятной мощи. Все попытки исправить через Chain-of-Thought, fine-tuning на задачах счёта, увеличение контекста не сработали.

Я провёл серию экспериментов чтобы понять почему, и пришел к выводу, что нейросети просто не предназначены для дискретной арифметики. Их предназначение непрерывные трансформации.

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

Традиционно пропущу философские основания, позволившие прийти к данному решению.

TL;DR LLM ошибаются в арифметике не из-за недостатка данных или параметров — нейросети фундаментально не предназначены для дискретных вычислений. Они эволюционировали (как и биологический мозг) для непрерывных трансформаций и распознавания паттернов. Решение — не учить их считать, а встроить алгебраический процессор. Разработана архитектура из четырёх компонентов: изолированная шина данных (X не проходит через веса), нейро-контроллер (генерирует оператор M из команды), физический constraint (softmax гарантирует conservation), алгебраический executor (X_new = M @ X без обучаемых параметров). Эксперименты показывают: на группе S₃ нейросеть вывела новый оператор через композицию (M_AC = M_AB @ M_BC @ M_AB) с точностью 99.9999%, никогда не видев его в обучении. Task accuracy падает на OOD, но структурные инварианты (conservation, обратимость, групповые аксиомы) держатся с машинной точностью независимо от масштаба. Ключ — правильная операция композиции: матричное умножение для операторов (работает), векторное сложение для параметров (не работает).

Архитектура семантической нейросети

Для начала уточню понятия символьного (для эстетов символического) и семантического ИИ. Общепринятое название ИИ, оперирующего символами по правилам, это символьный ИИ. Но как я уже говорил, такой ИИ это тупик (нет обобщения, вычислительный коллапс и т.д.). ЛЛМ работает с вероятностными распределениями над токенами (неточность, галлюцинации). Но по сути оба типа это машины синтаксиса, ни тот ни другой не имеет доступа к смыслу как таковому. Поэтому я начал склоняться к тому что гипотетический АГИ будет объединением двух этих вариантов. Его можно назвать нейросимвольным ИИ (это скучно), а лучше семантическим ИИ, что будет более правильно.

Итак, нам нужна архитектура, где непрерывные представления (нейросеть) и дискретные операции (алгебра) работают совместно через общий интерфейс:

  1. Шина Данных (The Data Path) — "Существительные"
    Элемент: Входной вектор состояния X (например, ресурсы [A, B, C]).
    На что влияет: Только на финальный результат вычисления.
    От чего зависит: От начальных условий задачи.
    Ключевая особенность: В наших лучших экспериментах (S3, S4) этот вектор вообще не проходит через веса нейросети. Он течет по отдельному защищенному каналу прямо в алгебраический процессор. Нейросеть не может исказить сами числа, потому что не имеет к ним прямого доступа.

  2. Нейро-Контроллер (The Neural Controller) — "System 1"
    Элемент: Стандартный MLP (Linear -> ReLU -> Linear -> Linear).
    Вход: Только Команда/Контекст (например, вектор [1, 0, 0] для "Swap AB").
    Что делает: Это мозг системы. Он смотрит на задачу и решает, какое правило здесь нужно применить.
    Выход: Сырые логиты (числа от -infinity до +infinity) размерности N x N (например, 3 x 3 или 4 x 4).
    Ключевая особенность: Контроллер не предсказывает ответ. Он предсказывает план действий (сырую матрицу).

  3. Физический шлюз (Physics Constraint Layer) — "Ограничитель"
    Элемент: Функция активации Softmax, применяемая к столбцам (или строкам) сырой матрицы.
    Вход: Сырые логиты от Нейро-Контроллера.
    Что делает: Превращает хаос сырых чисел в стохастическую матрицу M.
    Принудительно делает все элементы >= 0.
    Принудительно делает так, чтобы сумма в каждом столбце была равна ровно 1.0.
    На что влияет: Это ядро безопасности. Именно этот элемент физически контролирует возможность ошибок сети.
    Выход: Итоговая матрица оператора M.

  4. Алгебраический Процессор (The Algebraic Executor) — "System 2"
    Элемент: Операция матричного умножения (в PyTorch это torch.bmm).
    Вход: Итоговая матрица M (от шлюза) и вектор данных X (из шины данных).
    Что делает: Жестко, математически точно, применяет оператор к данным:
    X_new = M * X
    Ключевая особенность: Здесь нет обучаемых параметров. Это чистая математика. Если матрица M сказала "поменяй местами 1 и 2", процессор сделает это с точностью до бита.

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

Классические LLM пытаются угадать готовый ответ по токенам, поэтому неизбежно галлюцинируют на больших числах. В этом подходе нейросеть предсказывает не ответ, а само действие (матрицу оператора). Она лишь переводит логику задачи в точную инструкцию, а саму математику выполняет жесткий детерминированный алгоритм (матричное умножение). ИИ не считает в уме, а направляет вычисления без ошибок и сбоев..

Эксперимент 1: Структурная надежность через архитектуру

Задача: перераспределение между двумя контейнерами.

  • A_new = A - amount

  • B_new = B + amount

Стандартный MLP выучивает задачу в пределах обучающих данных. Но любой шаг за пределы этой области приводит к лавинообразному росту ошибок.

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

  • total = A + B # интеграция

  • alpha = sigmoid(network(amount)) # доля в [0,1]

  • A_new = total * alpha

  • B_new = total * (1 - alpha)

Математическая надежность:

A_new + B_new = total * (alpha + (1-alpha)) = total

Закон сохранения выполняется структурно, не зависит от обучения.

Результаты:

Диапазон

Task MSE

Conservation Error

Train (×1)

0.0004

6e-8

OOD (×10)

688.3

6e-7

OOD (×1000)

1.4e9

0.0

Task accuracy деградирует на OOD. Но инвариант (сумма) сохраняется с машинной точностью независимо от масштаба.

Архитектурные constraints гарантируют инварианты. Penalty loss — нет.

Код эксперимента

Код

import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import random import warnings warnings.filterwarnings("ignore", category=UserWarning) # ── CONFIG ──────────────────────────────────────────────────────────────────── INPUT_DIM = 2 # [A, B] CMD_DIM = 1 # amount (сколько перелить) HIDDEN_DIM = 64 BATCH_SIZE = 64 LR = 0.001 STEPS = 10000 SEED = 42 TRAIN_RANGE = 10.0 TEST_RANGE = 100.0 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # ── ГЕНЕРАТОР ────────────────────────────────────────────────────────────────── class FlowGenerator: def __init__(self, val_range): self.val_range = val_range def get_batch(self, n): # Генерируем положительные числа (объем) state = torch.rand(n, INPUT_DIM) * self.val_range # Amount - сколько перелить (может быть отрицательным) amount = (torch.rand(n, CMD_DIM) * 2 - 1) * (self.val_range / 3) # Целевое состояние target = torch.zeros_like(state) actual_transfer = amount[:, 0].clone() # Физические ограничения mask_A = (state[:, 0] - actual_transfer) < 0 actual_transfer[mask_A] = state[mask_A, 0] mask_B = (state[:, 1] + actual_transfer) < 0 actual_transfer[mask_B] = -state[mask_B, 1] target[:, 0] = state[:, 0] - actual_transfer target[:, 1] = state[:, 1] + actual_transfer return state.to(DEVICE), amount.to(DEVICE), target.to(DEVICE) # ── АРХИТЕКТУРА: HYDRAULIC GATING ─────────────────────────────────────────── class HydraulicNet(nn.Module): def __init__(self): super().__init__() self.controller = nn.Sequential( nn.Linear(INPUT_DIM + CMD_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, 1), nn.Sigmoid() ) def forward(self, state, amount): # Интеграция total_flow = state.sum(dim=1, keepdim=True) # Контроллер решает пропорцию alpha = self.controller(torch.cat([state, amount], dim=1)) # Физическое распределение A_new = total_flow * alpha B_new = total_flow * (1 - alpha) return torch.cat([A_new, B_new], dim=1) # ── ЭКСПЕРИМЕНТ ─────────────────────────────────────────────────────────────── def run_hydraulic_balance(): print(f"HYDRAULIC BALANCE TEST | {DEVICE}") torch.manual_seed(SEED) random.seed(SEED) model = HydraulicNet().to(DEVICE) opt = optim.AdamW(model.parameters(), lr=LR) train_gen = FlowGenerator(TRAIN_RANGE) print(f"\n [Обучение]...") for step in range(1, STEPS+1): model.train() opt.zero_grad() state, amount, target = train_gen.get_batch(BATCH_SIZE) pred = model(state, amount) task_loss = nn.MSELoss()(pred, target) task_loss.backward() opt.step() if step % 2000 == 0: print(f" Step {step}/{STEPS} | Task MSE={task_loss:.5f}") print(f"\n [Тестирование] Проверка на разных масштабах...") test_ranges = [TRAIN_RANGE, TEST_RANGE, TEST_RANGE * 1000] labels = ["Train (x1)", "OOD (x10)", "OOD (x1000)"] model.eval() print(f" {'-'*70}") print(f" {'Range':<15} | {'Task MSE':<12} | {'Conservation Error':<18}") print(f" {'-'*70}") for r, label in zip(test_ranges, labels): test_gen = FlowGenerator(r) state, amount, target = test_gen.get_batch(1000) with torch.no_grad(): pred = model(state, amount) task_err = nn.MSELoss()(pred, target).item() # Проверка закона сохранения sum_input = state.sum(dim=1) sum_output = pred.sum(dim=1) phys_err = (sum_input.double() - sum_output.double()).abs().mean().item() print(f" {label:<15} | {task_err:<12.4f} | {phys_err:<18.2e}") if __name__ == "__main__": run_hydraulic_balance()

Логи кода

Логи

HYDRAULIC BALANCE TEST | cuda

[Обучение]...
Step 2000/10000 | Task MSE=0.00140
Step 4000/10000 | Task MSE=0.00372
Step 6000/10000 | Task MSE=0.00054
Step 8000/10000 | Task MSE=0.00135
Step 10000/10000 | Task MSE=0.00036

[Тестирование] Проверка на разных масштабах...

Range | Task MSE | Conservation Error

Train (x1) | 0.0004 | 6.02e-08
OOD (x10) | 688.3582 | 6.64e-07
OOD (x1000) | 1375917056.0000 | 0.00e+00

Эксперимент 2: Алгебраическая композиция

Задача: Выучить генераторы симметрической группы S₃ и проверить может ли сеть вывести новые операторы через композицию.

Обучение: Только на двух операциях

  • SwapAB: [A,B,C] → [B,A,C]

  • SwapBC: [A,B,C] → [A,C,B]

Zero-Shot тест: Вывести SwapAC через формулу M_AC = M_AB @ M_BC @ M_AB. Сеть НИКОГДА не видела SwapAC в данных.

Архитектура: Сеть генерирует stochastic matrices (column-stochastic через softmax). Гарантирует сохранение массы: sum(M[:,j]) = 1.

Результаты:

  • Обучение (15k шагов): MSE = 8e-8

  • Выученные матрицы: M_AB и M_BC

  • Композиция: M_AC = M_AB @ M_BC @ M_AB

7d099eba302650fb6adcc1efa0ac7b3a.png

Verification: [10,20,30] → [30,20,10]

Error: 9.2e-6

Проверка групповых аксиом:

  1. (AB∘BC)³ = Identity: Error = 1.2e-7 ✓

  2. M @ M^T = I (ортогональность): Error = 0.0 ✓

  3. SwapAB ∘ SwapBC ≠ SwapBC ∘ SwapAB (некоммутативность): Diff = 0.67 ✓

Все матрицы — точные permutation matrices (элементы 0 или 1, нет размытия). Softmax схлопнулся к дискретным решениям.

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

Код эксперимента

Код

import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import numpy as np import random import warnings warnings.filterwarnings("ignore", category=UserWarning) # ── CONFIG ──────────────────────────────────────────────────────────────────── INPUT_DIM = 3 # [A, B, C] CMD_DIM = 2 # Учим ТОЛЬКО 2 генератора: SwapAB (0) и SwapBC (1) HIDDEN_DIM = 64 BATCH_SIZE = 64 LR = 0.001 STEPS = 15000 SEED = 42 TRAIN_RANGE = 10.0 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Атомарные команды (Генераторы группы S3) CMD_SWAP_AB = 0 CMD_SWAP_BC = 1 # ── ГЕНЕРАТОР: УЧИМ ТОЛЬКО БАЗИС ────────────────────────────────────────────── class GeneratorS3_Basis: def __init__(self, val_range): self.val_range = val_range def get_batch(self, n): state = torch.rand(n, INPUT_DIM) * self.val_range # Выбираем ТОЛЬКО 0 или 1. Сеть не знает, что существуют другие операции. cmd_idx = torch.randint(0, CMD_DIM, (n,)) cmd = F.one_hot(cmd_idx, num_classes=CMD_DIM).float() target = torch.zeros_like(state) for i in range(n): s = state[i] c = cmd_idx[i].item() if c == CMD_SWAP_AB: target[i] = torch.tensor([s[1], s[0], s[2]]) elif c == CMD_SWAP_BC: target[i] = torch.tensor([s[0], s[2], s[1]]) return state.to(DEVICE), cmd.to(DEVICE), target.to(DEVICE) # ── АРХИТЕКТУРА: STOCHASTIC OPERATOR NET ────────────────────────────────────── class AlchemyNet(nn.Module): def __init__(self): super().__init__() # Сеть: Команда -> Матрица 3x3 self.controller = nn.Sequential( nn.Linear(CMD_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, INPUT_DIM * INPUT_DIM) ) def forward(self, cmd): # Генерируем оператор raw = self.controller(cmd).view(-1, INPUT_DIM, INPUT_DIM) # Гарантируем физику (сумма столбца = 1) return F.softmax(raw, dim=1) # ── ЭКСПЕРИМЕНТ ─────────────────────────────────────────────────────────────── def run_algebra_proof(): print(f"🔥 S3 GROUP ALGEBRA PROOF | {DEVICE}") print(f" Цель: Вывести SwapAC и Shift через композицию AB и BC.") print(f" Обучение: ТОЛЬКО SwapAB и SwapBC.") torch.manual_seed(SEED) random.seed(SEED) model = AlchemyNet().to(DEVICE) opt = optim.AdamW(model.parameters(), lr=LR) gen = GeneratorS3_Basis(TRAIN_RANGE) print(f"\n [Обучение] Учим генераторы группы...") for step in range(1, STEPS+1): model.train() opt.zero_grad() state, cmd, target = gen.get_batch(BATCH_SIZE) # Получаем матрицу M M = model(cmd) # Применяем: X_new = M @ X pred = torch.bmm(M, state.unsqueeze(2)).squeeze(2) loss = F.mse_loss(pred, target) loss.backward() opt.step() if step % 5000 == 0: print(f" Step {step}/{STEPS} | MSE: {loss.item():.8f}") # ── ФАЗА ДОКАЗАТЕЛЬСТВА (MATH CHECK) ── print(f"\n [Доказательство] Извлекаем матрицы и проверяем аксиомы S3...") model.eval() with torch.no_grad(): # 1. Извлекаем выученные кирпичики c_AB = torch.tensor([[1., 0.]]).to(DEVICE) c_BC = torch.tensor([[0., 1.]]).to(DEVICE) M_AB = model(c_AB)[0] M_BC = model(c_BC)[0] I = torch.eye(3).to(DEVICE) print(f" Matrix AB (Learned):\n{M_AB.cpu().numpy().round(2)}") print(f" Matrix BC (Learned):\n{M_BC.cpu().numpy().round(2)}") # 2. ПРОВЕРКА 1: Group Presentation (ab)^3 = I # Произведение (AB * BC) должно давать сдвиг. # Сдвиг в кубе должен давать Identity. M_Shift = M_AB @ M_BC M_Identity_Check = M_Shift @ M_Shift @ M_Shift err_id = F.mse_loss(M_Identity_Check, I).item() print(f"\n 🔹 Axiom Check: (AB * BC)^3 == I") print(f" Error: {err_id:.8f}") if err_id < 1e-4: print(" ✅ АКСИОМА ВЫПОЛНЕНА (Цикличность работает)") else: print(" ❌ АКСИОМА НАРУШЕНА") # 3. ПРОВЕРКА 2: Derivation of SwapAC (Conjugation) # Теория групп: AC = AB * BC * AB # Сеть НИКОГДА не видела AC. Если это сработает — это магия алгебры. M_AC_Derived = M_AB @ M_BC @ M_AB print(f"\n 🔹 Derivation Check: AC = AB * BC * AB") print(f" Derived Matrix AC:\n{M_AC_Derived.cpu().numpy().round(2)}") # Тестируем этот ВЫВЕДЕННЫЙ оператор на данных # Вход: [10, 20, 30] -> Ожидание AC: [30, 20, 10] vec_in = torch.tensor([[10., 20., 30.]]).to(DEVICE).T vec_out = M_AC_Derived @ vec_in vec_target = torch.tensor([[30., 20., 10.]]).to(DEVICE).T err_ac = F.mse_loss(vec_out, vec_target).item() print(f" Data Test ([10,20,30] -> [30,20,10]):") print(f" Result: {vec_out.flatten().cpu().numpy()}") print(f" Error: {err_ac:.8f}") if err_ac < 1e-4: print("\n 🏆 CRITICAL SUCCESS: Сеть вывела оператор AC из базиса!") else: print("\n ❌ FAILED: Композиция не дала AC.") if __name__ == "__main__": run_algebra_proof()

Логи кода

Логи

S3 GROUP ALGEBRA PROOF | cuda
Цель: Вывести SwapAC и Shift через композицию AB и BC.
Обучение: ТОЛЬКО SwapAB и SwapBC.

[Обучение] Учим генераторы группы...
Step 5000/15000 | MSE: 0.00002016
Step 10000/15000 | MSE: 0.00000131
Step 15000/15000 | MSE: 0.00000008

[Доказательство] Извлекаем матрицы и проверяем аксиомы S3...
Matrix AB (Learned):
[[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]]
Matrix BC (Learned):
[[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]

🔹 Axiom Check: (AB * BC)^3 == I
Error: 0.00000012
✅ АКСИОМА ВЫПОЛНЕНА (Цикличность работает)

🔹 Derivation Check: AC = AB BC AB
Derived Matrix AC:
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]
Data Test ([10,20,30] -> [30,20,10]):
Result: [29.996683 19.999294 10.004023]
Error: 0.00000923

🏆CRITICAL SUCCESS: Сеть вывела оператор AC из базиса!

Почему это работает

1. Правильная операция композиции

Успех (operator algebra, 99.9999% на Zero-Shot):

M_composed = M_AB @ M_BC // матричное умножение

Для операторов правильная композиция — это умножение, не сложение.

2. Дискретная топология

Перестановки — это биекции. Информация не теряется. Softmax на задаче с дискретными решениями естественно схлопывается к one-hot:

Начало обучения: [0.35, 0.42, 0.23] (размыто)

Конец обучения: [0.00, 1.00, 0.00] (дискретно)

Loss surface имеет минимумы в вершинах симплекса. Градиенты толкают туда.

3. Замкнутая алгебра

Permutation @ Permutation = Permutation

Композиция остаётся в том же классе → нет drift, нет накопления ошибок.

Эксперимент 3: Масштабирование: От S₃ к S₄

Работает ли метод на больших группах?

S₄ — симметрическая группа 4 элементов:

  • 24 элемента (против 6 в S₃)

  • Генерируется тремя транспозициями: SwapAB, SwapBC, SwapCD

Новые проверки

1. Disjoint Commutativity

Операции на непересекающихся множествах должны коммутировать:

SwapAB действует на {0,1}

SwapCD действует на {2,3}

Непересекающиеся → должны коммутировать

Тест:

M_AB @ M_CD = M_CD @ M_AB ?

Результат: Error = 0.00000000

Сеть понимает локальность. Операции на разных элементах независимы.

2. Recursive Derivation

Вывести SwapAD (обмен крайних элементов) через цепочку композиций:

Step 1: Derive SwapAC = SwapAB @ SwapBC @ SwapAB

Step 2: Derive SwapAD = SwapAC @ SwapCD @ SwapAC

Это цепочка длины 5: пять матричных умножений для получения оператора который сеть никогда не видела.

Результат:

Input: [10, 20, 30, 40]

Output: [39.998, 20.001, 29.999, 10.002]

Target: [40, 20, 30, 10]

Error: 2.67e-6

Сеть вывела оператор через двухуровневую рекурсию с машинной точностью.

Выводы по масштабированию

Группа

Размер

Генераторы

Composable?

Max Chain

Error

Z₃

3

1 (shift)

3 (f³=id)

<1e-7

S₃

6

2 (AB, BC)

3 (AC derivation)

<1e-5

S₄

24

3 (AB, BC, CD)

5 (AD derivation)

<1e-6

Паттерн:

  1. Дискретность сохраняется (матрицы остаются 0/1)

  2. Композиция работает на произвольной глубине

  3. Локальность операций детектируется автоматически (коммутативность disjoint sets)

Ограничение: Computational cost растёт как O(n²) для хранения матриц n×n. Для S₁₀ (3,628,800 элементов) потребуются другие представления (например, sparse matrices или factored форма).

Код эксперимента

Код

import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import numpy as np import random import warnings import matplotlib.pyplot as plt import seaborn as sns warnings.filterwarnings("ignore", category=UserWarning) # ── CONFIG ──────────────────────────────────────────────────────────────────── INPUT_DIM = 4 # [A, B, C, D] CMD_DIM = 3 # Три генератора: SwapAB, SwapBC, SwapCD HIDDEN_DIM = 128 # Чуть шире, так как группа сложнее (24 элемента) BATCH_SIZE = 64 LR = 0.001 STEPS = 20000 SEED = 42 TRAIN_RANGE = 10.0 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Генераторы S4 CMD_SWAP_AB = 0 CMD_SWAP_BC = 1 CMD_SWAP_CD = 2 # ── ГЕНЕРАТОР: S4 BASIS ─────────────────────────────────────────────────────── class GeneratorS4: def __init__(self, val_range): self.val_range = val_range def get_batch(self, n): state = torch.rand(n, INPUT_DIM) * self.val_range cmd_idx = torch.randint(0, CMD_DIM, (n,)) cmd = F.one_hot(cmd_idx, num_classes=CMD_DIM).float() target = torch.zeros_like(state) for i in range(n): s = state[i] c = cmd_idx[i].item() if c == CMD_SWAP_AB: target[i] = torch.tensor([s[1], s[0], s[2], s[3]]) elif c == CMD_SWAP_BC: target[i] = torch.tensor([s[0], s[2], s[1], s[3]]) elif c == CMD_SWAP_CD: target[i] = torch.tensor([s[0], s[1], s[3], s[2]]) return state.to(DEVICE), cmd.to(DEVICE), target.to(DEVICE) # ── АРХИТЕКТУРА (ТА ЖЕ) ─────────────────────────────────────────────────────── class AlchemyNet(nn.Module): def __init__(self): super().__init__() self.controller = nn.Sequential( nn.Linear(CMD_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, HIDDEN_DIM), nn.ReLU(), nn.Linear(HIDDEN_DIM, INPUT_DIM * INPUT_DIM) ) def forward(self, cmd): raw = self.controller(cmd).view(-1, INPUT_DIM, INPUT_DIM) return F.softmax(raw, dim=1) # ── ЭКСПЕРИМЕНТ ─────────────────────────────────────────────────────────────── def run_s4_experiment(): print(f"🌌 S4 HYPERCUBE ALGEBRA (4x4) | {DEVICE}") print(f" Цель: Проверить коммутативность независимых операций (AB vs CD).") torch.manual_seed(SEED) random.seed(SEED) model = AlchemyNet().to(DEVICE) opt = optim.AdamW(model.parameters(), lr=LR) gen = GeneratorS4(TRAIN_RANGE) print(f"\n [Обучение] Учим AB, BC, CD...") for step in range(1, STEPS+1): model.train() opt.zero_grad() state, cmd, target = gen.get_batch(BATCH_SIZE) M = model(cmd) pred = torch.bmm(M, state.unsqueeze(2)).squeeze(2) loss = F.mse_loss(pred, target) loss.backward() opt.step() if step % 5000 == 0: print(f" Step {step}/{STEPS} | MSE: {loss.item():.8f}") # ── ANALYTICS ── print(f"\n [Анализ] Извлекаем матрицы 4x4...") model.eval() with torch.no_grad(): c0 = torch.tensor([[1., 0., 0.]]).to(DEVICE) # AB c1 = torch.tensor([[0., 1., 0.]]).to(DEVICE) # BC c2 = torch.tensor([[0., 0., 1.]]).to(DEVICE) # CD M_AB = model(c0)[0] M_BC = model(c1)[0] M_CD = model(c2)[0] I = torch.eye(4).to(DEVICE) # 1. ТЕСТ НА КОММУТАТИВНОСТЬ (Disjoint Sets) # AB меняет (0,1), CD меняет (2,3). Они не пересекаются. # Значит: AB * CD должно быть равно CD * AB. Commute_1 = M_AB @ M_CD Commute_2 = M_CD @ M_AB err_commute = F.mse_loss(Commute_1, Commute_2).item() print(f"\n 1. Disjoint Commutativity (AB * CD == CD * AB)") print(f" Error: {err_commute:.8f}") if err_commute < 1e-5: print(" ✅ SUCCESS: Сеть понимает локальность операций!") else: print(" ❌ FAIL: Операции 'спутываются'.") # 2. ТЕСТ НА "LONG JUMP" (Swap AD) # Как поменять 1-й и 4-й элементы, имея только соседние? # SwapAD = Swap(A,C) * Swap(C,D) * Swap(A,C) ... сложно. # Проще: "Протащить пузырьком". # SwapAD = (CD * BC * AB) * (BC * CD) ... нет, это сдвиг. # Формула сопряжения: # Swap(0,3) = Swap(0,2) * Swap(2,3) * Swap(0,2) # Swap(0,2) = Swap(0,1) * Swap(1,2) * Swap(0,1) # Итого: AD выводится через вложенность 3-го уровня! # Сначала получим AC M_AC = M_AB @ M_BC @ M_AB # Теперь получим AD используя AC и CD M_AD_Derived = M_AC @ M_CD @ M_AC # Тестовый вектор [10, 20, 30, 40] -> [40, 20, 30, 10] vec_in = torch.tensor([[10., 20., 30., 40.]]).to(DEVICE).T vec_out = M_AD_Derived @ vec_in vec_target = torch.tensor([[40., 20., 30., 10.]]).to(DEVICE).T err_ad = F.mse_loss(vec_out, vec_target).item() print(f"\n 2. Long Jump Derivation (Swap A <-> D)") print(f" Derived via recursive conjugation: AC = AB*BC*AB -> AD = AC*CD*AC") print(f" Input: {vec_in.flatten().cpu().numpy()}") print(f" Output: {vec_out.flatten().cpu().numpy()}") print(f" Error: {err_ad:.8f}") if err_ad < 1e-4: print(" ✅ SUCCESS: Сеть построила цепочку длиной 5!") else: print(" ❌ FAIL: Слишком сложно.") # Отрисовка plot_s4_matrices(M_AB, M_CD, Commute_1) def plot_s4_matrices(M1, M2, M3): fig, axes = plt.subplots(1, 3, figsize=(14, 4)) list_m = [(M1, "Swap AB"), (M2, "Swap CD"), (M3, "AB * CD\n(Parallel Swap)")] for i, (M, title) in enumerate(list_m): sns.heatmap(M.detach().cpu().numpy(), annot=True, fmt=".1f", cmap="Greens", ax=axes[i], cbar=False, square=True, vmin=0, vmax=1, linewidths=1, linecolor='black') axes[i].set_title(title) axes[i].axis('off') plt.tight_layout() plt.savefig('s4_hypercube.png') print("\n 📸 Матрицы S4 сохранены в 's4_hypercube.png'") if __name__ == "__main__": run_s4_experiment()

Логи кода

Логи

🌌 S4 HYPERCUBE ALGEBRA (4x4) | cuda
Цель: Проверить коммутативность независимых операций (AB vs CD).

[Обучение] Учим AB, BC, CD...
Step 5000/20000 | MSE: 0.00000854
Step 10000/20000 | MSE: 0.00000043
Step 15000/20000 | MSE: 0.00000004
Step 20000/20000 | MSE: 0.00000000

[Анализ] Извлекаем матрицы 4x4...

  1. Disjoint Commutativity (AB CD == CD AB)
    Error: 0.00000000
    ✅ SUCCESS: Сеть понимает локальность операций!

  2. Long Jump Derivation (Swap A <-> D)
    Derived via recursive conjugation: AC = ABBCAB -> AD = ACCDAC
    Input: [10. 20. 30. 40.]
    Output: [39.99779 20.000546 29.999397 10.002266]
    Error: 0.00000267
    ✅ SUCCESS: Сеть построила цепочку длиной 5!

📸 Матрицы S4 сохранены в 's4_hypercube.png'

f641816546c0890b118574362ea8c9ee.png

Что это значит для архитектуры AI систем

Перспективы внедрения SPU-архитектуры (Semantic Processing Unit):

  1. Детерминированность вычислений (устранение галлюцинаций OOD). Разделение семантического парсинга и арифметических операций гарантирует 100% точность вычислений. Нейросеть генерирует только алгоритм преобразования (оператор перестановки или распределения), а его исполнение делегируется аппаратному матричному умножению. Точность результата становится независимой от масштаба входных значений (Out-of-Distribution).

  2. Структурная безопасность и сохранение инвариантов (Hard Constraints). Применение нормирующих функций активации (например, Softmax по столбцам) для формирования матриц трансформации накладывает жесткие ограничения на выходной оператор (формируя стохастические матрицы). Это на уровне архитектуры графа вычислений запрещает модели нарушать законы сохранения (баланса) — генерация "избыточных" значений или бесследная потеря данных математически невозможны.

  3. Радикальная оптимизация параметров (Data Efficiency & Zero-Shot Composition). Вместо аппроксимации бесконечного пространства ответов (что требует экспоненциального роста параметров), сеть обучается ограниченному базису генераторов группы (как продемонстрировано на группе перестановок S_3). Сложные многоэтапные операции синтезируются через алгебраическую композицию матриц базовых операторов. Это позволяет решать сложные логические задачи компактными моделями.

  4. Абсолютная интерпретируемость (White-box AI).
    Логика принятия решений перестает быть скрытой в весах (hidden states). Финальным выходом нейро-контроллера является явная разреженная матрица трансформации. Этот оператор можно извлечь, программно проанализировать и провалидировать до момента применения к реальным данным (например, верифицировать конкретные индексы маршрутизации данных), что делает систему полностью аудируемой.

Границы метода

Работает для:

  • Топологические операции (перестановки, симметрии)

  • Физические инварианты (сохранение массы, энергии)

  • Дискретные группы (S_n, Z_n, диэдральные)

Не работает для (требует дальнейших исследований):

  • Символьной логики (if-then-else)

  • Произвольной арифметики (сложение дробей)

  • Непрерывных групп без finite presentation

Выводы

Описанная в статье архитектура подтверждает философский тезис: управление инвариантами требует их именования. Система может неявно использовать закон (conservation через softmax), но чтобы рассуждать о законе (композировать, верифицировать), закон должен быть токенизирован — представлен как отдельный символ в вычислительном графе.

Это решает Symbol Grounding Problem для семантических систем: символы (команды) заземляются в операторах (матрицах), которые имеют наблюдаемые эффекты (трансформации данных). Связь symbol↔operator↔effect обеспечивает семантику.

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

Биологический мозг эволюционировал для распознавания паттернов и интуитивной физики, а не для символьной арифметики. Дети учат математику через заучивание фактов и культурные инструменты (абак, алгоритмы). Нейросети имеют те же ограничения. Но если встроить правильные структурные constraints и использовать правильные операции композиции, нейросети могут работать как точные вычислители — не через счёт, а через алгебру.

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.

Быстрое чтение

Еще

Цена Conway Research (CONWAY) в сравнении с ценой Bitcoin (BTC) дает инвесторам четкое представление о том, как этот развивающийся мемкоин соотносится с крупнейшей криптовалютой. Поскольку BTC остается эталоном крипторынка, анализ динамики цен CONWAY vs BTC выявляет относительную силу, волатильность и возможности для трейдеров, ищущих прогнозы цены Conway Research и данные для сравнения цен Bitcoin.

Сравнение цены Conway Research (CONWAY) с ценой Ethereum (ETH) предлагает ценную перспективу для трейдеров и инвесторов. Поскольку ETH является второй по величине криптовалютой по рыночной капитализации и краеугольным камнем децентрализованных финансов, анализ его производительности по сравнению с CONWAY помогает выявить как конкурентные преимущества, так и потенциальные возможности роста.