最近、AIの「記憶」について考えてるんだけど、どうもうまくいかない。ニューラルネットはパワフルだけど、何考えてるか分からないし、すぐ忘れちゃう。逆に知識グラフみたいなシンボリックAIは、理屈っぽいけど融通が利かない。ノイズに弱いし。
この二つの良いとこ取りってできないもんかね…って思ってたら、面白い論文というか、コンセプトを見つけたんだ。
TL;DR(要するにこういうこと)
一言で言うと、「ドーナツ型の3D空間に、曖昧な記憶(超次元ベクトル)と明確な事実(知識グラフ)をゴチャ混ぜに突っ込んで、効率よく管理する」っていう、すごく変わったAIメモリの話。しかも、スパース(疎)だからメモリも食わない。これがなかなか良く出来てる。
これまでのAIメモリの何が問題だったのか?
ちょっと比較してみると、なんでこの新しいアプローチが面白いのかが分かりやすい。正直、どっちも一長一短だったんだよね。
| アプローチ | 得意なこと | 苦手なこと / 個人的な感想 |
|---|---|---|
| ニューラルネットワーク (NN) | ・曖昧なパターン認識 ・「なんとなく似てる」を見つける |
・「なぜそう考えた?」が全く不明(ブラックボックス) ・すぐ忘れるし、新しいことを教えるのが大変 ・GPUパワーをめちゃくちゃ食う。燃費が悪い。 |
| シンボリックAI (知識グラフとか) | ・論理的な推論(AはB、BはC→AはC) ・事実関係が明確 |
・「アリスはウサギを追いかけた」と「アリスが白ウサギを追った」を別物と認識しがち。融通が利かない。 ・データが少しでも間違ってると全体が破綻しかねない。潔癖症すぎる。 |
| 今回のアプローチ (トーラス型) | ・上記二つの「良いとこ取り」を目指してる ・曖昧な検索も、正確な質問もできる |
・まだ実験段階だけど…でも、この「疎(スパース)」っていうのがミソ。データがある場所だけメモリを使うから、めちゃくちゃ効率的。これはスケールするかもしれない。 |
じゃあ、どうやって実現してるの?その仕組み
この記憶システム、面白い要素がいくつか組み合わさってる。メモ代わりに書き出してみる。
1. 超次元コンピューティング(HDC)っていう考え方
まず基本。情報をめちゃくちゃ高次元(例えば2048次元とか)のベクトルで表現する。これをハイパーベクトル(HV)って呼ぶ。何がいいかっていうと、
- ノイズに強い:ベクトルの何ビットかが反転しても、元の情報となんとなく似てるから認識できる。人間の記憶みたいだよね。
- 合成できる:「king」のHVから「man」のHVを引いて「woman」のHVを足すと、「queen」に近くなる、みたいな計算ができる。
要するに、すごく頑丈で柔軟な情報の表現方法ってこと。これが記憶のベースレイヤーになる。
2. 3Dトーラス構造(ドーナツ型メモリ)
これが一番の特徴かも。情報をただの配列じゃなくて、3次元のドーナツみたいな空間に配置する。端っこがない、全部つながってる世界。
これ、何が嬉しいかっていうと、「端っこ効果」がないから、メモリ上を「散歩」するときに自然な連想が生まれやすい。シーケンシャルなデータ(文章とか)をわざとバラバラに、空間全体にマッピングしていくんだ。だから、予期しない単語同士が近くに配置されたりして、面白い連想が生まれるきっかけになるかも。
3. マルコフ連鎖で記憶を「散歩」する
記憶から次の記憶へどうやって移動するか。それがマルコフ連鎖。ある地点から次に行く確率が決まってる。例えば、「コーヒー」っていう記憶の地点からは、「朝」とか「カップ」っていう地点に移動しやすくなってる、みたいな。
これは文章の単語の出現順とかから学習できる。ただ順番通りに記憶をたどるんじゃなくて、確率的にジャンプするから、より人間らしい「連想」に近い動きになる。うん、面白い。
4. シンボリックな知識グラフを上乗せ
で、この曖昧な記憶の層の上に、ガチガチの事実を載せる。`spaCy`みたいなNLPツールを使って、文章から「主語-動詞-目的語」の三つ組(トリプル)を抽出する。例えば、「alice chase rabbit」みたいな。
この「chase」っていう関係性を、アリスとウサギの記憶が保存されてる地点の間に「辺」として追加する。これで、「アリスが追いかけたのは何?」みたいな正確な質問にも答えられるようになる。これは賢い。もちろん、日本語の文章を扱うなら、`spaCy`じゃなくて`GiNZA`みたいな日本語に強いパーサーを使うことになるだろうね。理化学研究所のAIPセンターとかも、こういうニューラルとシンボリックの融合研究をやってるけど、やっぱり言語ごとの前処理は重要。でも、このアーキテクチャの面白いところは、その下のHDC層は言語に依存しないってこと。
実際のコードはどんな感じ?
このシステムの心臓部、`SparseToroidalMemory3D`クラスの実装が結構シンプルで良い。全部は載せないけど、ポイントは…
# Triple(主語-動詞-目的語)を抽出する部分の例
# spaCyを使って文の依存構造を解析する
def extract_triples(text, nlp):
doc = nlp(text)
triples = []
for sent in doc.sents:
for token in sent:
# 動詞を見つけたら…
if token.pos_ == "VERB":
# その主語と目的語を探す
subs = [w for w in token.lefts if w.dep_ in ("nsubj", "nsubjpass")]
objs = [w for w in token.rights if w.dep_ in ("dobj", "pobj")]
for s in subs:
for o in objs:
triples.append((s.text, token.lemma_, o.text))
return triples
# メモリに書き込む部分のキーメソッド
class SparseToroidalMemory3D:
def set(self, *idx, hv, token=None, consolidate=True):
# ...
# すでにデータがあれば、新しい情報を「束ねる」(bundle)
if idx in self.memory and consolidate:
self.memory[idx] = bundle(self.memory[idx], hv)
else:
self.memory[idx] = hv
# ...
注目すべきは、`self.memory`が辞書(dictionary)だってこと。つまり、書き込まれた座標だけがメモリ上に存在する。全空間を確保するわけじゃない。だから「スパース(疎)」で、めちゃくちゃメモリ効率がいい。これは大規模なデータを扱う上ですごく大事な点。
で、これ、何に使えるの?
正直、可能性は色々あると思う。ただのNLPだけじゃなくて。
- 生涯学習するAI:大量の本や会話ログを読ませて、忘れたり、思い出したり、強化したり…みたいな「生きてる」記憶を作れるかも。古い知識はだんだん薄れて、新しい知識は定着する。生物っぽい。
- 説明可能なAI(XAI):「なんでそう判断したの?」って聞かれたら、シンボリックグラフの層を見せることで「『アリスがウサギを追跡した』という事実に基づいて…」みたいに説明できる。これはデカい。
- マルチモーダルAIの基盤:同じトーラス空間に、画像や音のハイパーベクトルも保存すればいいだけ。そうすれば、「ライオンの画像」と「『ライオン』という単語」と「ガオーっていう鳴き声」が同じ空間で関連付けられる。分野横断的な検索が可能になる。
反例と誤解されそうな点
もちろん、いいことばかりじゃない。というか、まだこれは研究段階のアイデアに近い。
まず、ハイパーベクトルの次元数やトーラスのサイズ、減衰率みたいなハイパーパラメータをどう決めるか。これは結構職人芸になりそう。あと、シンボリックな三つ組を抽出するNLP部分の精度が、システム全体の論理性のボトルネックになる。ゴミを入れればゴミが出てくる、っていう原則は変わらない。
それから、「創造的な連想」と言ったけど、マルコフ遷移の作り方によっては、ただのランダムウォークになって意味不明な連想しかしない可能性もある。この遷移確率をどう学習・調整していくかが、実用化の鍵だろうな。
でも、こういう課題があるからこそ、面白い研究分野なんだと思う。完璧なシステムなんてないからね。
うーん、でもやっぱりこの「疎なメモリ」と「曖昧さと明確さの同居」っていうコンセプトは、すごく魅力的だ。今の巨大なLLMとはまた違う、軽くて、透明で、ずっと学習し続けられるAIへの一つの道筋かもしれない。
あなたなら、こんな「記憶」を持つAIに、何を覚えさせてみたいですか?
