大規模言語モデル (LLM)
注
詳細については、「 テキストと画像 」タブを参照してください。
生成 AI の中核となる大規模言語モデル (LLM) とそのよりコンパクトな関係である小さな言語モデル (SMM) は、単語と語句の間の言語的および意味的な関係をボキャブラリにカプセル化します。 モデルでは、これらのリレーションシップを使用して自然言語入力を推論し、意味のある関連する応答を生成できます。
基本的に、LLM は プロンプトに基づいて補完を生成するようにトレーニングされています。 多くの携帯電話の予測テキスト機能の非常に強力な例と考えてください。 プロンプトは、意味的に正しい完了となる一連のテキスト予測を開始します。 このトリックは、モデルが単語間の関係を理解し、シーケンス内のどの単語が次の単語に影響を与える可能性が最も高いかを特定できることです。これを使用して、シーケンスの最も可能性の高い継続を予測します。
たとえば、次の文を考えてみましょう。
私は犬が猫に向かって大声で吠えるのを聞いた
仮に、最初のいくつかの単語を聞いただけだとしましょう: "犬の声が聞こえました..." これらの単語の一部は、他の単語よりも次の単語が何であるかについてのより役立つ手掛かりであることを知っています。 「聞いた」と「犬」は次に来るものの強力な指標であり、確率を絞り込むのに役立ちます。 「犬の吠え声が聞こえた」として文が続く可能性が高いことがわかります。
次の単語を推測できるのは、次の理由です。
- あなたは、大きなボキャブラリから単語を引き出すことができます。
- あなたは一般的な言語構造を学んだので、意味のある文で単語がどのように相互に関連しているかを知っています。
- 単語に関連するセマンティックの概念を理解している - 聞 いた 何かが何らかの音でなければならないことを知っていて、 犬によって作られた特定の音があることを知っています。
では、これらの同じ能力を持つモデルをトレーニングするにはどうすればよいでしょうか。
トークン化
最初のステップは、単語やフレーズからなる非常に大きなボキャブラリをモデルに提供することです。本当に大規模なのです。 最新世代の LLM には、インターネットやその他のソースからの大量のトレーニング データに基づいて、数十万のトークンで構成されるボキャブラリがあります。
ちょっと待ってください。 トークン?
私たちは言語を単語の観点で考える傾向がありますが、LLMはボキャブラリをトークンに分解します。 トークンには、単語だけでなく、 サブ単語 ("信じられない" や "可能性が低い" の "un" など)、句読点、およびその他の一般的に使用される文字シーケンスも含まれます。 そのため、大規模な言語モデルをトレーニングする最初の手順は、トレーニング テキストを個別のトークンに分割し、次のように一意の整数識別子をそれぞれに割り当てることです。
- I (1)
- heard (2)
- a (3)
- 犬 (4)
- 樹皮 (5)
- 大声で (6)
- 向かって (7)
- a (3) 既に割り当てられている
- cat (8)
その他にもあります。
トレーニング データを追加すると、ボキャブラリにトークンが追加され、識別子が割り当てられます。そのため、 子犬、 スケートボード、 車などの単語のトークンが付く可能性があります。
注
この簡単な例では、 単語に基づいてサンプル テキストをトークン化しました。 実際には、サブワード、句読点、およびその他のトークンもあります。
トランスフォーマーを使用したトークンの変換
一意の ID を持つトークンのセットが作成されたので、それらを相互に関連付ける方法を見つける必要があります。 これを行うには、各トークンに ベクトル ([1, 23, 45] のような複数の数値の配列) を割り当てます。 各ベクターには複数の数値 要素 または 次元があり、これらを使用してトークンの言語属性とセマンティック属性をエンコードし、トークンの 意味 と、トークンが他のトークンとどのように関連しているかに関する多くの情報を効率的な形式で提供するのに役立ちます。
トークンの初期ベクター表現を、トレーニング データに表示されるコンテキストに基づいて、言語的特性とセマンティック特性が埋め込まれた新しいベクトルに変換する必要があります。 新しいベクトルにはセマンティック値が埋め込まれているため、 埋め込みと呼びます。
このタスクを実行するには、 トランスフォーマー モデルを使用します。 この種類のモデルは、次の 2 つの "ブロック" で構成されます。
- アテンションと呼ばれる手法を適用して埋め込みを作成するエンコーダー ブロック。 アテンション層は、各トークンを順番に調べ、その周囲のトークンによってどのように影響されるかを決定します。 エンコード プロセスをより効率的にするために、 マルチヘッド アテンションを使用して、トークンの複数の要素を並列で評価し、新しいベクター要素値の計算に使用できる重みを割り当てます。 アテンション層の結果は、埋め込みの最適なベクター表現を見つけるために、完全に接続されたニューラル ネットワークに供給されます。
- エンコーダーによって計算された埋め込みを使用して、プロンプトによって開始されたシーケンス内の次に最も可能性の高いトークンを決定する デコーダー レイヤー。 デコーダーは、アテンションとフィードフォワード ニューラル ネットワークを使用して予測を行います。
注
説明と図のトランスフォーマーのアーキテクチャとプロセスが大幅に簡略化されました。 注意のしくみの具体的な詳細についてあまり心配しないでください。重要な点は、使用されるコンテキストに基づいて各トークンの言語的特性とセマンティック特性をキャプチャするのに役立つということです。 トランスフォーマーアーキテクチャとその注意機構の利用方法について詳しく知りたい場合は、元のAttention is all you need 論文を読むことができます。
初期ベクトルと位置エンコード
最初に、トークン ベクター値は、トランスフォーマーを介して埋め込みベクターを作成する前にランダムに割り当てられます。 トークン ベクトルは、トークンがトレーニング テキストのシーケンス内のどこに表示されるかを示す 位置エンコード と共にトランスフォーマーに供給されます (トークンがシーケンスに出現する順序は相互の関係に関連するため、これを行う必要があります)。 たとえば、トークンは次のように始まる場合があります。
| トークン | トークン ID | 位置 | Vector |
|---|---|---|---|
| I | 1 | 1 | [3, 7, 10] |
| 聞いた | 2 | 2 | [2, 15, 1] |
| am | 3 | 3 | [9, 11, 1] |
| 犬 | 4 | 4 | [2, 7, 11] |
| 樹皮 | 5 | 5 | [9, 12, 0] |
| 大声で | 6 | 6 | [3, 8, 13] |
| at | 7 | 7 | [5, 7, 10] |
| am | 3 | 八 | [9, 11, 1] |
| 猫 | 八 | 9 | [8, -6, 9 ] |
| ... | ... | ... | ... |
| 子犬 | 127 | 45 | [7, 7, -2] |
| 車 | 128 | 56 | [5, -5, 1 ] |
| スケートボード | 129 | 67 | [4, 7, 14] |
注
3 つの要素のみを持つベクターを使用して、単純にしました (これは後で 3 次元で視覚化するのに役立ちます)。 実際には、ベクトルには何千もの要素があります。
注意と埋め込み
埋め込まれたコンテキスト情報を含むトークンのベクター表現を決定するために、トランスフォーマーは アテンション 層を使用します。 アテンション 層は、出現するトークンのシーケンスのコンテキスト内で、各トークンを順番に考慮します。 現在のトークンの周囲のトークンは影響を反映するように重み付けされ、重みは現在のトークンの埋め込みベクトルの要素値の計算に使用されます。 たとえば、「犬の吠えるのを聞いた」というコンテキストでトークン「吠える」を考慮すると、「I」と「a」よりも「heard」と「dog」のトークンに重みが割り当てられます。これは、「吠える」の指標としてこれらが強いからです。
最初は、どのトークンが他のトークンに影響を与えるかはモデルで "認識" されません。しかし、大量のテキストに公開されると、どのトークンが一緒に表示されるかを繰り返し学習し、近接性と使用頻度に基づいてトークンの言語的特性とセマンティック特性を反映するベクター要素に値を割り当てるのに役立つパターンを見つけ始めることができます。 このプロセスは、 複数のヘッド アテンションを使用してベクトルのさまざまな要素を並列で考慮することで、より効率的になります。
エンコード プロセスの結果は、一連の埋め込みになります。ボキャブラリ内のトークンが相互にどのように関連しているかに関するコンテキスト情報を含むベクトル。 実際のトランスフォーマーは、何千もの要素を含む埋め込みを生成しますが、シンプルにするために、この例では 3 つのベクトルのみを持つベクトルにこだわりましょう。 ボキャブラリのエンコード プロセスの結果は、次のようになります。
| トークン | トークン ID | 埋め込み |
|---|---|---|
| I | 1 | [2, 0, -1] |
| 聞いた | 2 | [-2, 2, 4 ] |
| am | 3 | [-3, 5, 5 ] |
| 犬 | 4 | [10, 3, 2 ] |
| 樹皮 | 5 | [9, 2, 10 ] |
| 大声で | 6 | [-3, 8, 3 ] |
| at | 7 | [-5, -1, 1] |
| 猫 | 八 | [10, 3, 1] |
| 子犬 | 127 | [5, 3, 2 ] |
| 車 | 128 | [-2, -2, 1 ] |
| スケートボード | 129 | [-3, -2, 2 ] |
| 樹皮 | 203 | [2, -2, 3 ] |
注意していると、トークン "bark" の 2 つの埋め込みが結果に含まれていることに気付いたかもしれません。 埋め込みは特定の コンテキスト内のトークンを表していることを理解することが重要です。一部のトークンは、複数のことを意味するために使用される場合があります。 たとえば、犬の樹皮は木の樹皮とは異なります! 複数のコンテキストで一般的に使用されるトークンは、複数の埋め込みを生成できます。
埋め込みの要素は、多次元ベクトル空間の次元と考えることができます。 この単純な例では、埋め込みには 3 つの要素しかないため、次のように 3 次元空間のベクトルとして視覚化できます。
ディメンションは、トークンが言語的にどのように相互に関連しているかに基づいて計算されるため、類似のコンテキストで使用されるトークン (したがって、同様の意味を持つ) は、同じような方向のベクトルになります。 たとえば、「犬」と「子犬」の埋め込みは、多かれ少なかれ同じ方向を指しています。これは、"cat"の埋め込みとあまり変わりません。しかし、「スケートボード」や「車」の埋め込みとは大きく異なります。 ベクトルの コサイン類似性 を計算することで、トークンが互いにどの程度近いかを意味的に測定できます。
プロンプトからの入力候補の予測
トークン間のコンテキスト関係をカプセル化する埋め込みのセットが作成されたので、トランスフォーマーの デコーダー ブロックを使用して、開始 プロンプトに基づいてシーケンス内の次の単語を繰り返し予測できます。
ここでも、 コンテキスト 内の各トークンを考慮するために注意が使用されます。ただし、今回考慮されるコンテキストには、予測しようとしているトークンの 前 にあるトークンのみを含めることができます。 デコーダーモデルは、すでに完全なシーケンスを持つデータを使用し、現在のトークンの後のトークンを無視するマスクドアテンションと呼ばれる手法を適用してトレーニングされます。 トレーニング中に次のトークンは既にわかっているので、トランスフォーマーはそれを予測されたトークンと比較し、後のトレーニング イテレーションで学習した重みを調整して、モデルのエラーを減らすことができます。
次のトークンが不明な新しい完了を予測する場合、アテンション 層は次のトークンの可能なベクトルを計算し、フィードフォワード ネットワークを使用して最も可能性の高い候補を特定します。 その後、予測値がシーケンスに追加され、プロセス全体が繰り返され、 次 のトークンが予測されます。シーケンスが終了したとデコーダーが予測するまでなどです。
たとえば、シーケンス "When my dog was a ..." を指定すると、モデルはこれまでにシーケンス内のトークンを評価し、重みを割り当てるために注意を払い、次に最も可能性の高いトークンが "cat" や "skateboard" ではなく "子犬" であると予測します。