動的ベクトルルーターと軽量・汎用モデルで実現するストリーミング画像分類システム
はじめに
ディープラーニングモデルの開発において、次のような壁にぶつかったことはないでしょうか。
- リソースの制約: ハイスペックなGPUがない環境で、巨大なモデルをトレーニングしたり重いファインチューニングを行うのは非現実的。
- 追加学習の難しさ: 新しいクラスやデータが追加されるたびにモデル全体を再学習(フルスクラッチや重いLoRA等)するのはコストがかかる。
「分類なら、無理に巨大なモデルを1つ作るより、モデルを分割して軽量なモデルに任せればいいじゃないか」——本記事では、画像をサクッとベクトルでルーティングし、割り振られた「汎用一般人モデル」たちがご近所のデータを引き受けて自律的に成長していく、「Dynamic Vector Router & General Models System」の仕組みと実証結果について紹介します。
※ ソースコードや詳細なセットアップ手順は GitHubリポジトリ dmai をご参照ください。
🏗️ 仕組み:動的ベクトルルーター & 汎用モデルのアーキテクチャ
本システムでは、最初から完璧なクラスタリングや「専門家(エキスパート)」の厳密な設計を行いません。まずは大まかな「画像の塊(ベクトル空間)」でえイヤーとルーティングし、割り振られた小さなCNNを配置します。
[入力画像: 28x28]
↓ (PixelVectorExtractor / ピクセル直値ベースの正規化ベクトル化)
[動的ベクトルルーター (Cosine Similarity Search)]
↓ (類似度判定 & 近くの塊を担当する汎用モデルへルーティング)
[SmallLocalExpertCNN (各塊を担当する軽量な汎用モデル)]
↓
[出力: Top-k アンサンブルによる高精度分類 & 不確実性フィルタリング]
1. 特徴抽出器 (PixelVectorExtractor)
複雑な事前学習済みバックボーンモデルに頼らず、画像をフラット化してL2正規化したピクセル直値ベースの特徴ベクトル(512次元など)を生成します。
2. 動的ルーター (DynamicClusterRouterPipeline)
- ストリーミング状に流れてくるデータをリアルタイムで評価。
- 既存のモデルとの類似度(コサイン類似度)が閾値(例:
0.35)以上であれば、一番近い「ご近所さん(既存モデル)」へデータをアペンド。 - 閾値未満であれば、新しい塊を担当する「新しい汎用モデル」をその場で自動生成(Dynamically Created)し、即座にルーティング対象へ組み込みます。
3. 軽量な汎用一般人モデル (SmallLocalExpertCNN)
各ベクトル空間の塊を担当する、数万〜数十万パラメータの非常に軽量なCNN構造です。
- 異種ラベルの共存と成長: 類似のベクトルの中に全く違うラベルのデータが混ざってきても大丈夫です。定期的な追加学習(バッチ学習・Early Stopping)によって、各モデルがそれぞれの塊の中での多様なパターンをどんどん学習し、個別に成長していきま。
- データが蓄積されると、ローカルストレージへ
.pthとしてモデルキャッシュを保存します。
🚀 実証結果(MNIST 60,000件ストリーミング学習 & 10,000件全件評価)
MNISTの訓練データ60,000件を用いたストリーミングシミュレーションと、10,000件のテストデータによる評価を実施しました。
📊 ストリーミング・動的ルーティングの様子
データを流し込んでいく中で、必要に応じて自動的に汎用モデル(cluster_001 〜 cluster_010)が立ち上がり、それぞれの塊で柔軟に学習・成長していく様子が確認できます。
📊 [Streaming Progress: 60000/60000]
================================================================================
cluster_001 サイズ:[28, 28] 累計: 3000枚 ACTIVE (acc 98.7%, unfitted:0/3000) クラス: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
cluster_002 サイズ:[28, 28] 累計: 3000枚 ACTIVE (acc 98.3%, unfitted:0/3000) クラス: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
cluster_003 サイズ:[28, 28] 累計: 3000枚 ACTIVE (acc 99.4%, unfitted:0/3000) クラス: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
cluster_004 サイズ:[28, 28] 累計: 3000枚 ACTIVE (acc 99.1%, unfitted:0/3000) クラス: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
cluster_005 サイズ:[28, 28] 累計: 2905枚 ACTIVE (acc 0.0%, unfitted:2905/3000) クラス: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
...
================================================================================
✅ 全件シミュレーションが完了しました。
🧪 テストデータ全件評価結果(Top-3 アンサンブル版)
10,000件のテストデータを用いた評価では、類似度が閾値に満たない未知サンプルを「分からない(Unknown)」として適切に弾きつつ、判定を行ったサンプルにおいては97.17%という高精度を叩き出しています。
===========================================================================
📊 【テストデータ全件評価結果(Top-k アンサンブル版)】
===========================================================================
• テストデータ総数 : 10000 件
• 正解数 : 8821 件
• 「分からない」件数 : 922 件 (全体比: 9.22%)
• 全体正解率 (総合) : 88.21%
• 判定成功時精度 : 97.17%
---------------------------------------------------------------------------
🏷️ 【ラベル別 詳細内訳】
Label | Total | Correct | Unknown | Accuracy (判定成功時) | Real Accuracy (全体比)
---------------------------------------------------------------------------
0 | 980 | 965 | 6 | 99.08% | 98.47%
1 | 1135 | 1109 | 18 | 99.28% | 97.71%
2 | 1032 | 788 | 195 | 94.15% | 76.36%
3 | 1010 | 976 | 17 | 98.29% | 96.63%
4 | 982 | 809 | 126 | 94.51% | 82.38%
5 | 892 | 749 | 121 | 97.15% | 83.97%
6 | 958 | 648 | 294 | 97.59% | 67.64%
7 | 1028 | 964 | 31 | 96.69% | 93.77%
8 | 974 | 887 | 60 | 97.05% | 91.07%
9 | 1009 | 926 | 54 | 96.96% | 91.77%
===========================================================================
💡 考察:なぜこの設計が強いのか?
-
類似ベクトルへの異種ラベル混入に対する耐性と個別の成長:
最初から綺麗なクラスタリングができていなくても問題ありません。たとえ似たような画像ベクトルの中に全く違うラベルのデータが混ざってきても、各モデルは「汎用一般人」として追加学習を重ねるため、担当エリアに流れてくる多様なデータを学習して、個別のモデルが各々で賢く成長していくことができます。 -
追加学習が爆速で容易:
新しいデータやクラスが来ても、モデル全体を再トレーニングする必要は一切ありません。該当する塊を担当するモデルだけに少量のデータを突っ込んでサクッと追加学習させれば完了します。 -
ローカル・低スペックPCに優しい:
NVIDIA RTX 2070のようなミドルレンジGPUやVRAMが限られた環境でも、軽量なモデルの集まりなので快適に動作します。 -
「分からない」を安全に弾ける:
類似度閾値を設けているため、どのモデルの担当エリアにも属さない外れ値やノイズは「分からない」と安全に弾くことができます。
まとめ
本プロトタイプでは、「巨大な単一モデルをすべて学習させるアプローチ」の代わりに、「ベクトルルーターで分散させ、軽量な汎用モデルたちに個別に担当させて自律的に成長させる」という極めて実用的なアプローチを検証しました。
完璧な事前設計や重いファインチューニングに頼らずとも、ローカルPCの限られたリソースで高い柔軟性と精度を両立できる有力な選択肢になり得ます。
実装コードや具体的な手順の詳細は、以下のGitHubリポジトリをご参考ください。
👉 GitHub Repository