このページの本文へ

田口和裕の「ChatGPTの使い方!」 第20回

「ExcelでChatGPTを再現するシート」が想像以上に素晴らしかった

2024年03月08日 09時00分更新

文● 田口和裕

  • この記事をはてなブックマークに追加
  • 本文印刷

GPT-2の処理の流れ

GPT-2の処理の流れ

 まずはこの図を見てほしい。一番左の「GPT2 Phase」はGPT-2のそれぞれの処理(フェーズ)を、「Action」はそれぞれの処理でやっていること、「Tab in Spreadsheet」は対応するExcelのシート名をあらわしている。

 Excelで左から右へタブを実行していくことで、この図の上から下まで、つまり入力(Input)から出力(Output)までを再現できるわけだ。

 それでは、一番上(Excelでは一番左)の「Input」フェーズから順に見ていくことにしよう。

「Input」フェーズ

「Type_Prompt_Here」シート

 「Input」フェーズは文字通りプロンプトを入力するフェーズで「Type_Prompt_Here」シートが使用される。

 2列目の「Type Prompt Below Here」の下のセルに、プロンプトを一単語ずつ(カンマやスペースも1単語と換算)入力する。

 

 初期状態ではサンプルとして「Mike」「is」「quick」「.」「He」「moves」と、ピリオドを含む6単語が入力されており、つなげると「Mike is quick. He moves(マイクは早い。彼は〇〇動く)」となる。

 そして4列目の「Predicted Next Token(予測された次のトークン)」の下には「quickly」と表示されている。

 つまり、GPT-2は「Mike is quick. He moves」という文字列の次に出てくる単語として「quickly(早く)」という形容詞が一番可能性が高いと予測したことになる。

プロンプトを変更

 では、新しいプロンプトを入力しよう。今回はサンプルを少し変更して「Lisa」「is」「slow」「.」「She」「moves」の6文字を入力した

 つなげると「Lisa is slow. She moves(リサは遅い。彼女は◯◯動く)」となり、正解はおそらく「Slowly」になるはずだ。なってくれ。

Tokenization(BPE)フェーズ

 「Tokenization(BPE)」フェーズでは、「Input」に入力した単語をトークンに対応させる処理が実行される。

 トークンとは、LLMがテキストデータを処理する際に使用される基本的な単位だ。具体的には、単語、文字、またはサブワード(単語の一部)を指す。

 

「id_to_tokens」シート

 実はGPT-2は(そして他のLLMも)利用するであろうすべてのトークンのリストを持っており、「id_to_tokens」シートで見ることができる。これを見るとサンプルで登場した「Mike」という単語のトークンIDは「16073」ということがわかる。

 なお、GPT-2のトークンリストには50256個のトークンが登録されている。このフェーズでは入力された単語をこのシートから探して該当のトークンIDを出力する作業をするわけだ。

 サンプルの入力はこのようになっていた。ちなみに「.(ピリオド)」にも「13」というトークンIDが振られている。

 処理を進めるために「シート再計算」をクリックしよう。

 30秒ほどで結果が表示された。

「id_to_tokens」シート

 「id_to_tokens」シートで確かめると「Lisa」のトークンIDは「44203」だ。

 ここで1つ疑問が。単語がリスト内になかった場合はどうなるのだろう。

「Prompt_to_Tokens」シート

 GPT-2ではBPE(Byte Pair Encoding)というアルゴリズムが採用されており、入力された単語がトークンのリストになかった場合には分割される。例えば仮に「dispense」という単語がリストにない場合は「dis」「pens」のように「サブワード」と呼ばれる単位に分割し、そのサブワードがリストに存在すれば、それぞれのトークンIDを振るという仕組みになっている。

「Constants」シート

 「Prompt_to_Tokens」シートの右側の「Constants」シートには各種設定パラメーターが表示されている。これはLLMの基本的な構造と機能を定義するためのものなので、そのままにしておこう。

「Text & Position Embeddings」フェーズ

 インプットのトークン化が終わったら、各トークンはそのトークンの意味や文脈を数値で表した「埋め込みベクトル」と呼ばれる高次元の数値ベクトルに変換される。これは、モデルがトークンの意味を理解する上での基礎となる表現だ。

 もう少し詳しく説明すると、埋め込みベクトルとは、すべてのトークンを意味的に近い単語が高次元ベクトル空間上で近い位置にマッピングされるように、多次元ベクトル表現に変換する方法だ。

 多次元というとSFっぽく聞こえるが、ここでの「次元」とは具体的な物理的空間をあらわすのではなく、データを表現するための「特徴量」や「属性」のことであり、次元数が多ければ多いほど、より詳細な意味関係をエンコーディングできる。例えばGPT-2は726次元、つまり726の値を持つベクトルとして表現されている。

 なお、近年の言語モデルはさらに高次元なベクトルを使用する傾向にあり、GPT-3では1万2288次元ものベクトルが使われている。次元数が多ければ多いほど、より細かい意味の違いまでとらえられる可能性がある一方で、次元が増えすぎると、一つ一つの次元がどんな意味をあらわしているのか、人間からはなかなか理解しづらくなってしまうという傾向がある。加えて、次元数が多くなればモデルの大きさや計算リソースの要求量も増え、扱いづらくなる点にも注意が必要だ。

 では「シート再計算」を押して処理を実行しよう。

「Token_to_Text_Embeddings」タブ

 1行目が入力した単語、2行目がトークンID、そして3行目以降が埋め込みベクトルだ。

「Token_to_Text_Embeddings」タブ

 GPT2の次元数は768なので、770(−2)列まで数値が並んでいるのがわかる。

「Token_to_Text_Embeddings」タブ

 GPT-2は文内のトークンの位置も考慮されるため、位置埋め込み(Positional Encoding)と呼ばれる別のベクトルも算出され、その数値は先程のトークン埋込みに加算される。これにより、モデルはトークンの順序や文脈を理解することができるようになる。

カテゴリートップへ

この連載の記事
ピックアップ