# LoopedQwen + GraphEngram 設計書 ## 1. 目的と現在地 日本語・英語の文書から共有グラフ記憶を構築し、GNNでノード表現を更新して、LoopedQwenの内部隠れ状態へ融合する実験モデル。 目標は、モデル本体を全面更新せずに知識参照能力を拡張すること。グラフ構築は非勾配処理、ノード表現・グラフ注意・融合は勾配学習として分離する。 **現在は研究用プロトタイプである。** FineWeb系の文章予測損失は改善したが、日本語・英語会話、数学、コード生成の実用的な能力改善は確認できていない。Engramより高速な学習、1B/1T文脈、128B級能力、圧縮の優位性は実証していない。 本書の「GraphEngram」は独自機構の仮称。DeepSeek公式Engramの別名でも、公式実装をGNNへ置換した完全互換モデルでもない。 ## 2. モデル構成 ```text 入力トークン ─────────────────────────────────────┐ │ │ ├─ 完全一致の2/3-gramルータ ─ 候補ノード ─ 隣接ノード取得 │ │ ▼ ▼ トークン埋め込み 学習可能なノード埋め込み │ │ │ 実際の隣接エッジ上の1-hop GAT │ │ ├─ 外部グループ0の直前 ◀─ 隠れ状態をQueryとするMemory Attention │ +学習可能な残差ゲート ▼ Looped GDN:6外部グループ × 各4内部反復 = 実効24ステップ │ ├─ 外部グループ3の直前 ◀─ 別パラメーターのGNN記憶モジュール ▼ 最終正規化 → LM Head → 次トークン分布 ``` ### 2.1 基盤モデル - HFモデル:`summerMC/Looped-Qwen-pre` - 固定リビジョン:`eaa834598f3e6b479d1f72b51b6933422b9b8a9c` - 隠れ次元:2048 - グループ:6 - 内部反復:`[4, 4, 4, 4, 4, 4]` - 共有GDNブロック、反復別LoRA・ゲートを持つ。 - グラフ学習中は基盤を凍結する。 - 現在の実験は未改造のHFモデルそのものではない。先行する24反復アダプター学習と、64件の合成指示データによる修復アダプターを適用した基盤を使う。 128反復版は試作したが、短問生成が崩れたため現行系には採用していない。反復数はパラメーター数や推論能力と等価ではない。 ### 2.2 グラフ記憶 実装:`graph_model.py / TokenGraph` - 文書内を最大64トークンの断片へ分割。 - トークン列のSHA-256で同一断片を共有ノード化。 - 同じ文書内の連続断片間に双方向エッジを付与。 - 別文書の境界には連続エッジを作らない。 - 同一ノードが複数文書に現れることで、その周囲の文脈が共有ノードを通じて接続される。 - 容量上限で断片をスキップした場合、その前後を連続していたようにつながない。 - ID 0は未取得を表すnullノード。 - 各ノードの2/3-gramを索引化。各gramの直接参照先は最大4ノード。 **制約:** 同一トークン列だけを共有しており、意味的な言い換えの統合ではない。これは圧縮表現の候補であって、索引・エッジ・学習重み込みの容量削減は未測定。現行モデル用エクスポートは元文書の参照順序を完全保存する形式ではなく、元データセット全体を損失なく復元できるとは主張しない。 原文完全復元用の別試作は`graph_memory.py`。SQLiteで文書の順序付き参照を保存するが、モデル用`TokenGraph`への統合は未実施。 ### 2.3 候補取得 位置tの入力トークンだけを使い、直近3-gram・2-gramから候補を取得する。 1. gramに対応する直接ノードを列挙。 2. 各直接ノードの隣接ノードを最大2個追加。 3. 重複を除去し、最大8候補へ制限。 4. 不足部分をnullノードで埋める。 ルータは固定・非微分。意味検索、学習可能なルーティング、質問全文に対する最適検索は未実装。将来トークンを参照してルーティングしない。 現行経路はPython辞書・CPU処理を含む。GPUへ入力を戻す転送もあり、高速実装として最適化済みではない。 ### 2.4 GNN:隣接エッジに沿ったGraph Attention 実装:`GraphMemoryAttention` 候補ノードvに対して、明示された隣接ノードN(v)を取得する。隣接次数は最大8に制限し、現在はID順に選ぶ。 ```text z_v = Embedding(v) a_vu = softmax_u((W_q z_v)^T (W_k z_u) / sqrt(d)) m_v = Σ[u ∈ N(v)] a_vu W_v z_u z'_v = LayerNorm(z_v + m_v) ``` これは候補集合の単なる平均ではなく、保存されたグラフ隣接関係に沿う1-hopのメッセージパッシング。エッジの有無自体は学習しない。Attention重みは学習可能な射影から入力依存で計算する。 ### 2.5 記憶と隠れ状態の融合 ```text q_t = W_query h_t p_tv = softmax_v(q_t^T W_key z'_v / sqrt(d)) r_t = Σ_v p_tv W_value z'_v h'_t = h_t + tanh(s) W_out r_t ``` - 外部グループ0・3へ、それぞれ独立した記憶モジュールを挿入。 - ノード表現次元d:現行日英版は128。 - sは学習可能なスカラー。新規追加時は0に初期化し、元モデルの出力を保持。 - 候補がすべてnullなら記憶差分を0にする。 - GNNをOFFにした基準評価が可能。 ## 3. 学習 ### 3.1 学習するもの - ノード埋め込み。 - GNNのQuery/Key/Value射影・正規化。 - 隠れ状態から記憶を読むQuery/Key/Value・出力射影。 - 記憶融合の残差スカラー。 共有GDN、基盤LoRA、トークン埋め込み、LM Headは固定。 ### 3.2 現行目的関数 トークン列に対する次トークン交差エントロピー。現在の日英継続学習はraw causal language modelingであり、会話SFTでも、推論の正解保証を伴う学習でもない。 - AdamW、日英継続段階の学習率:`3e-4` - weight decay:`0.01` - 勾配ノルム上限:1 - シーケンス長:128入力+1教師トークン - 日英を交互に選び、学習トークン数をほぼ1:1にする。 - 文書を越えた無条件のパッキングはしない。 - 教師モデル/APIは今回の日英GNN学習では使用していない。 ### 3.3 データ分離 文書の元テキストSHA-256により、トークン化・切り詰め前に分割。 - 約96%:train - 約2%:dev - 約2%:test - 同一取り込み内の完全一致文書を除去。 - グラフ構築にはtrainのみ使用。 - 検証・テスト文書を記憶グラフへ登録しない。 近重複・別データセット間の重複・基盤モデルの事前学習汚染までは検査していない。「基盤モデルにも完全に未知の文書」という保証ではない。 ### 3.4 データソースと由来 英語: - `HuggingFaceFW/fineweb` / `sample-10BT` - revision:`9bb295ddab0e05d785b879661af7260fed5140fc` 日本語: - `HuggingFaceFW/fineweb-2` / `jpn_Jpan` - revision:`af9c13333eb981300149d5ca60a8e9d659b276b9` 取得時のデータセットカードではODC-BY。配布・公開時はデータセットと元コンテンツの条件、出典表記、基盤モデル側の条件を改めて確認する。加工・切り詰め内容はマニフェストに残す。 FineWebは会話・数学・コードの正解データセットではない。言語モデル損失の改善だけで、それらの能力向上を判断しない。 ## 4. 日英版の継続方法 実装:`continue_bilingual.py` 1. 英語大型版のグラフとGNN重みを読み込む。 2. 既存ノードIDを維持して日本語ノードを追加。 3. 既存ノード埋め込みを行単位でコピーし、一致を検査。 4. GNNの射影・正規化・残差スカラーをコピー。 5. 隣接テーブルは拡張後グラフから再構築。 6. 新規ノード表現を初期化して混合学習。 今回の継続は**重みの再開**。親のoptimizer状態がなかったため、AdamWは新規初期化した。ビット単位で同じ学習軌跡を再開したものではない。 日英版では今後の再開用にoptimizer、学習済みトークン数、Python・CPU/CUDA RNG状態も保存した。ただしモデル構成、ノードID、データ順序・処理位置も一致させて初めて厳密な再開になる。現行スクリプトに完全自動のresume機能はまだない。 グラフ拡張で既存ノードに新たな隣接ノードが加わる場合、古い重みを保っても出力が完全一致するとは限らない。拡張後・追加学習前の評価値を別途記録する。 ## 5. 実測結果 ### 5.1 日英版の規模 | 項目 | 実測 | |---|---:| | ノード | 48,491 | | 有向エッジ | 88,076 | | 今回追加した日本語ノード | 15,723 | | GNN記憶パラメーター | 13,626,882 | | 日本語取得文書 | train 1,482 / dev 20 / test 30 | | 日本語取得トークン | train 969,427 / dev 11,866 / test 19,782 | | 今回の学習量 | 日本語36,864+英語36,864トークン | | 学習時間 | 約180秒(L4) | これは取得した全文書を学習し終えたという意味ではない。 ### 5.2 日英継続の開発用評価 拡張後・追加学習前と、追加学習後を比較。各言語8文書の冒頭を使用。 | 言語 | 追加学習前NLL | 後NLL | |---|---:|---:| | 日本語 | 4.3052 | 4.2929 | | 英語 | 4.6243 | 4.6199 | ### 5.3 日英版のテスト:GNN ON/OFF 各言語8文書の冒頭を評価。日本語1,989、英語1,960教師トークン。 | 言語 | GNNなしNLL | GNNありNLL | |---|---:|---:| | 日本語 | 4.0156 | 3.9718 | | 英語 | 3.9740 | 3.8933 | 少数文書の文章予測結果であり、会話の正解率ではない。日英版の会話・数学・コード生成評価はまだ実施していない。 ### 5.4 直前の英語大型版の生成評価 - 日本語の数学2問:0/2。 - 日本語指示のコード2問:指定関数の生成0/2。 - 情報抽出2問:1/2。 - 英語の数学2問:0/2。 - 英語指示のコード2問:指定関数の生成0/2。 - 英語・日本語会話で無関係な数字や日付を生成。 - GNN OFFでも同様に失敗。 基盤側の回答能力・指示追従が弱く、記憶追加だけでは修復できていない。今後は未改造Instruct基盤でも同じ機構を比較する必要がある。 ## 6. 推論と速度 ### 現行サポート - 全入力列を再計算する非キャッシュ推論。 - greedy decoding。 - GNN ON/OFF切り替え。 - トークナイザーとモデルの停止IDを両方確認する。 ### 未実装 - キャッシュ付き生成時のルータ履歴・GNN状態管理。 - 並行リクエスト処理。 - 高速GPUルーティング。 - グラフ埋め込みのCPU/NVMeオフロード。 - 複数GPU・分散グラフ。 `GraphAugmentedLooped`はキャッシュ要求を明示的に拒否する。履歴をリセットしたまま高速化できたようには扱わない。 過去の英語大型版の短問ではGNN OFF約8.98、ON約8.69生成トークン/秒。FineWebの教師強制評価では約1,779トークン/秒だが、これは逐次生成速度ではない。 Flash Linear Attentionは環境へ導入済み。ただし既存プロセスが既に参照実装をimportしている場合、途中で自動的に高速カーネルへ切り替わるわけではない。新規プロセスで実測する必要がある。 ## 7. ファイル・保存先 ### ローカル実装 | ファイル | 役割 | |---|---| | `graph_model.py` | TokenGraph、GAT、Looped内部融合 | | `test_graph_model.py` | 初期同一性、隣接への勾配、null経路、因果ルータ | | `fineweb_gnn.py` | 英語小型・大型の構築と学習 | | `continue_bilingual.py` | 英語大型版から日英継続 | | `eval_fineweb.py` | 全テスト文書のNLL・perplexity評価 | | `evaluate_model.py` | GNN ON/OFF生成比較 | | `eval_english.py` | 英語生成試験 | | `graph_memory.py` | 別系統の原文完全復元用SQLite試作 | | `bilingual/report.json` | 日英版の実測結果 | ### Colabの日英版アーティファクト ```text /content/graph-engram-bilingual/ report.json graph.json gnn-memory.pt training-state.pt japanese-sources.jsonl japanese-documents.json ``` **これらはColabの一時ディスクにある。** 本書作成時、日英版の`report.json`はローカルへ取得したが、日英版の重み・グラフ・optimizer状態はまだローカルへ取得していない。インスタンス解除前に永続保存すること。 基盤の再現には以下も必要: ```text HF固定リビジョンのLooped-Qwen-pre /content/looped-qwen-l4/adapter.pt /content/looped-qwen-repair24/candidate_adapter.pt ``` GNN重みだけで単体モデルとしてロードできない。基盤アダプターのdtypeも保持する。 ## 8. 評価方針 以下を分離して測定する。 1. **記憶構築**:入力トークン/秒、ノード共有率、索引・グラフ・重み込み容量。 2. **学習**:実学習トークン/秒、GPU時間、最大VRAM、同じ精度に達するまでの費用。 3. **記憶利用**:正しいノードの取得率、意味的に関連する根拠の取得率。 4. **言語予測**:文書分離テストのトークン加重NLL・perplexity。 5. **回答能力**:日本語会話評価、数学正解率、隔離実行環境でのコードテスト。 6. **推論速度**:TTFT、逐次生成速度、入力長別の遅延。 公平な比較には同じ基盤、同じデータ、同じ学習量、同じ評価問題、複数乱数を用いる。これまでの小型/大型試験は学習量や乱数も異なるため、単純なサイズ効果とは言えない。 ## 9. 既知の問題 - 数字回答への偏りを持つ修復基盤に依存している。 - 日英の生テキスト学習だけでは、会話・数学・コードの指示追従を保証しない。 - 日本語ルータは完全一致gramのみ。英語のみのグラフでは日本語の取得率がほぼ0になるケースがあった。 - 隣接は文書内の順序であり、事実・因果・コード依存関係を抽出したものではない。 - 固定次数・候補数・gramあたり参照数によって検索漏れがある。 - ノード初期値は学習可能なベクトルであり、断片を保存しただけでその意味や事実が自動的に重みに入るわけではない。 - CPU辞書探索が大規模化のボトルネックになり得る。 - 現行Wrapperはbackboneの`run_group`を差し替える実験実装。複数Wrapperの重ね掛けには解除・復元が必要で、独立した標準HFアーキテクチャとしては未整備。 - 稠密な隣接パディングや候補展開によるメモリ増加がある。 - 原文・グラフ・学習済み表現を合算した圧縮優位性は未評価。 - 原文に含まれる誤情報・個人情報・悪意ある指示への対策は未実装。 ## 10. 次段階の設計案(未実装) 優先順: 1. 日英版の全アーティファクトと基盤差分を永続保存し、クリーン環境で再ロード試験。 2. 新しいInstruct基盤の無改造性能を測り、同じGraphEngramを追加して比較。 3. 日英会話・検証可能な数学・コードSFTを混ぜ、知識予測と指示追従の損失を分離。 4. 学習可能なノードルーティング、意味近傍、エッジ種別を導入し、完全一致gramだけに依存しない。 5. 固定グラフ部分のGNN表現を推論用に事前計算し、オンラインでは小さい候補Attentionだけ実行する案を検証。 6. GPUルータ、事前トークン化、候補索引の配列化、キャッシュ推論を実装。 7. 同じ費用で、公式Engram・通常RAG・追加LoRA・記憶なしモデルと比較。 固定グラフの事前計算は推論高速化の候補であるが、学習時に埋め込みが変わる間は再計算・勾配の扱いが必要。未実装の高速化を現在の性能として扱わない。