Tiny Language Model Lab v0.1

極小の文字予測モデルを、Androidのブラウザ内で学習・観察する実験室。通信・外部ライブラリ・アカウント不要。

ニューラル・ビグラム(1文字だけ参照)

重要:これはLLMやTransformerそのものではありません。LLMで使われるトークン、埋め込み、確率分布、損失関数、勾配降下、自己回帰生成を、Attentionを加える前に切り出した教材です。学習データ外の知識はありません。

1. 学習用テキスト

1行=1文として扱います。改行ごとに開始・終了の特別トークンを付けます。最初は8文だけです。

2. 学習する(数値を更新する)

0完了エポック
0パラメータ更新回数
—平均損失(小さいほど良い)
—困惑度 / perplexity
—語彙数(特殊記号含む)
—学習パラメータ数
0.10

「1例だけ学習」を押すと、1件の正解トークンに対する確率の変化が見られます。

エポック=学習テキストから作った全(前の文字→次の文字)組を1巡すること。損失は自然対数を使用。

3. 予測確率を比較する

右側の「実測」は教材内で次に出現する文字を単純集計した割合。左側の「ニューラル」はモデルが学習した確率です。初期状態で両者は一致しません。

ニューラル実測(カウント)

選択文字の埋め込みベクトル

4個の小数が学習で動きます。このモデルでは「直前の1文字」だけを4次元の数値列に変換しています。

4. 新しい文字列を生成する

0.8
未生成

生成時の選択記録

生成ボタンを押すと1文字ずつの予測が現れます。

直前の1文字しか参照しないため、学習を進めても文全体の文脈や意味は保持できません。これが次にAttentionを導入する理由です。

5. コードと数式の対応

このファイルのJavaScriptは、外部ライブラリを一切使わず約100個規模の係数を自前で更新しています。主な処理は以下の通りです。

直前の文字 x → 埋め込み h = E[x] (4数)
各候補 j のスコア z[j] = b[j] + W[j]・h
予測確率 p = softmax(z)
損失 L = -log(p[正解文字])
誤差 d[j] = p[j] - (j が正解なら 1)
W, b, E を勾配に沿って更新
次の文字を p に従い抽選 → 繰り返す
プログラミングの見どころ(ソースを見る順序)
  1. buildCorpus():文字をトークンIDへ置き換える
  2. initializeModel():ランダムな重みの配列を作る
  3. predict():スコアをsoftmax確率に変換
  4. trainOne():正解との誤差から重みを更新
  5. generateText():予測→抽選→次の予測を反復
  6. render...:計算結果を画面の部品に描画

次の発展

v0.2:複数文字を入力して文脈を持たせる。v0.3:1-head causal self-attention+位置埋め込みを実装する。v0.4:小規模Transformerを実際に学習させる。これらはまだ本ファイルには実装していません。