前回の記事【AI ロマン】複数 LLM を再学習ゼロで物理合体!Hotswappable LLM の実装と検証では、巨大な LLM をモジュール化し、後から独立学習した「特化シナプス」を再学習なしで物理的に合体(Hot-Swap)させるアプローチについて解説しました。
しかし、知識を「足せる」ようになったのであれば、当然次に湧き上がる疑問があります。
「もし追加した知識が不要になったら?」「ベースモデルの中から『数学の知識』だけを完全に抜き取って容量を空けたい場合はどうするのか?」
現在の巨大な LLM(モノリスモデル)から「特定の知識だけを忘れさせる(Unlearning)」ことは至難の業です。すべての知識が一つの巨大なパラメータ空間に複雑に絡み合っているため、特定の機能や知識を消そうとして再学習を行うと、全く無関係な汎用的な対話能力まで破壊されてしまう「破滅的忘却」が起きてしまいます。
しかし、私が開発・検証を進めているモジュラー AI 構造「SRA(Synaptic Routing Architecture)」であれば、この問題は非常にシンプルかつ物理的に解決できます。 不要になったシナプスを直接切り離すか、空っぽにすればいいのです。
本記事では、Hotswappable LLM の真の完成形とも言える「シナプス削除」と「特定ドメインのパージ(抜き取り)」の実装と、その過程で直面した 「ルーティングの罠」 について解説します。
SRAにおいて、不要な知識を削除するには大きく分けて 2 つのアプローチがあります。
1 つ目は、一番シンプルで直感的な方法です。後から追加(Hot-Swap)したシナプスが不要になった場合、モデルの重みテンソルの末尾から直接物理的に切り捨ててしまいます。
def pop_synapses(self, num_drop: int):
...
Python のテンソル操作としてはこれだけです。この手法の最大のメリットは、 VRAM(メモリ)の使用量を物理的に縮小でき、モデルを追加前の状態に完全に復元できる ことです。OS のプラグインをアンインストールするように、AI の脳のパーツを物理的に取り外すことができます。
しかし、アプローチ①には弱点があります。それは「末尾からしか削除できない」ということです。
もし、「ベースモデルの初期学習時から組み込まれていた『数学(Math)』専用のシナプスだけを途中のインデックスから削除したい」場合はどうすればよいでしょうか?
途中のテンソルを物理的に削除してしまうと、 それ以降のシナプスのインデックス(ID 番号)がすべて前にズレてしまいます。 SRA では「特定のシナプスにのみルーティングを許可する」といったメタデータマスクの制御を行っているため、ID がズレると既存の制御システムが完全に崩壊してしまいます。
そこで採用したのが、 シナプスの「ゼロクリア(空きスロット化)」 です。
def clear_synapses(self, indices_to_clear: list[int]):
for idx in indices_to_clear:
...
テンソルのサイズ(形)は一切変えず、特定のスロットの中身だけを強制的に 0.0 で上書きします。これにより、インデックスの整合性を完璧に保ったまま、そのシナプスが持っていた知識だけを完全に無効化できます。
しかも、空きスロットとなったインデックスには、後から新しいシナプスをピッタリと上書き(Hot-Swap)して再利用することが可能です!
「ゼロクリアすれば無効化できるだろう」と単純に考えて実装したところ、 恐ろしいバグ に直面しました。
特定ドメインをゼロクリアしたモデルを実行してみたところ、 出力が完全に崩壊 してしまったのです。
原因は、SRA のルーターが行っている「コサイン類似度」の計算ロジックにありました。
SRA のルーターは、入力されたデータと各シナプスの「エンベディング(代表ベクトル)」の内積(コサイン類似度)を計算し、最もスコアが高いシナプスに処理をルーティングします。
- シナプスをゼロクリアすると、そのエンベディングも
[0.0, 0.0, ...] になります。
- ゼロベクトルを正規化(Normalize)しても、結果はゼロベクトルのままです。
- 入力ベクトルとゼロベクトルのコサイン類似度を計算すると、結果の Logit は
0.0 になります。
ここで問題が起きます。コサイン類似度は「-1.0 〜 1.0」の値をとります。
もし、入力データに対して 正常なシナプスのコサイン類似度がマイナス(例: -0.5)だった場合、なんと「完全に空っぽのシナプス(0.0)」の方が数学的にスコアが高くなってしまい、ルーターが空のシナプスを優先的に選んでしまう という逆転現象が発生したのです!
「存在を消したはずの空きスロットに、データが吸い込まれて消滅する」という、まるでブラックホールのような挙動でした。
このバグを防ぐため、ルーターのフォワードパス(順伝播)に、ゼロクリアされたシナプスを検知して完全にルーティングから除外する(マスクする)処理を追加しました。
logits = torch.einsum("btd,nd->btn", h_norm, emb_norm) * self.scale
...
Score 를 -inf
으로 설정함으로써, 다른 시냅스의 스코어가 얼마나 낮아져도 빈 시냅스가 선택되는 것은 절대 불가능해졌습니다. 이를 통해 마침내 안전한「지식의 패치 (Knowledge Patch)」가 완성되었습니다.
이번에 구현한「시냅스 제거」와「특정 도메인의 제로クリア (Zero Clear)」의 전체 프로세스는, 아래의 Google Colab 노트북에서 실제로 실행하여 체험할 수 있습니다 (GPU 불필요하며 몇 초 만에 실행 가능합니다).
노트북에서는, 실제로 시냅스를 추가한 후 물리적으로 제거하여 크기를 되돌리는 처리나, 라우터의 노름이 0.0
으로 패치되는 모습을 확인할 수 있습니다.
이를 통해, **「학습 → 합체 (Hot-Swap) → 제거 (패치) → 슬롯 재사용 (오버라이트)」**라는, 모듈러 AI로서의 완전한 라이프사이클을 실현할 수 있었습니다.
모델이 똑똑해짐에 따라 블랙박스화되는 현대에서, 지능의 부품들을 물리적으로 뽑아넣어 제어할 수 있는「Hotswappable LLM」의 접근법은, 모델의 유지보수성이나 안전성을 관점에서 볼 때 매우 유망한 방향이라고 확신합니다.
이「AI 로만스」에 공감해 주셨다면, 반드시 리포지토리를 확인해 보세요!
- GitHub 리포지토리: SynapticRouter