cse-frog
Chain-Spike Engine / 講座版

🐸を1匹飼うと、
言語モデルの中身が見える。

順番のあるデータを覚えて「次に何が来そうか」を予測する、学習用の小さなAIです。Pythonの練習や、言語モデルの仕組みを手で触って理解するために作りました。

pip install cse-frog

※これはLLMの代わりではありません。中身が全部見えて、壊して学べることが目的です。

CSE のマスコット:リュックを背負ったカエル CSE のマスコット:リュックを背負ったカエル
① 覚えるヘブ則で結びつきが強くなる
② 点数直接・履歴・並び・痕跡
③ 確率softmax / linear
④ 選ぶここは自分で作る!
SPECIMEN — cse-frog v0.2.0
MIT License
WHY A FROG

解剖用の「LMの素体」

理科の授業でカエルを解剖するのは、カエルが一番強いからではなく、体のつくりが一通りそろっていて、しかも見やすいからです。

cse も同じで、言語モデルの基本の流れ(覚える → 点数 → 確率 → 選ぶ)を一通り持った、全部開いて見られる小さな体です。

— README より
  1. 体のつくりが一通りそろっている覚える・点数をつける・確率にする・選ぶ。大きなLLMと同じ流れを、小さく全部持っています。
  2. 全部開いて見られる「どこで・なぜその予測をしたか」を、候補ごとの点数の内訳として数字で見られます。
  3. わざと外してある部品があるアテンションや勾配降下は持っていません。それは「次に自分で組む部品」です。
  4. 何度解剖しても大丈夫壊れても Frog() でもう1匹出てきます。
ANATOMY CHART

解剖図 — LMの臓器と、🐸の臓器

右の列の「本物の臓器」が何のためにあるのかを、まん中の小さな体で先に触って理解できます。

LMの臓器
🐸 CSE では
大きな LLM では
1入力を記号にする
1文字=1記号(Frog なら1要素=1記号)
トークナイザー
2覚える
ヘブ則で結びつきが強くなる
勾配降下で重みを直す
3文脈を持つ
活性の残り・直前2つの並び
アテンション
4予測する
点数 → softmax / linear で確率に
logits → softmax
5抑える
不応期
繰り返しペナルティ
6選ぶ
(自分で作る! Top-p など)
サンプラー

たとえば 🐸 の文脈は直前2つまでしか見えません。だから大きな LLM は、遠くを見るためにアテンションを持っています。
立ち位置:数え上げ(n-gram)より動く部分が多く(発火・伝播・減衰・不応期)、LLM より中身が見える。

LOOK INSIDE

予測の「内訳」が全部見える

「どこで・なぜその予測をしたか」を数字で見られます(大きなLLMでは通常、この粒度で直接追うのは難しいところです)。下は「右右下」を5回くり返して覚えさせた 🐸 に、「右右下」の次を聞いた結果です(本物の出力)。

  1. 覚える並びを見せると、続いて出た記号どうしの結びつきが強くなる
  2. 点数直接のつながり+履歴+直前2つの並び+文脈の痕跡
  3. 確率上位の候補の点数を softmax / linear で確率に変える
  4. 選ぶどう選ぶかは、あなたが作る部品

Frog() — 素直な設定

右
0.865
<END>
0.135
直接履歴並び痕跡右端の数字=確率

Frog(refractory_steps=2) — 不応期あり

<END>
1.000
右
0.000← 直前に出たので、不応期で消された
点数は高いのに、直前に出た「右」は出せない。だから「ここで終わり」になる。
KNOBS

いじる設定 ↔ LLM で似ているもの

Frog(設定名=値) で変えて、frog.show(...) で点数と確率の変化を見てみてください。あくまで「似た働き」です。違いも含めて比べるのがおすすめです。

temperaturetemperature(そのまま同じ!)

下げると自信満々、上げると迷いがち。

top_k_edgesTop-k

確率にする候補を上位 k 個に絞る。活性を広げるときも、各記号から強い順に k 本のつながりだけを使う。

refractory_steps繰り返しペナルティ

同じ記号を続けて出さなくなる。点数を下げるのではなく完全に禁止するので、ペナルティより極端。

pair_context_capacity / pair_context_boostコンテキストの長さ

🐸 は直前2つまで。0 にすると「右右 → 下」が覚えられない。

max_nodes語彙サイズ

覚えられる記号の数。メモリは max_nodes の2乗で増える。

history_boostマイナスの presence_penalty / キャッシュ言語モデル

少し前に出た記号が出やすくなる。研究では、生成を崩す方向に効いていた。

QUICK START

5行で1匹

pip install cse-frog
  • 使うときの名前は from cse import Frog です。
  • learn() には、文字列 "右右下"(1文字=1記号)、リスト ["正常", "温度上昇", "停止"](1要素=1記号)、リストのリストを渡せます。
  • predict() が <END> を返したら「ここで系列が終わりそう」という意味です。
  • 保存したファイルは JSON と数値の配列だけ。pickle は使わないので、人の 🐸 を読み込んでも安全です。
from cse import Frog
frog = Frog()                                # 🐸 を1匹つくる
frog.learn([["右", "右", "下"]] * 10)         # 行動の系列を覚えさせる
print(frog.predict(["右", "右"]))             # -> 下
print(frog.top(["右"], k=2))                 # 確率の高い順に2つ

frog.show(["右", "右", "下"])                # 点数の内訳を表で見る
frog.save("my_frog.cse")                      # 覚えたことを保存
HONEST LIMITS

正直な限界

予測の精度では数え上げに負けることもあります。それも含めて全部見せるのが、この 🐸 の役目です。

正直
  1. 局所的な予測器です。既定の設定では、基本的に「今の記号」と「直前2つの並び」から次を予測します。n-gram(数え上げ)に近い性質です。
  2. 研究(Chain-Spike Engine の検証)では、古典的な評価軸(精度・メモリ・速度・較正など)で、n-gram などの既存手法に対する比較優位は見つかりませんでした。遠くの文脈を使う問題(検索など)は苦手です。
  3. エンジンは本来文字単位です。Frog は単語などの記号を内部で1文字に置き換えて、この制約を吸収しています。
  4. 既定の設定は、素直に予測するための設定です。Frog(refractory_steps=2) のように変えると、元の仕組み(不応期)の挙動を観察できます。
ドット絵の CSE カエル

インストールなしで、いま飼える。

ブラウザの中で本物の cse-frog が動きます。何も送信しません。

ブラウザで飼ってみる →