HUOXIU

LLMエンジニアとして始める:生成AIのシンプルなガイド

編集者注:大規模モデルの開発は約2年にわたっており、Baihai IDPでは、最先端の議論、実践的な応用、使用経験など、LLMの様々な側面に関する100近くの技術的知見を共有してきました。しかし、振り返ってみると、LLMの基本原理をゼロから真剣に探求したことはなかったようです。

最近、企業のクライアントやパートナーから、LLM(経営学修士)をゼロから学ぶための入門講座があるかどうかという問い合わせがありました。彼らは次のように話していました。

LLMは多くの場面で私たちの仕事や生活に浸透していますが、その内部の動作メカニズムについては未だ解明すべき謎が多く残っています。

LLMを適用する際、その「ブラックボックス」な運用は、出力を完全に信頼することを困難にするだけでなく、さらなる研究や最適化を妨げます。LLMの仕組みを理解しなければ、その限界を評価し、的を絞ったソリューションを開発することは困難です。

したがって、LLM の基本原則に関するこの記事をすべての人にお勧めします。

この記事は、生成AIの理解を深めたい開発者、テクノロジー愛好家、リーダー、そして研究者に向けて書かれています。分かりやすい言葉を用いて、大規模言語モデルの内部構造と学習プロセスを体系的に分析し、トークンや次のトークンの予測から、マルコフ連鎖やニューラルネットワークといったコア概念に至るまで、LLMがどのようにテキストを生成するかを段階的に明らかにします。

著者 |ミゲル・グリンバーグ

編纂者:岳陽

大規模言語モデル[1](LLM)に関するニュースが私たちの日常生活に頻繁に登場するようになり、生成型人工知能[2](GenAI)はもはや無視できない存在となっています。もしかしたら、ChatGPT[3]を体験したことがあるかもしれませんし、日常生活のちょっとしたアシスタントとして活用したことがあるかもしれません。

このGenAI革命に直面して、多くの人が疑問を抱いています。これらのモデルの見かけ上の知性は、一体どこから来るのでしょうか?この記事では、複雑な数式を使わず、シンプルで分かりやすい言葉を用いて、生成テキストモデルの動作原理を明らかにします。これにより、生成テキストモデルが魔法ではなく、コンピューターアルゴリズムの産物であることを理解していただけるでしょう。

01 LLM は何をするのですか?

まず、大規模言語モデルの仕組みに関する大きな誤解を解きたいと思います。多くの人は、これらのモデルが私たちの質問に答えたり、私たちと会話したりできると考えていますが、実際には、私たちが入力したテキストに基づいて、次の単語(より正確には、次のトークン)を予測することしかできません。

それでは、トークンから始めて、LLM の謎の背後にある「素顔」を段階的に明らかにしていきましょう。

1.1 トークン

トークンは、大規模言語モデル(LLM)がテキストを処理する際に使用する基本単位です。トークンを単純に単語と考えることもできますが、LLMの目的はテキストを可能な限り効率的にエンコードすることです。そのため、多くの場合、トークンは単語よりも短い、または長い文字列になります。句読点やスペースもトークンとして存在し、単独で、または他の文字と組み合わせて表現できます。

LLMが使用するすべてのトークンは、あらゆるテキスト内容を表現できる語彙を構成します。大規模言語モデルでは通常、BPE(Byte Pair Encoding)[4]アルゴリズムを用いて、入力データセットに基づいてトークン語彙を作成します。例えば、GPT-2言語モデル[5](詳細に研究できるオープンソースモデル)は、50,257トークンの語彙を有しています。

各トークンは、LLM語彙の中で一意の識別子(通常は数値)を持ちます。LLMはトークナイザーを用いて、通常のテキスト文字列をトークン番号の列に変換します。Pythonに精通していて、トークンの操作を試してみたい場合は、OpenAIが提供するtiktokenパッケージをインストールできます。

次に、Python コマンドラインで次の操作を試してください。

この実験では、GPT-2言語モデルの語彙において、トークン464が「The」という単語に対応し、トークン2068が「quick」に対応していることが分かります。このトークンには単語の前のスペースが含まれています。このモデルでは、ピリオドはトークン13で表されます。

トークンはアルゴリズムによって決定されるため、いくつかの特殊なケースに遭遇する可能性があります。例えば、GPT-2は「the」という単語の以下の3つの形式を異なるトークンにエンコードします。

BPEアルゴリズムは、必ずしも単語全体を単一のトークンに直接変換するわけではありません。実際、あまり使用されない単語は個々のトークンとして表現されるのではなく、複数のトークンの組み合わせを使用してエンコードされます。次の例は、GPT-2モデルが2つのトークンのシーケンスを使用して単語をエンコードする方法を示しています。

1.2 次のトークン予測

前述のように、言語モデルは与えられたテキストに基づいて次に出現する可能性のあるトークンを予測します。次のPython擬似コードは、これらのモデルを用いて次のトークンを予測する方法を示しています。

この関数は、ユーザーの入力プロンプトから変換されたトークンのリストをモデルへの入力として受け取ります。ここでは、各単語が独立したトークンであると仮定しています。簡潔にするために、ここでは各トークンをテキスト形式で使用していますが、実際には各トークンは数値としてモデルに渡されます。

この関数は、語彙内の各トークンに、入力テキストの直後に出現する確率を割り当てる独自のデータ構造を返します。GPT-2モデルを使用する場合、返される値は50,257個の浮動小数点数のリストとなり、各数値は対応するトークンがテキストコンテンツの直後に出現する確率を表します。

上記のケースでは、適切に学習された言語モデルは、「The quick brown fox」というフレーズに続くトークン「jumps」に高い確率を割り当てると想定できます[6]。同様に、モデルが適切に学習されていれば、「potato」のようなランダムな単語がこのフレーズに続く確率ははるかに低くなり、ほぼ0に近くなります。

言語モデルが合理的な予測を行うには、トレーニングプロセスが必要です。トレーニング中、モデルは大量のテキストコンテンツから学習します。トレーニング後、モデルはトレーニングテキストから構築した独自のデータ構造を使用して、与えられたトークンシーケンスにおける次のトークンの確率を計算できます。

これはあなたが期待していたものとは違いますか?この概念がもうそれほど神秘的なものではなくなることを願っています。

1.3 長いテキストシーケンスの生成

モデルは次に出現するトークンを予測することしかできないため、完全な文を生成するには、forループ内で複数回実行する必要があります。各反復処理では、返された確率リストから新しいトークンが選択されます。この新しいトークンは、次の反復処理のためにモデルの入力シーケンスに追加され、十分な量のテキストが生成されるまでこのプロセスが続けられます。

以下は、このプロセスを示すより完全な Python 疑似コードの例です。

generate_text() 関数では、ユーザーにプロンプ​​ト テキスト (質問など) を入力するよう要求します。

`tokenize()`ヘルパー関数は、ユーザーのプロンプトを一連のトークンに変換する役割を担っています。この処理には、tiktokenなどのライブラリが使用されます。`for`ループ内では、`get_token_predictions()`関数がAIモデルを呼び出して、次のトークンの確率リストを取得します。これは、上記の例で説明したのと同じ処理です。

`select_next_token()`関数は、モデルが提供する候補トークンのリストから最も適切なトークンを選択し、入力シーケンスに追加します。最も単純なアプローチは、機械学習では「貪欲選択」と呼ばれる、最も確率の高いトークンを選択することです。しかし、生成されるテキストの多様性を高めるために、この関数は通常、より洗練された戦略を採用します。つまり、乱数ジェネレータを使用してトークンを選択します。トークンをランダムに選択する場合でも、確率の高いトークンを優先します。このようにして、同じ入力プロンプトに対しても、モデルは異なるテキスト応答を生成することができます。

トークン選択プロセスの柔軟性をさらに高めるために、LLMによって返される確率分布は、ハイパーパラメータを調整することで変更できます。テキスト生成関数に渡されるこれらのハイパーパラメータは、トークン選択プロセスの「貪欲さ」(モデルが確率が最も高いトークンを選択する傾向、または確率が低いトークンも選択できるようにする傾向)を制御するのに役立ちます。LLMを頻繁に使用したことがある方は、「温度」ハイパーパラメータについてご存知でしょう。温度値が高いほど、トークンの確率分布は平坦化されます(モデルは確率の低いトークンも含め、より多くのトークンを考慮するため、分布がより均一になります)。その結果、以前は選択される可能性が低かったトークンが選択される可能性が高くなり、生成されるテキストはより創造的で斬新なものになります。温度に加えて、top_pとtop_kという2つのハイパーパラメータがあり、選択プロセス中に選択される確率の高いトークンの数を制御します。これらのハイパーパラメータを調整することで、生成されるテキストのスタイルと多様性をさらに高めることができます。

モデルが次のトークンを選択すると、ループは反復処理を続けます。この時点で、モデルは新しいトークン(前の反復処理で選択されたトークン)の末尾に新しいトークンが追加された新しい入力シーケンスを受け取ります。`num_tokens` パラメータは反復処理の回数、つまり生成されるテキストの長さを決定します。大規模言語モデル(LLM)には文や段落の概念がなく、トークンを1つずつ処理するため、生成されるテキストは文の途中で終わることがあります(そして多くの場合、そうなります)。生成されるテキストが文の途中で終わらないようにするために、`num_tokens` パラメータをトークンの正確な数ではなく最大値として扱うことができます。この場合、モデルがピリオドトークンを生成した時点でループを終了できます。

ここまで読んで、これまでの説明をすべて理解できたなら、おめでとうございます!LLMの仕組みについて、かなり深く理解できたと思います。もっと技術的な詳細に興味がありますか?次のセクションでは、複雑な数学的な話には触れないようにしながら、より技術的な詳細を紹介していきます。

02 モデルトレーニング

残念ながら、数学的な概念を深く掘り下げずにモデルの学習プロセスについて議論するのは非常に困難です。そこで、まず非常にシンプルな学習方法を説明します。

私たちの目標は、特定のトークンの後にどのようなトークンが出現するかを予測することです。そのため、モデルを学習する簡単な方法は、学習データセットから連続するすべてのトークンペアを抽出し、そのデータを用いて確率表を作成することです。

短い語彙とデータセットを使ってこれを実行してみましょう。モデルの語彙には以下の5つのトークンが含まれていると仮定します。

この例を簡潔にするために、スペースと句読点はトークンとしてカウントしません。

トレーニング データセットとして次の 3 つの文を使用します。

  • 私はリンゴが好きです
  • 私はバナナが好きです
  • あなたはバナナが好きです

5x5の表を作成し、各セルに行のトークンの出現頻度と列のトークンの出現頻度を記録します。表は以下のようになります。

このデータセットでは、「I like」が 2 回、「you like」が 1 回、「like apples」が 1 回、「like bananas」が 2 回出現します。

トレーニングデータセットにおける各トークンペアの出現頻度がわかったので、それらが連続する確率を計算できます。これは、表の各行の数値を確率に変換することで行われます。例えば、「like」の行では、「apples」が1回、「bananas」が2回続いていることがわかります。つまり、「like」の後に「apples」が出現する確率は33.3%、「bananas」が出現する確率は66.7%です。

以下は計算された確率を示す完全な表です。空白のセルは当然ながら確率0%を表します。

「I」「you」「like」の行の確率計算は比較的簡単です。しかし、「apples」と「bananas」の行は、データセット内に「apples」と「bananas」の後に他のトークンが続く例がないため、計算が困難です。これは、学習データにおける「ギャップ」に似ています。モデルがこれらの未学習シナリオでも出力を生成できるようにするため、「apples」と「bananas」の後に他のトークンが続く確率を、他の4つのトークンに均等に配分することにしました。このアプローチでは、不自然な出力が生成される可能性もありますが、少なくともモデルがこれら2つのトークンを処理する際に処理が滞ることはありません。

訓練データにおけるこのような「ギャップ」の問題を過小評価すべきではありません。実際のLLMでは、訓練データセットが非常に大きいため、本論文の簡単な例のように明らかなギャップに遭遇することはほとんどありません。しかし、訓練データのカバレッジが不十分なため、より小さく、見つけにくいギャップは確かに存在し、非常に一般的です。LLMは、このような訓練不足の領域ではトークン予測が不十分になる可能性があり、これらの問題は容易には認識されません。これが、LLMが時折「錯覚」[7](つまり、生成されたテキストはキャッチーであっても、不正確さや矛盾を含む)を示す理由の一つです。

上記の確率表を使用して、`get_token_predictions()`関数の実装を考案できます。以下はPython擬似コードを使用した実装例です。

想像していたよりも簡単ですよね?この関数は、ユーザープロンプトからトークンのシーケンスを受け取り、シーケンスの最後のトークンを抽出し、確率表の対応する行を見つけます。

この関数を['you', 'like']を入力トークンとして呼び出すと、「like」に対応する行が出力されます。つまり、「apples」が文の次の部分に配置される確率は33.3%、「bananas」が配置される確率は66.7%です。これらの確率値に基づいて、前述のselect_next_token()関数は3回に1回「apples」を選択します。

「you like(好き)」の後に続く単語として「apples(リンゴ)」が選ばれた場合、「you like apples(リンゴが好きです)」という文が生成されました。この文はトレーニングデータセットには存在しませんでしたが、全く問題ありません。この小さな例から、これらのモデルがトレーニング中に学習したパターンを再利用し、さまざまな情報をつなぎ合わせることで、一見独創的なアイデアや概念をいかにして形成できるかがお分かりいただけると思います。

2.1 コンテキストウィンドウ

前のセクションでは、マルコフ連鎖[8]と呼ばれるミニチュア言語モデルのトレーニングに使用した方法を使用しました。

この手法の問題点は、1つのトークン(入力シーケンスの最後のトークン)のみに基づいて次の内容を予測することです。先行するテキストはテキストの続きに影響を与えないため、この手法のコンテキストウィンドウは1つのトークンに限定され、非常に小さいものと考えられます。コンテキストウィンドウが小さすぎるため、モデルは常に思考の流れを「忘れ」、ある単語から次の単語へと飛び移り、結果としてまとまりのない不規則な流れになってしまいます。

モデルの予測力を向上させるために、より大きな確率テーブルを構築することができます。2つのトークンにコンテキストウィンドウを使用する場合は、2つのトークンのすべての組み合わせを表す新しい行を確率テーブルに追加する必要があります。前の例では、5つのトークンを追加すると、元の5つの単一トークン行に加えて、2つのトークンの組み合わせの新しい行が25行、確率テーブルに追加されます。今回は、2つのトークンの組み合わせに加えて、3つのトークンの組み合わせも考慮する必要があるため、モデルを再度トレーニングする必要があります。`get_token_predictions()`関数の各反復処理では、条件が許せば、入力シーケンスの最後の2つのトークンを使用して、より大きな確率テーブル内の対応する行を検索します。

しかし、2トークンのコンテキストウィンドウはまだ不十分です。生成されたテキストが構造的に一貫しているだけでなく、何らかの意味も持つことを保証するには、より大きなコンテキストウィンドウが必要です。十分な大きさのコンテキストウィンドウがないと、新しく生成されたトークンは、以前のトークンが表現した概念やアイデアと結び付けることができません。では、どうすればよいでしょうか?コンテキストウィンドウを3トークンに拡張すると、確率テーブルに125行が追加されますが、それでも品質は不十分になる可能性があります。では、どれくらいの大きさのコンテキストウィンドウが必要なのでしょうか?

OpenAIのオープンソースモデルGPT-2は、1024トークンのコンテキストウィンドウを使用します。このサイズのコンテキストウィンドウをマルコフ連鎖で実装する場合、確率表の各行は1~1024トークンの長さのシーケンスを表す必要があります。前の例の5トークン語彙を用いると、1024トークンのシーケンスには5通りのトークンの組み合わせが考えられます。計算はPythonで行いました。

>>> パワー(5, 1024)

この行数は驚異的です!しかも、これは確率表全体のほんの一部に過ぎません。モデル入力に十分なトークンがない場合でも、より短いトークンシーケンスを処理できるようにするために、1023トークンから1トークンまでの長さのシーケンスもすべて必要としているからです。マルコフ連鎖は興味深いものですが、スケーラビリティに関する重大な問題を抱えています。

さらに、1024トークンのコンテキストウィンドウは、もはやそれほど大きいとは考えられていません。GPT-3では、コンテキストウィンドウは2048トークンに増加し、GPT-3.5では4096トークンに増加しました。GPT-4では、当初8192トークンのコンテキストウィンドウでしたが、その後32K、そして128K(そうです、128,000トークンです!)に増加しました。現在では、1M以上のコンテキストウィンドウを持つモデルも登場しています。コンテキストウィンドウが大きくなると、モデルは以前に入力されたテキスト情報をより適切に理解して活用できるようになり、新しいテキストを生成する際の一貫性と精度が向上します。

要約すると、マルコフ連鎖により、テキスト生成について正しい方法で考えることができますが、実行可能なソリューションとして検討することを妨げるいくつかの大きな問題もあります。

2.2 マルコフ連鎖からニューラルネットワークへ

明らかに、確率テーブルを使用するという考えは断念すべきです。なぜなら、妥当なコンテキストウィンドウの確率テーブルに必要なRAM容量は膨大だからです。より良い代替案は、テーブルではなく関数を使用することです。関数はアルゴリズムによって生成され、大きなテーブルに格納されることはありません。まさにこの点において、ニューラルネットワークは優れています。

ニューラルネットワークは、入力を受け取り、それに対して計算を実行し、出力を返す特殊な関数です。言語モデルでは、入力は手がかりとなる単語から変換されたトークンを表し、出力は次のトークンの予測確率のリストとなります。

ニューラルネットワークを「特別な」関数と表現したのは、その機能ロジックに加えて、入力に対して実行する計算が外部で定義された一連のパラメータによって制御されるからです。ニューラルネットワークのパラメータは初期状態では未知であるため、関数によって生成される出力は全く役に立ちません。ニューラルネットワークの学習プロセスでは、関数が学習データで良好に動作すれば、他のデータでも良好に動作するという仮定に基づき、学習データセットで評価した際に関数が最良のパフォーマンスを発揮するパラメータを見つけます。

訓練中、ニューラルネットワークのパラメータはバックプロパゲーションアルゴリズム[9]を用いて、非常に小さな増分で反復的に調整されます。このプロセスには膨大な数学的計算が含まれるため、ここでは詳しく説明しません。調整ごとに、ニューラルネットワークの予測能力はわずかに向上します。パラメータの更新後、ニューラルネットワークは訓練データセットにおけるパフォーマンスを再評価し、評価結果に基づいて次の調整を行います。このプロセスは、ニューラルネットワークが訓練データセットにおける次のトークンについて満足のいく予測を達成するまで継続されます。

ニューラルネットワークの規模を理解しやすくするために、GPT-2モデルのパラメータ数は約15億個ですが、GPT-3ではパラメータ数が1750億個に増加し、GPT-4は約1兆7600億個に達すると言われています。このような大規模なニューラルネットワークを現世代のハードウェアで学習させるには、通常数週間、場合によっては数か月と、かなりの時間がかかります。

興味深いことに、膨大な数のパラメータが、人間の介入なしに長い反復プロセスを経て計算されるため、モデルの仕組みを理解するのは困難です。十分に学習された大規模言語モデルはブラックボックスのようなもので、モデルの「思考」の大部分がパラメータの中に隠されているため、デバッグは極めて困難です。モデルを学習した人でさえ、その内部の仕組みを説明するのは困難です。

2.3 モデル層、トランスフォーマー、アテンションメカニズム

慎重に調整されたパラメータの助けを借りて、入力トークンのリストを受け取り、次のトークンの妥当な確率を何らかの方法で「推測」できるようにするニューラル ネットワーク関数内でどのような魔法の操作が実行されるかに、非常に興味があるかもしれません。

ニューラルネットワークは複雑な演算の連鎖⛓のようなもので、連鎖の各リンクは「モデル層」と呼ばれます。最初の層は入力(ニューラルネットワークが最初に受け取るデータ)を受け取り、何らかの形式に変換します。変換された入力は次の層に入力され、再び変換されます。このプロセスは、データが最終層に到達するまで続き、そこで最終的な変換が行われ、最終的なモデル出力が生成されます。

機械学習の専門家は、入力データに対して数学的変換を実行できる様々なタイプのモデルレイヤーを設計してきました。また、これらのモデルレイヤーを整理・グループ化することで、望ましい結果を得るための様々な方法も発見しています。モデルレイヤーの中には、汎用性が高く、幅広い入力データに適したものもあれば、画像データや大規模言語モデルにおけるセグメント化されたテキストなど、特定の種類のデータの処理に特化したものもあります。

大規模言語モデルを用いたテキスト生成の文脈において、最も人気のあるニューラルネットワークアーキテクチャはTransformer[10]です。このアーキテクチャを用いて設計されたLLM(Large Language Model)はGPT(Generative Pre-Trained Transformers)と呼ばれます[11]。

Transformerモデルのユニークな特徴は、Attention[12]と呼ばれるモデル層の計算を実行することです。これにより、コンテキストウィンドウ内のトークン間の関係とパターンを推測し、これらの関係とパターンを次のトークンの予測確率に反映することができます。

注目メカニズムは、もともと言語翻訳で用いられたもので、入力シーケンス内のどのトークンがその意味を理解する上で最も重要かを特定する手法です。このメカニズムにより、現代の翻訳者は重要な単語やトークンに焦点を合わせる(あるいは「注目を集中させる」)ことで、文を根本的に「理解」することが可能になります。

03 LLM には知性がありますか?

大規模言語モデル (LLM) はテキストを生成するときに何らかのインテリジェンスを発揮するのではないかと考え始めたかもしれません。

個人的には、LLMが推論能力や独創的なアイデアを生み出す能力を持っているとは考えていませんが、だからといって役に立たないというわけではありません。LLMはコンテキストウィンドウ内でトークンを巧みに計算するため、ユーザーのプロンプトのパターンを識別し、トレーニング中に学習した類似のパターンと照合することができます。生成されるテキストは主に断片的なトレーニングデータで構成されていますが、単語(実際にはトークン)をつなぎ合わせる方法は非常に洗練されているため、多くの場合、モデルの出力は独創的で非常に有用です。

LLM が作り出す幻想を考慮すると、人間による検証なしに直接 LLM の出力を送信するワークフローは信頼できません。

今後数か月、あるいは数年のうちに、より大規模なLLMが登場するでしょうか?それらは真の知能を実現できるでしょうか?GPTアーキテクチャには多くの制限があるため、その可能性は低いと思いますが、今後のイノベーションが続けば、この目標を達成できるかもしれません。

04 終わり

最後までお付き合いいただき、ありがとうございました!この記事が、皆さんの学習への興味を掻き立て、大規模モデルについて学び続ける決意を固め、そして最終的には、細部まで理解するためには避けて通れない、難解な数学的概念に向き合うきっかけになれば幸いです。そんな方には、Andrej Karpathyの「Neural Networks: Zero to Hero」[13]ビデオシリーズを強くお勧めします。

読んでくれてありがとう!

このブログを楽しんで、新しいことを学んでいただければ幸いです。

著者について

こんにちは、ミゲルです。ソフトウェアエンジニアですが、時間があれば写真撮影や映画制作にも取り組んでいます。アルゼンチンのブエノスアイレスで生まれましたが、成人してからはアメリカのオレゴン州ポートランドで過ごしました。ポートランドは私にとって故郷と言えばこの場所です。2018年現在はアイルランドに住んでいます。

終わり

今週のインタラクティブコンテンツ🍻

❓この記事を読んで、LLMがなぜ「錯覚」や信頼性の低い出力を生み出すのか理解できましたか?これらの問題の原因は何だと思いますか?

🔗記事内のリンク🔗

[1] https://en.wikipedia.org/wiki/Large_language_model

[2] https://en.wikipedia.org/wiki/Generative_artificial_intelligence

[3] https://chat.openai.com/

[4] https://en.wikipedia.org/wiki/バイトペアエンコーディング

[5] https://github.com/openai/gpt-2

[6] https://en.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog

[7] https://en.wikipedia.org/wiki/幻覚_(人工知能)

[8] https://en.wikipedia.org/wiki/マルコフ連鎖

[9] https://en.wikipedia.org/wiki/バックプロパゲーション

[10] https://en.wikipedia.org/wiki/Transformer_(ディープラーニングアーキテクチャ)

[11] https://en.wikipedia.org/wiki/Generative_pre-trained_transformer

[12] https://en.wikipedia.org/wiki/Attention_(機械学習)

[13] https://karpathy.ai/zero-to-hero.html

オリジナルリンク:

https://blog.miguelgrinberg.com/post/how-llms-work-explained-without-math