Skip to content

0.3.0: full Riemannian Adam + audit fixes (C1-C5, A1-A4, H1-H4) - #1

Merged
Assistentus merged 2 commits into
mainfrom
fix/audit-0.3.0
Nov 4, 2026
Merged

Assistentus merged 2 commits into
mainfrom
fix/audit-0.3.0

Conversation

@Assistentus

Copy link
Copy Markdown
Owner

Что сделано

Это релиз 0.3.0: гиперболический режим (k > 0) теперь является настоящим Riemannian Adam, а не Adam в ambient-координатах с масштабированием градиента и клипом.

Математика

  • grad_R = lambda(w)^-2 g_E, lambda(w) = 2 / (1 - k||w||^2).
  • Моменты Адама живут в касательном пространстве; первый момент переносится параллельным переносом после каждого шага.
  • Шаг — экспоненциальное отображение exp_w(-lr * m_hat / (sqrt(v_hat) + eps)), а не евклидово вычитание.
  • Второй момент — неотрицательный диагональный масштаб; переносится sqrt(v) и возводится обратно в квадрат, потому что прямой перенос v может дать отрицательные компоненты и NaN.
  • Математика батча считается в float64 (хранение остаётся float32): вблизи границы шара формулы гайрации теряют точность в float32.
  • k = 0 — обычный евклидов Adam.

Закрытые находки аудита

  • C1: legacy 0.1.0/0.2.0 — resume=False переинициализирует даже частичный каталог; resume=True мигрирует (веса сохраняются, несовместимые моменты/счётчики сбрасываются).
  • C2: export_checkpoint(dir) / import_checkpoint(dir) — переносимый каталог с относительными именами, размерами и SHA-256; импорт проверяет всё до замены живого состояния.
  • C3: исходные тензоры не удерживаются (retain_params=False по умолчанию), param_groups получает zero-length placeholders.
  • C4: weight_decay_mode: l2 (по умолчанию, часть риманова градиента) и decoupled (AdamW-семантика при k=0).
  • C5: setup.py удалён, единственный источник метаданных — pyproject.toml; torch>=2.0.0.
  • A1: shutdown() — retryable state machine RUNNING → DRAINING → STOPPED / FAILED; повторный вызов после таймаута не врёт про успех.
  • A2: global_step сохраняется в dsa_global_meta.json и чекпоинтах.
  • A3: отрицательные/выходящие за границы/нецелые/2-D индексы отклоняются.
  • A4: не-конечная строка полностью сбрасывается (w=m=v=0, t=0), включая отрицательную дисперсию; строка с t=0 не подхватывает старые моменты.
  • A9: форма и конечность градиента проверяются.
  • H1: инициализация масштабируется внутрь шара (по умолчанию до 0.5 радиуса), resume/read_rows проецируют; чекпоинт сразу после инициализации валиден.
  • H2: независимый float64-эталон и проверки свойств геометрии (exp map, изометрия переноса, log-exp).
  • H3: set_curvature / current_k перепроецируют всю таблицу.
  • H4: k = NaN/inf/negative отклоняется сразу.

Тесты

CUDA_VISIBLE_DEVICES="" python -m pytest -q
95 passed

Проверено также сравнение с независимым float64-эталоном на 20 шагах: расхождение w ≤ 1.1e-7, m ≤ 2.6e-8, v ≤ 8.7e-10 для k ∈ {0, 0.7} и обоих режимов weight decay.

Ломающие изменения

  • resume по умолчанию None (нужно явно True/False).
  • Чекпоинты — каталоги, а не JSON-манифесты.
  • Формат состояния v2; старые каталоги мигрируются только при resume=True.
  • weight_decay для k>0 имеет другую семантику (по умолчанию — риманов L2).
  • Исходные тензоры освобождаются; для весов — read_rows().
  • Динамика гиперболического обучения отличается от 0.2.0.

Подробности — в CHANGELOG.md и README.md.

- Implement tangent-space Riemannian Adam: Riemannian gradient,
  exponential map, parallel transport; float64 batch math for stability.
- Fix C1-C5, A1-A4/A9, H1-H4 from the audit: legacy state migration,
  portable checksummed checkpoints, source-tensor release, explicit
  weight-decay modes, single metadata source, retryable shutdown,
  global-step persistence, index/gradient validation, NaN-row reset,
  ball invariant on init/resume, curvature reprojection, k validation.
- Add independent float64 reference and geometric property tests.
- Update README, CHANGELOG, packaging (remove setup.py), CI matrix.
- Add hard-coded golden values generated with geoopt's stereographic
  Poincare math (external oracle, not another local formula).
- Cover Euclidean branches, is_in_ball, constructor validation, corrupt
  meta/global meta, sparse gradients, numpy inputs, writer timeouts.
- Validate global_step in the global metadata.
@Assistentus
Assistentus merged commit 906991f into main Nov 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant