mirror of
https://github.com/ruvnet/RuView.git
synced 2026-10-19 05:10:13 -05:00
scripts/train-ruvllm.js ran two separate computations during contrastive pretraining: ContrastiveTrainer.train() (a baseline pass that computes loss but never updates the encoder) and a hand-written loop that actually applies gradient updates to encoder.w2. The exported training-metrics.json took lossHistory and contrastive.durationMs from the first (no-op) pass instead of the second (real) one, so the published curve was flat/meaningless (~0.1352 for all 20 epochs) and the duration was ~30x too short. This did not affect finalLoss/improvement or the held-out temporal-triplet accuracy metric published for this model on HuggingFace (ruvnet/wifi-densepose-pretrained) -- those already came from the real loop. It only affected the diagnostic curve/duration anyone auditing convergence from the published JSON would see. Also: config.json's training.steps field (epochs * triplets, technically consistent but reads like an optimizer-step count) is now reported as separate epochs/tripletUpdatesPerEpoch fields, and the exported version bumped 1.0.0 -> 2.0.1 to match the "v2" naming already used elsewhere for this file set. Verified by re-running against the real capture (data/recordings/overnight-1775217646.csi.jsonl): lossHistory now shows a genuine decreasing curve (0.1037 -> 0.0654 across 20 epochs, matching the already-published finalLoss exactly), durationMs reports the real ~40s gradient-loop time instead of ~12s. Model card updated with the same disclosure (docs/huggingface/MODEL_CARD.md) plus a real, previously-undisclosed EWC forgetting-rate figure (32.97%, present in training-metrics.json but not surfaced in the human-readable card) and a corrected repro-script pointer.