Sparse Event-Memory LM 仕様書
目的と範囲
SparseEventMemoryLM は、GPU常駐のAdam状態を増やさずに状態空間と物理シナプス数を拡張するための、EvoSpikeNetの分離された言語モデルです。既存のSpikingEvoTextLM、ChronoSpikeAttention、SpikingFFNを置換・変更しません。学習時に--architecture sparse_event_memoryを明示した場合だけ選択されます。
本仕様は EvoSpikeNet-Core/evospikenet/sparse_event_memory.py と EvoSpikeNet-Core/examples/train_spiking_evospikenet_lm.py の実装に対応します。
構成
- 因子化・共有語彙層
TiedFactorizedVocabulary - 各トークンは固定INT8
codebookと学習可能な共有basisで表現されます。 - 入力埋め込みと出力射影は同じ
basisとコードブックを共有します。 - 学習では正解トークンを必ず含む候補集合だけへ射影するsampled softmaxを使います。
-
forward()は推論・厳密評価用に全語彙logitsを生成します。これは語彙サイズに比例する出力を確保します。 -
疎イベント専門家
EventMemoryExpert - 入力・再帰結合は
EventCSRLayerです。 - 膜電位はINT16、発火は閾値比較、リークは整数演算で更新されます。
-
順伝播の離散イベントには、アダプタとルータへ勾配を流すstraight-through surrogateを併用します。
-
Top-kルータ
SparseEventMemoryBlock - 系列平均から各バッチ系列の専門家を選びます。
-
選択された専門家だけを実行します。Top-1ではsigmoidゲート、Top-kではsoftmax重みを使います。
-
局所可塑性
- optimizerの更新成功後、
apply_local_plasticity()が記録済みのpre/post平均活動を用いてINT8値をin-placeで更新します。 - 主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も加算されるため、このレポートだけを容量保証に使ってはいけません。
学習経路
- トークンIDを共有因子語彙層で埋め込みへ変換します。
- 各ブロックでルータが専門家を選択し、選択専門家が時刻順に疎イベント状態を更新します。
sampled_cross_entropy()が正解語とランダム負例の候補語彙損失を計算します。- Adamは基底・ルータ・アダプタ・正規化だけを更新します。
apply_local_plasticity()が主CSRシナプスを局所更新します。
学習スクリプトはこの順序を実装しており、疎モデルではMetaSTDPとAEGを生成しません。--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は、wikipedia、aozora、file、huggingface_japanese_wikipedia、mineral_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曲線を測定してください。