はじめに
前回の記事では、ローカルLLMとは何なのか、ChatGPTとの違いを通して基本的な仕組みについて整理しました。
今回はもう少し踏み込んで、そもそもLLMはどうやって文章を生成しているのか?について理解を深めていきます。
私たちがChatGPTなどのLLMに質問すると、まるで人間が文章を考えて回答しているように見えます。
しかしLLMが文章を生成する仕組みは、人間が文章を考える仕組みとは大きく異なります。
今回は、
- トークンとは何か
- LLMはどのように文章を生成しているのか
- 推論とは何か
- コンテキストウィンドウとは何か
- 学習と推論は何が違うのか
といった内容を中心に整理していきます。
LLMは文章をどのように扱っているのか
私たちは文章を読むとき、基本的には文字や単語として内容を理解します。
一方、LLMは入力された文章をそのまま扱っているわけではありません。
LLMでは文章を トークン(Token) と呼ばれる単位に分割して処理します。
例えば、
今日はいい天気ですね
という文章があったとします。
イメージとしては、
今日はいい天気ですね
│
▼
トークンに分割
│
▼
[今日] [は] [いい] [天気] [です] [ね]
のように、LLMが扱いやすい単位へ分割されます。
実際の分割方法はモデルが利用しているTokenizerという仕組みによって異なるため、必ずしも単語ごとに分割されるわけではありません。
日本語の場合も、1文字が1トークンになる場合もあれば、複数の文字が1つのトークンとして扱われる場合もあります。
トークンとは?
トークンとは、LLMが文章を処理するときに使用する基本的な単位です。
LLMは私たちが入力した文章をトークンに変換し、それぞれを数値として扱います。
イメージすると、
今日はいい天気ですね
│
▼
[今日] [は] [いい] [天気] [です] [ね]
│
▼
[128] [42] [816] [305] [91] [73]
のような形です。
実際にはこの数値がさらにベクトルと呼ばれる数値の集まりへ変換され、LLM内部で計算されます。
つまりLLMから見ると文章は文字の集まりではなく、数値として処理できるデータとして扱われています。
LLMは「次に来るトークン」を予測している
では、トークンに変換された文章からどのように回答を生成しているのでしょうか。
LLMの文章生成を非常にシンプルに表すと、これまでの文章から、次に来る可能性が高いトークンを予測する、という処理を繰り返しています。
例えば、
今日は天気がいいので
という文章が入力されたとします。
LLMはこれまでの文章をもとに、
散歩 30%
外 20%
公園 15%
家 5%
...
のように、次に続きそうなトークンの確率を計算します。
そこからトークンを一つ選び、
今日は天気がいいので散歩
となったら、今度はこの文章をもとに次のトークンを予測します。
今日は天気がいいので散歩
│
▼
次のトークンを予測
│
▼
今日は天気がいいので散歩に
│
▼
次のトークンを予測
│
▼
今日は天気がいいので散歩に行き
│
▼
...
この処理を繰り返すことで、最終的に私たちが読んでいる文章が生成されます。
一見するとLLMが回答を考えて一気に文章を書いているように見えますが、内部ではトークンを一つずつ生成しています。
推論とは?
前回の記事でも登場した推論(Inference)という言葉についても整理しておきます。
推論とは、学習済みのモデルに入力を与えて、結果を生成する処理のことです。
例えばChatGPTに、
日本の首都はどこですか?
と入力して、
日本の首都は東京です。
と回答が生成されるまでの処理が推論です。
先ほど説明した、
入力
│
▼
トークンに変換
│
▼
モデルによる計算
│
▼
次のトークンを予測
│
▼
トークンを生成
│
▼
再び次のトークンを予測
│
▼
...
│
▼
回答
という一連の処理が行われています。
ローカルLLMでは、この推論処理を自分のPCに搭載されているGPUやCPUを使って実行することになります。
そのため、モデルの大きさやPCの性能によって回答の生成速度などが変わってきます。
コンテキストウィンドウとは?
LLMについて調べていると、コンテキストウィンドウ(Context Window)という言葉もよく登場します。
コンテキストウィンドウとは、簡単に言えば LLMが一度の処理で扱えるトークン量の上限 です。
例えば、
コンテキストウィンドウ
32,000トークン
のモデルであれば、その範囲内で会話履歴や入力した文章などを扱うことができます。
会話が長くなったり大量の文章を入力したりすると、それだけ多くのトークンを扱う必要があります。
ローカルLLMでは長いコンテキストを扱うほど必要なメモリ量や計算量も増えるため、コンテキストウィンドウもハードウェアを考える上で重要な要素になります。
学習と推論の違い
LLMを理解する上でもう一つ押さえておきたいのが、学習(Training)と推論(Inference)の違いです。
学習とは、大量のデータを使ってモデル内部のパラメータを調整していく処理です。
一方で推論は、その学習済みモデルを使って回答を生成する処理です。
簡単に整理すると、
大量の学習データ
│
▼
学習
(Training)
│
▼
学習済みモデル
│
▼
推論
(Inference)
│
▼
回答
という関係になります。
私たちがChatGPTを利用したり、ローカルLLMを自分のPCで動かしたりするときに主に行っているのは推論です。
LLMをローカルで動かすからといって、毎回モデルを一から学習させているわけではありません。
すでに学習されたモデルをダウンロードし、自分のPC上で推論を実行するのが一般的なローカルLLMの利用方法です。
なぜGPUが重要なのか
前回の記事では、ローカルLLMを構成するものとしてGPUについて触れました。
今回の内容を踏まえると、なぜGPUが重要なのかも少し見えてきます。
LLMが文章を生成するときには、内部で非常に多くの数値計算が行われています。
さらに、文章を生成するために次のトークンを予測する処理を何度も繰り返します。
入力
│
▼
大量の数値計算
│
▼
次のトークン
│
▼
大量の数値計算
│
▼
次のトークン
│
▼
...
こうした大量の計算を高速に処理することをGPUは得意としています。
そのためローカルLLMでは、どのGPUを使うのかがモデルの選択や生成速度に大きく関係してきます。
ただし、GPUであれば何でも良いというわけではありません。
ローカルLLMではGPUの性能だけでなく、搭載されているVRAMも非常に重要になります。
このあたりは今後の記事で詳しく整理していきます。
用語集
今回の記事で登場した用語を簡単に整理します。
| 用語 | 概要 |
|---|---|
| LLM | Large Language Model(大規模言語モデル)。大量のデータから学習し、文章の生成などを行えるAIモデル。 |
| トークン(Token) | LLMが文章を処理するときに使用する基本的な単位。文字数や単語数とは必ずしも一致しない。 |
| Tokenizer | 入力された文章をトークンへ分割するための仕組み。モデルによって分割方法が異なる。 |
| 推論(Inference) | 学習済みモデルに入力を与え、回答などの結果を生成する処理。 |
| コンテキストウィンドウ | LLMが一度の処理で扱えるトークン量の上限。 |
| 学習(Training) | 大量のデータを使ってモデル内部のパラメータを調整する処理。 |
| パラメータ | モデルが学習によって獲得した数値。LLMが予測を行う際に利用される。 |
| GPU | 大量の計算を並列に処理することが得意な演算装置。LLMの推論を高速化するために利用される。 |
| VRAM | GPUに搭載されているメモリ。ローカルLLMでは動かせるモデルの大きさなどに関係する。 |
さいごに
こうして初心に戻って整理してみると、曖昧になっていた知識が洗い出され、自分自身の理解も深まるので良いですね。
AIはもはや生活に欠かせないツールになりつつあります。今後、より効率的に活用していくためにも、引き続き理解を深めていきたいと思います。