Tiny Language Model Lab v0.1
極小の文字予測モデルを、Androidのブラウザ内で学習・観察する実験室。通信・外部ライブラリ・アカウント不要。
ニューラル・ビグラム(1文字だけ参照)重要:これはLLMやTransformerそのものではありません。LLMで使われるトークン、埋め込み、確率分布、損失関数、勾配降下、自己回帰生成を、Attentionを加える前に切り出した教材です。学習データ外の知識はありません。
1. 学習用テキスト
1行=1文として扱います。改行ごとに開始・終了の特別トークンを付けます。最初は8文だけです。
2. 学習する(数値を更新する)
0完了エポック
0パラメータ更新回数
—平均損失(小さいほど良い)
—困惑度 / perplexity
—語彙数(特殊記号含む)
—学習パラメータ数
「1例だけ学習」を押すと、1件の正解トークンに対する確率の変化が見られます。
エポック=学習テキストから作った全(前の文字→次の文字)組を1巡すること。損失は自然対数を使用。
3. 予測確率を比較する
右側の「実測」は教材内で次に出現する文字を単純集計した割合。左側の「ニューラル」はモデルが学習した確率です。初期状態で両者は一致しません。
ニューラル実測(カウント)
選択文字の埋め込みベクトル
4個の小数が学習で動きます。このモデルでは「直前の1文字」だけを4次元の数値列に変換しています。
4. 新しい文字列を生成する
未生成
生成時の選択記録
生成ボタンを押すと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 に従い抽選 → 繰り返す
プログラミングの見どころ(ソースを見る順序)
buildCorpus():文字をトークンIDへ置き換えるinitializeModel():ランダムな重みの配列を作るpredict():スコアをsoftmax確率に変換trainOne():正解との誤差から重みを更新generateText():予測→抽選→次の予測を反復render...:計算結果を画面の部品に描画
次の発展
v0.2:複数文字を入力して文脈を持たせる。v0.3:1-head causal self-attention+位置埋め込みを実装する。v0.4:小規模Transformerを実際に学習させる。これらはまだ本ファイルには実装していません。