ChatGPTの仕組み、どのように機能しているか深く掘り下げて解説
Post on:2023年4月26日
ChatGPTをすでに使用している人は多いと思います。また、使用していなくても興味があり、これから使用してみようという人もいるでしょう。
ChatGPTはその仕組みが分からなくても使用できますが、どのように機能しているのか分かると今よりさらに使いこなせるようになるかもしれません。

How ChatGPT works: a deep dive
by Dan Holick
下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。
ChatGPTがどのように機能しているか
ChatGPTなどの大規模言語モデル(Large Language Model、以下LLM)は、どのように機能していると思いますか?
それらは驚くほどシンプルであると同時に非常に複雑なものです。
心の準備はいいですか?
ではその深淵をのぞいてみましょう。

LLMのモデルとは、ある入力に基づく出力の確立を計算するものと考えることができます。
つまり、言語モデルでは単語のシーケンスが与えられた場合に、そのシーケンス内の次の単語の確立を計算することを意味します。
テキストを入力すると候補が表示されるオートコンプリートみたいなものです。

この確立がどこから来るのかを理解するには、ニューラルネットワークと呼ばれるものについて説明する必要があります。
ニューラルネットワーク(neural network)とはネットワークのような構造で、一方に数値が供給され、もう一方から確率が吐き出されます。
それらはあなたが思っているよりも簡単な構造です。

たとえば、3x3ピクセルのディスプレイで記号を認識するという単純な問題を解決するようにコンピュータを訓練したいと想像してみてください。
その場合、次のようなニューラルネットが必要になります。
- 入力層(input layer)
- 2つの隠れ層(hidden layer)
- 出力層(output layer)

入力層はニューロンと呼ばれる9つのノードで構成され、各ピクセルに1つずつ配置されます。各ニューロンは1(ホワイト)から-1(ブラック)までの数値を保持します。
出力層は4つのニューロンで構成され、可能性のあるシンボルに対して1つずつ配置されます。その値は最終的に0と1の間の確率になります。

入力層と出力層の間に、隠れ層と呼ばれるニューロンの列があります。今回の簡単な使用例では、必要なのは2つだけです。
各ニューロンは-1から1までの値を持つ重みによって、隣接する層のニューロンに接続されます。

入力ニューロンから次の層に値が渡されると、その値に重みが掛けられます。
そして、そのニューロンは受け取ったすべての値を単純に合計し、-1から1までの間で値をつぶして、次の層の各ニューロンに渡します。

最後の隠れ層のニューロンも同じことをしますが、0と1の間の値をつぶして出力層に渡します。
出力層の各ニューロンは確率を保持し、最も高い数値が最も確率の高い結果となります。

このネットワークを学習させる際には、答えが分かっている画像を入力して、答えとネットが計算した確率の差を計算します。
そして、予想される結果に近づくように重みを調整します。
しかし、どのようにして重みを調整すればよいのでしょうか?

詳細は省きますが、勾配降下法や逆伝播法と呼ばれる数学的手法を使用して、各重みの値をどうすれば最も誤差が少なくなるかを判断します。
このプロセスを、モデルの精度に納得がいくまで繰り返すのです。

これはフィードフォワードニューラルネット(feed forward neural net)と呼ばれるもので、自然言語処理の問題に取り組むにはこの単純な構造では十分ではありません。
その代わりに、LLMはトランスフォーマー(transformer)と呼ばれる構造を使用する傾向があり、多くの可能性を解き放ついくつかの重要な概念があります。

まず、単語について説明します。
各単語を入力する代わりに、単語を単語、サブワード、文字、記号などのトークンに分解します。
これらのトークンには、スペースも含まれることに注目してください。

ピクセル値を0から1までの数値で表すのと同じように、これらのトークンも数値で表す必要があります。
各トークンにユニークな番号を与えて終わりにすることもできますが、よりコンテキストを深めるために別の方法で表すことができます。

各トークンは他のトークンとの関係を示す多次元ベクトルに格納できます。
簡単に説明すると、単語の位置をプロットする二次元平面を想像してください。類似した意味を持つ単語をより近くにグループ化する必要があります。
これを埋め込み(embedding)と呼びます。

埋め込みは、類似した単語間の関係を作るのに役立ちますが、類似性を捉えることもできます。
たとえば、「dog」と「puppy」の間の距離は、「cat」と「kitten」の間の距離と同じにする必要があります。
また、文全体の埋め込みを作成することもできます。

トランスフォーマーの最初の部分は、入力された単語をこれらの埋め込みにエンコードすることです。
そして、これらの埋め込みはアテンション(attention)と呼ばれる次のプロセスに送られ、埋め込みにさらに多くのコンテキストが追加されます。
アテンションは、自然言語処理において非常に重要です。

埋め込みは、複数の意味を持つ単語を捉えるのに苦労します。
たとえば「bank」の2つの意味を見てましょう。人間は文脈に基づいて正しい意味を導きだします。
「money」と「river」は、それぞれの文章で「bank」という単語に対して文脈的に重要な意味を持ちます。

アテンションのプロセスでは、「bank」という単語の文脈を提供する単語の文を振り返ります。
そして、「bank」という単語が意味的に「river」または「money」という単語に近くなるように埋め込みを再調整します。

アテンションのこのプロセスは何度も繰り返されることで、文の文脈を多面的に捉えることができます。
こうして文脈を捉えた埋め込みは、最終的に先ほどのシンプルなニューラルネットに渡され、確率が生成されます。
終わりに
この記事は、ChatGPTのようなLLMが実際にどのように機能するのかを簡略化したものです。簡潔にするために省略したり、ざっと目を通したりしたことがたくさんあります。
何か重要なことを忘れていたり、細かいところが間違っていたら、お知らせください。
私はこの件について、6ヵ月ほど調査してきました。最高のリソースを紹介します。私がここに書いたよりもはるかに詳しく書かれています。
もう少し親しみやすいものとして、ニューラルネットワークの学習方法に関するこの@3blue1brownの動画をご覧ください。
数学的なことはよくわからなくても、素敵なグラフィックがあります。
また、@CohereAIのブログには、埋め込み、アテンション、トランスフォーマーについて説明している優れた記事と動画があります。
これで心の準備ができたと思います。
sponsors