コンテンツにスキップ

Sparse Event-Memory LM 仕様書

目的と範囲

SparseEventMemoryLM は、GPU常駐のAdam状態を増やさずに状態空間と物理シナプス数を拡張するための、EvoSpikeNetの分離された言語モデルです。既存のSpikingEvoTextLMChronoSpikeAttentionSpikingFFNを置換・変更しません。学習時に--architecture sparse_event_memoryを明示した場合だけ選択されます。

本仕様は EvoSpikeNet-Core/evospikenet/sparse_event_memory.pyEvoSpikeNet-Core/examples/train_spiking_evospikenet_lm.py の実装に対応します。

構成

  1. 因子化・共有語彙層 TiedFactorizedVocabulary
  2. 各トークンは固定INT8 codebook と学習可能な共有basisで表現されます。
  3. 入力埋め込みと出力射影は同じbasisとコードブックを共有します。
  4. 学習では正解トークンを必ず含む候補集合だけへ射影するsampled softmaxを使います。
  5. forward()は推論・厳密評価用に全語彙logitsを生成します。これは語彙サイズに比例する出力を確保します。

  6. 疎イベント専門家 EventMemoryExpert

  7. 入力・再帰結合はEventCSRLayerです。
  8. 膜電位はINT16、発火は閾値比較、リークは整数演算で更新されます。
  9. 順伝播の離散イベントには、アダプタとルータへ勾配を流すstraight-through surrogateを併用します。

  10. Top-kルータ SparseEventMemoryBlock

  11. 系列平均から各バッチ系列の専門家を選びます。
  12. 選択された専門家だけを実行します。Top-1ではsigmoidゲート、Top-kではsoftmax重みを使います。

  13. 局所可塑性

  14. optimizerの更新成功後、apply_local_plasticity()が記録済みのpre/post平均活動を用いてINT8値をin-placeで更新します。
  15. 主CSR重みはnn.Parameterではないため、勾配・Adamの一次/二次モーメントを持ちません。

メモリモデル

領域 形式 更新方法 Adam状態
CSR接続の値 INT8 buffer 局所Hebbian更新 なし
CSRの行/列インデックス INT64 buffer 固定 なし
語彙コード INT8 buffer 固定 なし
共有語彙基底 浮動小数パラメータ Adam あり
ルータ、低ランクアダプタ、LayerNorm 浮動小数パラメータ Adam あり
膜電位 INT16一時状態 各系列で初期化 なし

CSRの物理接続数は概ね \(\rho D^2\) です。\(D\) は状態次元、\(\rho\)--sparse-connectivityです。これにより密な\(D \times D\)学習行列とそのAdam状態を主経路から除外します。ただし接続インデックス、INT8重み、アダプタ、語彙基底は依然としてメモリを使用します。総パラメータ数を増やしてもGPUメモリが不変になるわけではありません。

memory_report() は、学習可能パラメータ数、固定CSR結線数、CSR保持バイト数、語彙コードの保持バイト数を返します。ピークVRAMにはアクティベーション、sparse kernelの作業領域、optimizer状態、候補語彙logitsも加算されるため、このレポートだけを容量保証に使ってはいけません。

学習経路

  1. トークンIDを共有因子語彙層で埋め込みへ変換します。
  2. 各ブロックでルータが専門家を選択し、選択専門家が時刻順に疎イベント状態を更新します。
  3. sampled_cross_entropy() が正解語とランダム負例の候補語彙損失を計算します。
  4. Adamは基底・ルータ・アダプタ・正規化だけを更新します。
  5. apply_local_plasticity() が主CSRシナプスを局所更新します。

学習スクリプトはこの順序を実装しており、疎モデルではMetaSTDPAEGを生成しません。--ssl-task reconstructionはこのアーキテクチャでは未対応です。

CLI

cd EvoSpikeNet-Core
DEVICE=cuda \
EVOSPIKENET_TRAIN_LOG_INTERVAL=10 \
python examples/train_spiking_evospikenet_lm.py \
   --source file \
   --file-path data/corpus/train_corpus.txt \
  --architecture sparse_event_memory \
  --d-model 2048 \
  --num-blocks 12 \
  --sparse-connectivity 0.005 \
  --sparse-factor-rank 128 \
  --sparse-num-experts 2 \
  --sparse-router-top-k 1 \
  --sparse-adapter-rank 16 \
  --sampled-negatives 1024 \
  --run-name sparse_event_memory_ja

主な設定は以下です。

引数 既定値 意味
--architecture dense_chronospike sparse_event_memoryで本モデルを選択
--sparse-connectivity 0.005 各CSR行の接続密度
--sparse-factor-rank 128 共有語彙基底のrank
--sparse-num-experts 2 ブロックごとの専門家数
--sparse-router-top-k 1 系列ごとに実行する専門家数
--sparse-adapter-rank 16 Adamで学習するアダプタrank
--sparse-plasticity-lr 0.001 INT8主シナプスの局所更新率
--sampled-negatives 1024 sampled softmaxのランダム負例数

SparseEventMemoryLMは、wikipediaaozorafilehuggingface_japanese_wikipediamineral_exploration_fileを含む学習スクリプトの対応テキストソースで利用できます。現在の学習スクリプト既定ソースは利便性のためfuture_apps/mineral_exploration/data/corpus/wiki2_ja_corpus.txtを指しますが、これはモデル適用範囲をMineral Explorationへ限定する意味ではありません。既定トークナイザーはcl-tohoku/bert-base-japanese-v3です。--lang jaかつRAG日本語前処理を有効にする場合はSudachiPyとSudachi辞書が必要です。ストリーミング学習では、huggingface_japanese_wikipedia の各チャンクに対して日本語前処理が既定で適用されます。無効化したい場合は EVOSPIKENET_STREAM_JA_PREPROCESS=0、一般経路のみ無効化したい場合は EVOSPIKENET_USE_RAG_JA_PREPROCESS=0 を指定します。

保存と再開

保存されるconfig.jsonにはarchitecture: sparse_event_memoryと疎モデルの設定が含まれます。--base-model-pathで再開すると、保存済みのアーキテクチャ種別と疎設定が復元されます。密モデルのcheckpointと互換ではありません。

検証済み事項と制約

  • 単体テストは、INT8 CSR値がoptimizer parameterではないこと、入力勾配、局所更新、因子化語彙、sampled loss、メモリ報告を確認します。
  • CPUで、日本語トークナイザーとローカル日本語コーパスを用いた1ステップ学習スモークを確認済みです。これは収束や言語品質の証明ではありません。
  • PyTorchのCSRサポートはbetaです。GPU上の速度・ピークメモリ・カーネル対応はPyTorch/CUDAの組み合わせに依存します。
  • 全語彙forward()、大きいTop-k、過大なfactor_rank、接続率、専門家数はVRAMを増加させます。実運用前に対象GPUでピークメモリとloss曲線を測定してください。

関連