【AI ロマン】LLM から特定の知識だけを物理的に抜き取る!Hotswappable LLM の「シナプス削除」と「パージ」
요약
본 기사는 LLM에서 특정 지식을 '잊게 하거나' 제거하는(Unlearning) 기술적 난제와 이를 해결하기 위한 모듈형 AI 구조인 SRA(Synaptic Routing Architecture)의 구현 과정을 다룹니다. 기존 LLM은 모든 지식이 얽혀 있어 일부만 삭제하려 하면 다른 기능까지 손상되는 '파국적 망각' 문제가 발생합니다. 필자는 이 문제를 해결하기 위해, 필요 없는 시냅스를 물리적으로 제거하거나, 특정 도메인의 시냅스 임베딩을 '제로 클리어(Zero Clear)'하여 지식을 비활성화하는 방법을 제시했습니다.
핵심 포인트
- LLM에서 특정 지식만 선택적으로 삭제하는 것은 매우 어렵기 때문에, 모듈형 아키텍처가 필수적입니다.
- SRA는 시냅스를 물리적으로 제거(Pop)하거나, 임베딩을 0으로 설정하여 비활성화(Zero Clear)할 수 있습니다.
- 단순히 텐서의 크기를 줄이는 방식은 '말미'만 삭제 가능하며, 중간 지식 삭제 시 인덱스 오류를 유발합니다.
- 중간 지식을 삭제하기 위해 Zero Clear 방식을 사용했을 때, 코사인 유사도 계산 로직에서 빈 슬롯이 잘못 선택되는 버그가 발생했습니다.
- 이 문제를 해결하기 위해 라우터의 순전파(Forward Pass)에 '제로 클리어된 시냅스'를 감지하여 강제로 마스크하고 무시하는 처리를 추가했습니다.
前回の記事【AI ロマン】複数 LLM を再学習ゼロで物理合体!Hotswappable LLM の実装と検証では、巨大な LLM をモジュール化し、後から独立学習した「特化シナプス」を再学習なしで物理的に合体(Hot-Swap)させるアプローチについて解説しました。
しかし、知識を「足せる」ようになったのであれば、当然次に湧き上がる疑問があります。
「もし追加した知識が不要になったら?」「ベースモデルの中から『数学の知識』だけを完全に抜き取って容量を空けたい場合はどうするのか?」
現在の巨大な LLM(モノリスモデル)から「特定の知識だけを忘れさせる(Unlearning)」ことは至難の業です。すべての知識が一つの巨大なパラメータ空間に複雑に絡み合っているため、特定の機能や知識を消そうとして再学習を行うと、全く無関係な汎用的な対話能力まで破壊されてしまう「破滅的忘却」が起きてしまいます。
しかし、私が開発・検証を進めているモジュラー AI 構造「SRA(Synaptic Routing Architecture)」であれば、この問題は非常にシンプルかつ物理的に解決できます。 不要になったシナプスを直接切り離すか、空っぽにすればいいのです。
本記事では、Hotswappable LLM の真の完成形とも言える「シナプス削除」と「特定ドメインのパージ(抜き取り)」の実装と、その過程で直面した 「ルーティングの罠」 について解説します。
SRAにおいて、不要な知識を削除するには大きく分けて 2 つのアプローチがあります。
1 つ目は、一番シンプルで直感的な方法です。後から追加(Hot-Swap)したシナプスが不要になった場合、モデルの重みテンソルの末尾から直接物理的に切り捨ててしまいます。
# 例:一番最後に追加した 2 つのシナプスを物理的に取り外す
def pop_synapses(self, num_drop: int):
# 重みテンソルの末尾から num_drop 分だけスライスして削る
...
Python のテンソル操作としてはこれだけです。この手法の最大のメリットは、 VRAM(メモリ)の使用量を物理的に縮小でき、モデルを追加前の状態に完全に復元できる ことです。OS のプラグインをアンインストールするように、AI の脳のパーツを物理的に取り外すことができます。
しかし、アプローチ①には弱点があります。それは「末尾からしか削除できない」ということです。
もし、「ベースモデルの初期学習時から組み込まれていた『数学(Math)』専用のシナプスだけを途中のインデックスから削除したい」場合はどうすればよいでしょうか?
途中のテンソルを物理的に削除してしまうと、 それ以降のシナプスのインデックス(ID 番号)がすべて前にズレてしまいます。 SRA では「特定のシナプスにのみルーティングを許可する」といったメタデータマスクの制御を行っているため、ID がズレると既存の制御システムが完全に崩壊してしまいます。
そこで採用したのが、 シナプスの「ゼロクリア(空きスロット化)」 です。
# 例:インデックス 3 番のシナプス(数学特化)をパージする
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
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기