LLM(ChatGPTなどの仕組み)を、最小のモデル(モデル1)から GPT-2 small 級(モデル8)まで、自分の手で順番に作り、「学習すると何が起きるか」を目で見て確かめるプロジェクト
モデルの中身は、22,946個の数字(重み)だけです。最初はすべてランダムで、賢さはゼロ。 文章で「次に来る単語を当てる練習」(学習)をさせると、重みが少しずつ直って、意味の通る文が作れるようになります。
おすすめの順番: ①【3】で学習前に生成してみる(デタラメ) → ②【2】で「学習100回」を押す → ③【3】でもう一度生成してみる → ④【1】で、数字がどう変わったかを見る。 重みはこのブラウザの中に保存されるので、ページを開き直しても学習の続きから始められます(他の人の画面には影響しません)。
モデルを切り替えても、それぞれのモデルの学習の続きは、このブラウザの中に別々に保存されています。
学習しても、モデルの形(語彙数・次元数・層数など)は変わりません。変わるのは重みの値だけです。
文を1つ入れたとき、モデルの中で数字(ベクトル)がどう変わっていくかを表示します。 計算には今の重み(【2】で学習した結果)を使うので、学習の前後で見比べると、数字が変わっていることが分かります。 ここで見るだけでは、重みは変わりません。
単語はスペース区切り。語彙一覧にある単語のみ使えます(前後に <BOS>(文の開始)/<EOS>(文の終了) が自動で付きます)。
スペースを入れなくても、語彙の単語に自動で区切ります(語彙の中で一番長く一致する単語から順に取ります)。 語彙に無い部分は <UNK>(不明な単語)になります。前後に <BOS>(文の開始)/<EOS>(文の終了) が自動で付きます。
下のボタンを押すと、用意した文章(一番下の【参考】)を使って、重みを更新します。
1回の学習では、文章の中からランダムに32文を選び、
各位置で「次の単語」を予測させ、正解の単語に高い確率を与えられるように、重みを少しだけ直します。
これを何度も繰り返すのが「学習」です。ボタンの回数は、この更新の回数です。
文章のうち約1割(-文)は検証データとして取り分けてあり、学習には使いません。 学習に使っていない文をどれだけ当てられるかで、「丸暗記(過学習)」していないかを確かめます。 「少しだけ」を選ぶと、重みの数に比べて文が少ないので、学習データは丸暗記できても、検証データは当てられなくなっていく様子が見られます。 切り替えると、学習は最初からやり直しになります。
学習リセット: 学習前の状態(今と同じ乱数シードの初期値)に戻します。 乱数シードのリセット: 新しい乱数シードを選び直し、別のランダムな初期値から、最初からやり直します。 押しても、ボタンの回数は積み上がります(例: 100回 → 200回で、合計300回)。
行が「今の単語」、列が「次に来る単語」です。数字は、文章中のその単語が出てくるすべての位置で、モデルが出した「次の単語の確率」(%)の平均です。 青(薄い青)は確率が低く、赤に近いほど確率が高いことを表します。お手本(文章の中で実際に次に来た割合)に近づくほど、学習できています。
語彙が約100あるので、単語を品詞ごと(名詞は「動物」「人」「食べ物」…の意味のまとまりごと、助詞は1つずつ)にまとめて表示します。 行が「今の単語」、列が「次に来る単語」です。数字は、学習データの中でその品詞の単語が出てくるすべての位置で、モデルが出した「次の単語の確率」(%)の平均です(列の品詞に入る単語の確率を足したもの)。 青(薄い青)は確率が低く、赤に近いほど確率が高いことを表します。お手本(学習データの中で実際に次に来た割合)に近づくほど、学習できています。
Mac で学習している途中で、同じ書き出しから文を作らせた記録です(温度1.0、全部の単語から選ぶ)。 学習前はデタラメな単語の並びですが、学習が進むにつれて、助詞のつながりや、学習した文章らしい言い回しが出てきます。
文の途中までを入れると、その次に来る単語の確率を、高い順に10個表示します。語彙が1,000あるので、全部ではなく上位だけを見ます。
例として、の次に来る単語を、上位5件で比べます。 学習前と現在で、確率がどう変わったかを見てください。
会話の履歴も一緒にモデルに渡します。一度に読める長さ(256トークン)を超えると、古い発言から捨てます。
【2】で学習した今の重みを使って、続きの文章を作ります。 次の単語の確率を出し、その確率に従ってサイコロを振って1語選び、それを繰り返して(自己回帰)、<EOS>(文の終了)が出るまで続けます。 サイコロを振るので、押すたびに違う文が出ます。
温度: 小さいほど確率の高い単語ばかり選ぶ(無難だが単調)、大きいほど低い確率の単語も選ぶ(多彩だが崩れやすい)。 top-k: 確率の高い上位k語の中からだけ選ぶ(めったに出ない変な単語を防ぐ)。 <UNK>を選ばない: 語彙に入らなかった単語(文章の約17%)は、すべて <UNK> という1つの記号にまとめてあるので、モデルはこれをとてもよく選びます。 読める文にするため、選ばないようにできます(チェックを外すと、モデルそのままの出力になります)。
スペースを入れなくても、語彙の単語に自動で区切ります。空のまま「生成開始」を押すと、最初の1語目から作ります。
単語はスペース区切りです。読点「、」も1つの単語として、前後にスペースを入れて入力します(例: 猫 が 寝る 、)。 空のまま「生成開始」を押すと、最初の1語目から作ります。
LLM は、日本語の使い方と一緒に、文章の背景にある常識や知識も学びます。 ここでは、「日本の首都は」のような書き出しと4つの選択肢を用意し、それぞれの選択肢を「続き」として読ませて、 モデルがいちばん自然だと思った(確率の高い)ものを、モデルの答えとします。 選択肢の長さで有利・不利が出ないよう、1トークンあたりの確率で比べています(選択肢が1トークンなら、確率をそのまま比べるのと同じ)。 当てずっぽうなら、4問に1問(25%)は正解します。
対象は、本物の文章で学習したモデル(モデル3〜)です。モデル1・2は語彙が小さすぎて、問題文を表せません。 語彙に無い文字を含む選択肢(<UNK> になる)があると、そのモデルでは比べられないので「−(解けない)」にしています。
書き出しと、選択肢(2〜4個。いちばん上を正解にする)を入れて、「解かせる」を押してください。
【2】の学習では、下の-文から、ランダムに選んで使っています。