ChatGPTの仕組みとは?なぜ効果的なのかを解説
ChatGPTは、膨大な人間のテキストデータを学習したニューラルネットワークモデルで、次の単語の確率を予測することで文章を生成します。温度パラメータがランダム性を制御し、創造性に影響を与える仕組みを解説します。
AI により中国語から翻訳されています。問題があればフィードバックボタンからお知らせください。
原文タイトル:『ChatGPTは何をしているのか…そしてなぜ機能するのか?』
原文URL:https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/
原文著者:Stephen Wolfram https://www.stephenwolfram.com/
公開日:2023年2月14日
翻訳者:SIY.Z
『A16ZがまとめたAIの古典』入門編 第三弾
[図]
[図]
ChatGPT は「単語」単位でテキストを生成している
ChatGPT は、人間が書いたようなテキストを自動生成できる点で、非常に素晴らしく、また予想外の能力を持っています。しかし、それはどのように実現されているのでしょうか?
-
私の目的は、ChatGPT 内部で行われているプロセスを概観し、なぜそれが私たちが意味があると考えるテキストをうまく生成できるのかを考察することです。
-
まず断っておきますが、全体像に焦点を当て、詳細には立ち入りません。
-
また、ここで述べる要点は、他の「大規模言語モデル(LLMs)」にも当てはまります。
最初に説明すべきことは、ChatGPT は常に、既存のテキストに基づいて「テキストの合理的な続き」を生成しようとしているということです。ここで「合理的」とは、「数十億のウェブページなど、人間が書いたテキストを調べた後、ある人がこのような内容を書くだろうと私たちが期待するもの」を意味します。
そこで、既存のテキストが「人工知能が最も得意とするのは…」だと仮定し、数十億の人間が書いたテキスト(ウェブコンテンツやデジタル化された書籍など)をスキャンして、それらすべてのテキストのインスタンスを見つけ、次の単語がどのくらいの頻度で出現するかを調べることを想像してみてください。ChatGPT は実際にこれに似たことを行っていますが、(後で説明するように)単語を直接見るのではなく、ある意味で「一致する」コンテンツを探します。いずれにせよ、最終的にはテキストに続く可能性のある単語とその「確率」をランク付けしたリストを生成します。
[図]
驚くべきことに、ChatGPT が記事を書こうとするとき、基本的には「既存のテキストに基づいて、次の単語は何か?」と繰り返し問いかけ、毎回1つの単語を追加しているだけです。(より正確には、後で説明するように、「トークン」を追加します。これは単語の一部である可能性があり、それが時々「新しい単語を作り出す」理由でもあります。)【注:例えば「apple」という単語の場合、ChatGPT は最初に「app」を生成し、次に「le」を続けるかもしれません。これにより、「bananapple」のような存在しない単語を生み出す可能性があります。ChatGPT が生成する最小単位はUnicodeに近く、原則としてChatGPTはインターネット上のあらゆる国のテキスト、絵文字や様々な顔文字、そしてそれらのすべての組み合わせを生成できます。】
各ステップで、ChatGPT は確率付きの単語リストを生成します。しかし、書いている記事(または他のコンテンツ)にどの単語を選ぶべきでしょうか?「最もランクの高い」単語(つまり、最も高い「確率」が割り当てられた単語)を選ぶべきだと考えるかもしれません。しかし、ここで少し魔術が忍び込みます。なぜなら、何らかの理由で(おそらくいつか科学的に理解されるでしょうが)、常に最もランクの高い単語を選ぶと、通常は非常に「平坦な」記事になり、「創造性を発揮している」ようには見えず(時には完全に繰り返しになることさえあります)。一方、時々(ランダムに)ランクの低い単語を選ぶと、「より面白い」記事が得られます。
ここにランダム性があるということは、同じプロンプトを複数回使用すると、毎回異なる記事が得られる可能性があるということです。そして、魔術的な考え方に沿って【注:まるで錬丹術のように、謎のレシピが特に良い結果を生む】、特定の「温度」パラメータがあり、これがランクの低い単語が使用される頻度を制御します。記事生成では、「温度」0.8が最適であることがわかっています。(強調すべき点は、ここでは「理論」は一切使われておらず、実践に基づく発見であるということです。例えば、ここでの「温度」の概念は、統計物理学でおなじみの指数分布上の温度に対応しますが、少なくとも私たちが知る限り、これら二つの温度に「物理的な」関連性はありません。)
先に進む前に、説明しておきますが、この記事の大部分では、ChatGPT の完全なシステムを使用するのではなく、より単純な GPT-2 システムを使用します。このシステムの利点は、標準的なデスクトップコンピュータで実行できるほど小さいことです。そのため、私が示すほぼすべての内容について、明確な Wolfram 言語コードを提供し、すぐにコンピュータで実行できるようにします。
例えば、上記の確率表を取得する方法は次のとおりです。まず、ChatGPT のような「言語モデル」を取得する必要があります。これはニューラルネットワークです:
[図]
このモデルは GPT-2 です。ChatGPT は現在 GPT3.5 をベースにしています。
後ほど、このニューラルネットワークを詳しく調べ、その仕組みについて議論します。しかし今は、この「ネットワークモデル」をブラックボックス【注:ここでは、入力と出力だけを気にし、中間のプロセスについては何も知らないことを意味します】として既存のテキストに適用し、モデルが予測する確率の高い上位5つの単語を尋ねることができます:
[図]
結果をデータテーブルに変換すると、より明確に見えます:
[図]
「モデル」を繰り返し適用し、毎回最も確率の高い単語を追加すると(このコードではモデルがテキストを生成する「戦略」として指定されています)、何が起こるでしょうか?
[図]
これを続けるとどうなるでしょうか?この場合(「ゼロ温度」)、結果はすぐに混乱し、繰り返しになります:
[図]
しかし、常に「最良の」単語を選ぶのではなく、時々ランダムに「最良でない」単語を選ぶと(「温度」0.8に対応する「ランダム性」)、どうなるでしょうか?同様に、テキストを構築できます:
[図]
これを実行するたびに、異なるランダムな選択が行われ、テキストも異なります。以下の5つの例をご覧ください:
[図]
注目すべき点は、各ステップで次の単語の確率分布が生成されるとき、選択可能な「次の単語」は多数ありますが(温度0.8の場合)、【確率で全ての次の単語をソートすると】その確率はランクが上がるにつれて急速に低下します(以下の対数-対数グラフの直線は、n^–1 の「べき乗則」減衰に対応しており、これは言語の一般的な統計的特徴です【注:人間の自然言語では、ある発話の後に現れる可能性のある単語の確率分布は「べき乗分布」を示します】):
[図]
これを続けるとどうなるでしょうか?以下はランダムな例です。最高確率(ゼロ温度)の場合よりはましですが、それでも少し奇妙です:
[図]
これは最も単純な GPT-2 モデル(2019年製)を使用したものです。より新しく大きな GPT-3 モデルを使用すると、より良い結果が得られます。以下は、同じ「プロンプト」を使用して生成された最高確率(ゼロ温度)のテキストですが、最大の GPT-3 モデルを使用しています:
[図]
以下は【GPT3 使用】「温度0.8」【で生成】のランダムな例です:
[図]
では、これらの確率はどこから来るのでしょうか?
ChatGPT は常に確率に基づいて次の単語を選択します。しかし、これらの確率はどこから来るのでしょうか?まずは、よりシンプルな問題から始めましょう。英文テキストを一度に1文字ずつ(単語ではなく)生成するとします。どのようにして各文字の確率を計算すればよいでしょうか?
英文テキストをサンプリングし、さまざまな文字が出現する頻度を単純に計算することができます。例えば、これは「cats(猫)」のウィキペディア記事【注:タイトルが「猫」の記事。以下同様】における文字のカウントです:
[図]
これは「dogs(犬)」に対して同じことを行った結果です:
[図]
結果は似ているものの、完全には同じではありません("o" は "dogs" 記事において、"dog" という単語自体に含まれるため、明らかに多く出現します)。しかし、十分な量の英文テキストをサンプリングすれば、最終的にはかなり一貫した結果が得られると期待できます:
[図]
以下は、これらの確率のみに基づいて生成された文字シーケンスの例です:
[図]
スペースをある確率を持つ「文字」として追加することで、これを「単語」に分解することができます:
[図]
「単語の長さ」の分布を英文と一致するように強制することで、「単語」の生成をより良くすることができます:
[図]
ここでは「実際の単語」は得られていませんが、結果はやや改善されているように見えます。しかし、さらに改善するためには、各文字を個別にランダムに選択する以上のことを行う必要があります。例えば、「q」の後には次の文字はほぼ確実に「u」になることを私たちは知っています。
以下は文字の確率のグラフです:
[図]
以下は、典型的な英文テキストにおける文字ペア("2-grams")【注:連続する2文字を1つのユニットとし、このユニットが出現する確率】を示すグラフです。可能性のある最初の文字はページ上部に、2番目の文字はページ左側に表示されています:
[図]
ここでは例えば、「q」の列は「u」の行以外では空白(確率ゼロ)になっていることがわかります。では、1文字ずつ「単語」を生成する代わりに、これらの「2-gram」確率を使用して2文字ずつ生成してみましょう【つまり、最後の文字に基づいて条件付き確率で次の文字を生成するわけです】。たまたま「実際の単語」を含んでいる結果の例を以下に示します:
[図]
十分な量の英文テキストがあれば、単一の文字や文字ペア(2-grams)の確率だけでなく、より長い文字シーケンスの確率についてもかなり正確な推定値を得ることができます。徐々に長い n-gram 確率【注:すなわち、n 番目の文字の確率分布はそれ以前の n-1 個の文字に依存する】を使用して「ランダムな単語」を生成すると、それらがより「リアル」に見えてくるようになります:
[図]
しかしここで、ChatGPT のやり方と同様に、文字ではなく単語全体を扱うと仮定しましょう。英語には約 40,000 個の常用単語があります。大量の英文テキスト(例えば数百億単語を含む数百万冊の本)を調べることで、各単語の出現頻度を推定できます。これを使用することで、各単語をコーパス内に出現するのと同じ確率で独立にランダムに選択して「文章」を生成し始めることができます。以下はその例です:
[図]
明らかに、これは意味不明な文章です。では、どのように改善すればよいでしょうか?文字を扱った時と同様に、単一の単語の確率だけでなく、ペアやより長い n-gram 単語の確率も考慮し始めます。ペア単語の場合、「cat」から始めて得られた5つの例は以下の通りです:
[図]
より「もっともらしい」ように見えます。十分な長さの n-gram を使用できれば、基本的に「ChatGPT のようなものが手に入る」ことが想像できるでしょう——つまり、「正しい全体的な記事確率」で記事長の単語シーケンスを生成できるものが得られるということです。しかし問題があります:これらの確率を推定するのに十分なテキストが存在しないのです。
ウェブクロールの中には数千億単語があるかもしれませんし、すでにデジタル化された本の中にもさらに数百億単語があるかもしれません。しかし、40,000 個の常用単語について、可能なペアだけでもすでに16億個あり、トリプレット(3-gram)の数は60兆個にもなります。そのため、既存のテキストからこれらすべての可能性の確率を推定することはできません。そして20単語の「記事スニペット」にまでなると、可能性の数は宇宙の粒子の数よりも多くなり、いわば、それらすべてを書き出すことは決してできません。
では、どうすればよいでしょうか?大きなアイデアは、見ているテキストコーパス内で明示的に見たことがないシーケンスであっても、出現すべき確率を推定できるモデルを作ることです。そして、ChatGPT の核心は、まさに「大規模言語モデル(LLM)」と呼ばれるモデルであり、この種の確率推定において優れた性能を発揮するように設計されているのです。
モデルとは何か?
あなたが(16世紀後半にガリレオが行ったように)ピサの斜塔の各階から落とした砲弾が地面に着くまでにどれだけの時間がかかるかを知りたいとしましょう。各高さで実際に計測して結果の表を作ることもできます。あるいは、理論科学の本質である、答えを計算できるモデルを作り、あらゆるケースを計測して記憶するのではなく、一般化する方法もあります。
各階から落とした砲弾の落下時間に関する、(やや理想化された)データがあると想像してみましょう。
[図]
明確なデータがない場合、どのようにして落下時間を決めればよいでしょうか?この特定のケースでは、既知の物理法則を使って計算できます。しかし、データだけがあり、それを支配する基本法則がわからないと仮定しましょう。その場合、数学的な推測を行うことができます。例えば、直線をモデルとして使うべきかもしれません。
[図]
異なる直線を選ぶこともできます。しかし、これは与えられたデータに平均的に最も近い線です。そして、この直線から任意の階の落下時間を推定できます。
なぜここで直線を使おうと考えたのでしょうか?ある意味では、それはわかりません。直線を使うことは数学的に単純であり、多くの測定データが単純な直線に沿って分布するという事実に私たちは慣れています。もちろん、a + bx + cx² のようなより複雑な数学的方法を試すこともでき、その場合、データによりよく適合させることができます。
[図]
しかし、問題が生じる場合もあります。例えば、a + b / x + c sin(x) を使った最良の結果がこれだとします。
[図]
理解すべき重要な点は、「(事前の)モデルなしのモデル」は決して存在しないということです。使用するモデルはすべて、何らかの特定の基本構造を持ち、さらにデータに適合させるために調整できる「つまみ」(つまり設定可能な重み)があります。ChatGPTの場合、そのような「つまみ」が多数使用されており、実際には1750億個あります。
しかし、ChatGPTの背後にあるモデルは、次の単語の確率を「十分に良い」精度で計算し、さらには数千語に及ぶ一貫した文章を生成できるようにするために、これだけのパラメータを「必要とするだけ」です。ちなみに、単語の三つ組(トリグラム)の数は60兆に達し、1000語の組み合わせの数(40000^1000)は、多くの「天文学的な数字」(例えば、比較によく使われる観測可能な宇宙の原子数)を「はるかに凌駕」します。それに比べれば、1750億というパラメータ数は確かに微々たるものです。
人間のタスクのモデル
上記の例は、数値データに適合するモデルを作成するものでした。これらのデータは基本的に単純な物理学に由来し、何世紀にもわたって「単純な数学【注:数ページで記述でき、広く適用可能なもの。この意味で「マクスウェル方程式」などは単純である】が【多くの物理現象のモデル化に】適用できる」ことが知られています。しかし、ChatGPTでは、人間の脳が生成するような人間の言語テキストをモデル化する必要があります。このようなことに対しては、まだ「単純な数学」のようなものは何もありません。では、そのモデルはどのようなものになるのでしょうか?
言語について話す前に、人間に似た別のタスク、画像認識について考えてみましょう。この問題の簡単な例として、数字の画像を考えます(これは機械学習の古典的な例でもあります)。
[図]
できることの一つは、各数字のサンプル画像をたくさん集めることです。
[図]
そして、入力された画像が特定の数字に対応するかどうかを調べるために、既存のサンプルを使って明示的にピクセル単位で比較することができます。しかし、人間は明らかにそれよりも優れています。なぜなら、手書きで様々な修正や歪みがあっても、これらの数字を認識できるからです。
[図]
先ほど数値データのモデルを作成したとき、与えられた数値 x を使って、特定の a と b に対して a + b x を計算することができました。同様に、ここで各ピクセルのグレースケール値をある変数 x_i と見なした場合、すべての変数を入力とする関数で、それを計算すると画像がどの数字かを教えてくれるものは存在するでしょうか?実は、そのような関数を構築することは可能です。驚くことではありませんが、その関数は特に単純ではなく、典型的な関数は約50万回の数学演算を伴うかもしれません。
しかし最終的には、画像のピクセル集合をこの関数に入力すると、その画像に対応する数字が得られます。後で、このような関数をどのように構築するか、そしてニューラルネットワークの考え方について説明します。今は、この関数をブラックボックスと考え、手書き数字の画像(ピクセル値の配列として)を入力すると、対応する数字が得られるとしましょう。
[図]
しかし、ここで実際に何が起きているのでしょうか?画像を徐々にぼかしていきます。しばらくの間、関数はそれを「認識」し続け、「2」と呼びます。しかし、すぐに「認識できなくなり」、「間違った」結果を出し始めます。
[図]
なぜこれを「間違った」結果と言うのでしょうか?この場合、すべての画像が「2」をぼかして得られたものであることを事前に知っています。しかし、私たちの目標が「人間の画像認識」のモデルを作ることであるなら、本当に問うべきことは、画像の出所を知らなければ、人間はどう判断するか?ということです。
もし関数の結果が通常、人間の判断と一致するなら、それは「良いモデル」です。そして、非自明な科学的事実として、このような画像認識タスクにおいて、現在ではそれを実現できる関数を構築する方法が基本的にわかっています。
それらの有効性を「数学的に証明」できるでしょうか?できません。なぜなら、そのためには人間の認知と行動に関する数学的理論が必要だからです。この「2」の画像を取り、いくつかのピクセルを変更した場合、ほんの数ピクセルが「正しい位置にない」だけなら、依然として「2」と見なすべきだと想像するかもしれません。しかし、それはどこまで許容されるのでしょうか?これは人間の視覚知覚の問題です。もし「この画像が以前と同じ内容を表しているか」という問いに答えるのが人間ではなく、例えばミツバチやタコだった場合、答えは異なるかもしれません。ましてや仮想的な宇宙人であれば、まったく異なる可能性があります。
ニューラルネットワーク
では、画像認識などのタスクに使われる典型的なモデルは、実際にはどのように動作しているのでしょうか?現在最も成功し、広く使われている方法は、ニューラルネットワークを使用することです。ニューラルネットワークは、脳の働き方を単純化した理想像と考えることができます。
人間の脳には約1000億個のニューロン(神経細胞)があり、各ニューロンは毎秒最大1000回の電気パルスを発生できます。これらのニューロンは複雑なネットワークで相互に接続されており、各ニューロンは木の枝のような分岐を持ち、他のニューロンに電気信号を伝達できます。各接続の重みは異なり、ニューロンがある瞬間に電気パルスを発生するかどうかは、他のニューロンから受け取るパルスにほぼ依存し、異なる接続がパルスの発生に与える影響は異なります。
私たちが「画像を見る」とき、光子が画像から目の後ろにある「光受容体」細胞に当たると、神経細胞に電気信号が発生します。これらの神経細胞は他の神経細胞に接続され、最終的に信号はニューロン層のシーケンス全体を通過します。この過程で、私たちはその画像を「認識」し、最終的に「2が見える」という考えを「形成」します(そしておそらく最終的には「2」と声に出して言うなどの行動を起こします)。
前節の「ブラックボックス」関数は、このような「数学化された」ニューラルネットワークです。これはちょうど11の層を持っています(ただし、「コア層」は4つだけです【注:主要な重みを含む層】):
[図]
このようなニューラルネットワークはどのようにして「物事を認識する」のでしょうか?鍵となるのは「アトラクタ」の概念です。手書きの1と2の画像があると想像してみましょう:
[図]
すべての1は「一つの場所に引き寄せられ」、すべての2は「別の場所に引き寄せられる」ことを望みます。言い換えれば、画像が「1に近い」という意味であれば、最終的に「1の場所」に到達し、その逆も同様であることを望みます。
簡単な例えとして、平面上に点で表される特定の位置があるとします(現実世界では、コーヒーショップの位置かもしれません)。すると、平面上の任意の点から始めて、常に最も近い点に最終的に到達したいと想像できます(つまり、常に最も近いコーヒーショップに行く)。これを、理想化された「分水嶺」で区切られた領域(「吸引盆地」)に平面を分割することで表現できます:
[図]
これは一種の「認識タスク」と見なすことができます。このタスクでは、どの数字が最も似ているかを認識するのではなく、与えられた点がどの点に最も近いかを直接見ます。(ここに示す「ボロノイ図」では、2次元ユークリッド空間内の点を分割しています。数字認識タスクも非常に似ていると考えられますが、空間は2次元ではなく、各画像内の全ピクセルのグレースケール値が形成する784次元空間です)
では、どのようにしてニューラルネットワークに「認識タスクを実行」させるのでしょうか?この非常に単純な例を考えてみましょう:
[図]
目標は、位置{x, y}に対応する「入力」を、最も近い3つの点のいずれかに変換することです。つまり、ニューラルネットワークに{x, y}の関数を計算させ、以下のようにしたいのです:
[図]
これをニューラルネットワークでどのように実現するのでしょうか?ニューラルネットワークは、一連の理想化された「ニューロン」からなる接続の集合であり、通常は層状に配置されています【注:階層的に配置され、同じ層のニューロン同士は接続されず、各層はその上下の層とのみ接続される】。簡単な例を以下に示します:
[図]
各「ニューロン」は実際には単純な数値関数を評価するように設定されています【注:例えば入力の合計を計算するなどの単純な演算を行う】。ネットワークを「使用」するには、上部に数値(座標xやyなど)を入力し、各層でニューロンが「その関数を評価」し、結果を前方【「前方」は下方向】に伝達し、最終的に底部で最終結果を生成します:
[図]
従来の(生物学的に着想を得た)設定では、各ニューロンは前の層のニューロンから一定数の「入力接続」を持ち、各接続には「重み」(正または負の値)が割り当てられます。特定のニューロンの値は、「前の層のニューロン」の値とそれに対応する重みを掛け合わせ、それらを合計し、定数を加え、最後に「しきい値」(または「活性化」)関数を適用することで決定されます。数学的には、ニューロンが入力x = {x1, x2 …}を持つ場合、そのニューロンはf [w * x + b]を計算します。ここで、重みwと定数bは通常、ネットワーク内のニューロンごとに異なります。関数fは通常同じです。
w * x + bの計算は、単なる行列の乗算と加算の問題です。「活性化関数」fは非線形性を導入し(最終的に非自明な動作をもたらします)。通常、さまざまな活性化関数が利用可能です。ここではReLUのみを使用します:
[図]
ニューラルネットワークに実行させたい各タスク(または同等に、評価させたい各全体関数)に対して、異なる重みの選択があります。(後で説明するように、これらの重みは通常、機械学習、つまり望ましい出力の例からネットワークを「訓練」することによって決定されます)
最終的に、各ニューラルネットワークは何らかの全体的な数学関数に対応します——ただし、それを書き出すのは難しいかもしれません。上記の例では、次のようになります:
[図]
ChatGPTのニューラルネットワークもこのような数学関数に対応しています——ただし、数十億もの重みを持っています。
単一のニューロンに戻りましょう。以下は、2つの入力(座標xとyを表す)を持つニューロンが、さまざまな重みと定数(および活性化関数としてReLU)を使用して構成するさまざまな関数です:
[図]
これが上の大きなネットワークが計算する内容です:
[図]
完全に「正しい」とは言えませんが、上で示した「最近点」関数に近いものです。
それでは、他のニューラルネットワークで何が起こるかを見てみましょう。いずれの場合も、後で説明するように、機械学習を用いて最適な重みの選択を見つけます。そしてここでは、それらの重みを持つニューラルネットワークが計算した内容を示します。
[図]
より大きな【重みが多く、構造が複雑な】ネットワークは、通常、目的関数をより正確に近似します。各アトラクタベイスンの中心では、通常、望む正確な答えが得られます。しかし、境界【色が交錯する場所】——ニューラルネットワークが「判断を下しにくい」場所——では、事態はより混乱する可能性があります。
このような、数学的に簡単に表現できる「識別タスク」では、「正解」は明らかです。しかし、手書き数字の認識問題では、状況はそれほど明確ではありません。誰かが「2」を「7」のように書いたらどうなるでしょうか?それでも、ほとんどの場合、ニューラルネットワークは数字をうまく区別できます——これは次のことを示唆しています【以下に続く】:
[図]
ネットワークがどのように数字を区別しているかを「数学的に」説明できるでしょうか?【ニューラルネットワークは非常に複雑で、その関数を紙に書き出すには何百万枚もの紙が必要になる】ため、実際には不可能です。しかし、ニューラルネットワークは単に「ニューラルネットワークのすること」をしているだけであり、それが人間の区別とかなりよく一致することが分かっています。
より詳細な例を見てみましょう。猫と犬の画像があり、それらを区別するように訓練されたニューラルネットワークがあるとします。これは、いくつかの例でネットワークが行う可能性のあることです:
[図]
この種の問題では、「正解」はさらに不明確です。例えば、猫が犬の格好をしている場合、画像としては猫なのか犬なのか?しかし、入力が何であれ、ニューラルネットワークは答えを生成します。そして、それは人間が行うのと同様の、かなり一貫した方法で動作することが分かっています。先ほど述べたように、これは「第一原理から」【ここでの意味は、ニューラルネットワークの各パラメータの役割を完全に知っていたとしても、なぜニューラルネットワークが正しく分類できるのかを「理解」したり「直感的に感じ取る」ことはできず、非常に複雑な数学的演算が正しい結果を生み出しているのを見るだけである】導き出せる事実ではありません。少なくとも一部の分野では、その発見は経験的なものです【つまり、人々は大量の実験を通じてニューラルネットワークが非常に効果的であることを知っているが、その原理は理解していない】。しかし、これこそがニューラルネットワークが有用である重要な理由の一つです。それらは何らかの形で「人間に似た」物事の進め方を捉えているのです。
自分で猫の画像を見て、「なぜそれが猫なのか?」と問われたとします。おそらく「尖った耳などが見えるから」と言うでしょう。しかし、その画像を猫として認識した方法を説明するのは難しい。なぜなら、猫の要素は明らかに尖った耳だけではなく、他の多くの動物も持っているからです。しかし、あなたの脳は直接答えを出します。しかし、脳については、(少なくとも現時点では)「内部に入り込んで」どのように決定を下しているかを見ることはできません。(人工)ニューラルネットワークについてはどうでしょうか?猫の画像を見せたときに、各「ニューロン」が何をしているかを研究することは簡単です。しかし、すべてのニューロンに対して基本的な可視化を行うことさえ、通常は非常に困難です。
上記の「最近点」問題で使用した最終的なネットワークには17個のニューロンがあります。手書き数字を認識するネットワークには2190個あります。猫と犬を認識するために使用したネットワークには60,650個あります。60,650次元空間の内容を想像することは通常困難です。しかし、これは画像を処理するネットワークであるため、そのニューロン層の多くは、ネットワークが処理している入力のピクセル配列と同様に、配列として編成されています。
典型的な猫の画像を取ると
[図]
次に、最初の層のニューロンの状態を表す「画像」の集合を抽出できます。これらの画像の多くは、「背景のない猫」や「猫の輪郭」のようなものとして簡単に解釈できます:
[図]
第10層の出力を見ると、何が起こっているのかを解釈するのはすでに困難です:
[図]
しかし、全体的には、ニューラルネットワークは「特定の特徴を選び出し」(おそらく尖った耳もその一つです)、それらの特徴を使って画像の内容を決定していると言えます。しかし、「尖った耳」のような特徴は名前のある特徴ですが、ほとんどの場合、それらの特徴には名前がなく、形容するのも困難です【「猫」のほとんどの場合、猫の特徴にはよく知られた名前がなく、例えば「猫の全体的な輪郭が作る何らかの形状」など】。
私たちの脳も同様の特徴を使用しているのでしょうか?ほとんどの場合、わかりません。しかし、ここで示したニューラルネットワークの初期層は、画像の特定の特徴(例えば物体のエッジ)を選び出すように見え、これは私たちの脳の第一段階の視覚処理で選ばれる特徴と似ていることがわかっています。
しかし、ニューラルネットワークで「猫認識理論」を得たいと仮定しましょう。「見て、この特定のネットワークは猫を認識できる」と言えます。特定のネットワークは、問題がどれほど難しいか(例えば、いくつのニューロンや層が必要か)についての感覚を即座に与えてくれます。しかし、少なくとも現時点では、ネットワークが何をしているかを具体的に言葉で説明する正確な方法はありません。おそらく、それは本当に計算上既約【注:計算上既約は本稿で繰り返し登場する概念で、ある問題が本質的に単純な数学的方法や計算方法を持たず、近道ができないことを意味する。例えば、人間が理解したり計算したりするのに便利な方法を要約することはできない】だからであり、ニューラルネットワークの各計算ステップを一つ一つ明示的に追跡する以外に、その動作方法を見つける一般的な方法はありません。あるいは、ニューラルネットワークの本質を体系的に説明する科学体系や法則をまだ見つけていないからかもしれません。
ChatGPTを使って言語を生成する話をするときにも、同じ問題に直面します。繰り返しますが、今のところ「その動作方法を要約する」方法があるかどうかは明らかではありません。しかし、言語の豊かさと詳細(そして私たちの経験)は、画像よりもさらなる研究を可能にするかもしれません。
機械学習とニューラルネットワークの訓練
これまで、私たちは特定のタスクを「既に実行する方法を知っている」ニューラルネットワークについて議論してきました。しかし、ニューラルネットワーク(私たちの脳も同様)は、さまざまなタスクを実行できるだけでなく、例から徐々に「訓練」されることで、それらのタスクをより上手く実行できるようになります。
猫と犬を区別するニューラルネットワークを作成するとき、実際には(例えば)猫のひげを明示的に見つけるようなプログラムを書く必要はありません。その代わりに、多数の猫と犬の画像例を提示し、ネットワークにそれらから「機械学習」によって区別する方法を学ばせます。
重要なのは、訓練されたネットワークは、提示された特定の例から「一般化」して、一般的な操作方法を学習するということです。前に見たように、ネットワークは単に提示された特定の猫の画像のピクセルパターンを認識するだけではありません。むしろ、ニューラルネットワークは何らかの方法で「一般的な猫」の普遍的な性質を学習し、局所的なピクセルパターンに限定されずに画像を区別します。
ニューラルネットワークの訓練はどのように行われるのでしょうか?本質的には、与えられた例をネットワークがうまく再現できるような重みを常に探し求めています。そして、ネットワークがこれらの例の間を「合理的な」方法で「補間」(または「一般化」)することに依存しています。
以前の最近点問題よりも単純な問題を見てみましょう。次の関数をニューラルネットワークに学習させることを試みます。
[図]
このタスクには、1つの入力と1つの出力を持つネットワークが必要です。例えば:
[図]
しかし、どのような重みを使うべきでしょうか?考えられるすべての重みのセットを使用すると、ニューラルネットワークは何らかの関数を計算します。例えば、ランダムに選択したいくつかの重みを使用した結果は次のとおりです:
[図]
これらの場合、望みの関数を再現できていないことが明らかです。では、その関数を再現できる重みを見つけるにはどうすればよいでしょうか?
基本的な考え方は、多数の「入力→出力」の例を提供して「学習」させ、それらの例を再現できる重みを見つけようとすることです。以下は、徐々に例を増やしながら学習を完了させた結果です:
[図]
10,000 ~ 10,000,000 個の例
「訓練」の各段階で、ネットワーク内の重みは徐々に調整され、最終的に目的の関数をうまく再現するネットワークが得られます。では、どのように重みを調整するのでしょうか?基本的な考え方は、各段階で「目的の関数からどれだけ離れているか」を確認し、それに近づくように重みを更新することです。
通常、「損失関数」(「コスト関数」とも呼ばれる)を計算して、「目標からどれだけ離れているか」を把握します。ここでは単純な(L2)損失関数を使用します。これは、取得値と真の値の差の二乗和を計算するものです。訓練プロセスが進むにつれて、損失関数が徐々に減少し(タスクに応じて異なる「学習曲線」に従う)、ネットワークが(少なくとも非常に良い近似で)目的の関数をうまく再現する点に達する様子を見ることができます:
[図]
さて、最後に説明すべき重要な部分は、損失関数を減らすために重みをどのように調整するかです。前述のように、損失関数は(ニューラルネットワークを通じて)得られた値と真の値との間の「距離」を示します。しかし、「得られた値」は、各段階でのニューラルネットワークの現在のバージョンとその中の重みによって決まります。重みを変数、例えば w_i と仮定すると、これらの変数の値をどのように調整すれば、(それらに依存する)損失を最小化できるかを知りたいのです。
例えば、(実際に使用される典型的なニューラルネットワークを大幅に単純化して)2つの重み w1 と w2 しかないと想像してください。すると、損失関数は次のようになるかもしれません(等高線図/ヒートマップ):
[図]
数値解析では、このような場合に最小値を見つけるためのさまざまな手法が提供されています。典型的な方法は、初期の w1 と w2 から始めて、最も急な降下経路に沿って徐々に進むことです:
[図]
水が山を下るように、このプロセスは最終的に表面の何らかの極小値(「谷の中の湖」)に到達することしか保証されません。最終的な大域的最小値に到達できるとは限りません。
一般の関数では、「重みの景観」上で最も急な降下経路を見つける方法は明らかではありません。しかし、微積分が救いの手を差し伸べます。前述のように、ニューラルネットワークは常に、その入力と重みに依存する数学関数を計算するものと見なすことができます。ここで、これらの重みに関する導関数を考えます【もちろん、関数は「ほとんど至る所で微分可能」である必要がありますが、これは難しくありません】。すると、微積分の連鎖律【chain rule】によって、ニューラルネットワークの連続する層で行われる操作を「展開」できることがわかります【つまり、層ごとに導関数を計算できます】。その結果、ある種の局所近似の下でニューラルネットワークの操作を「反転」し、出力に関連する損失を最小化する重みを徐々に見つけることができます。
上の図は、2つの重みしかない非現実的な場合の最小化プロセスを示しています。しかし、実際には、より多くの重みがある場合でも(ChatGPTは1750億個の重みを使用しています)、少なくともある程度の近似レベルでは最小化が可能であることがわかっています。実際、2011年頃の「深層学習」における大きなブレークスルーは、ある意味で、多数の重みを扱う場合の方が(少なくとも近似では)最小化が容易であり、比較的少数の重みの場合には極小値(「山の湖」)に陥って「出口」を見つけられなくなりやすいという発見に関係しています【注:実際には、多くの理論が、次元が十分に高い(つまり重みが十分に多い)場合、極小値は主要な問題ではなく、「極小値が最適化の収束を妨げる主な原因である」というのは低次元での錯覚であることを確認しています】。
指摘しておく価値があるのは、一般的に、ほぼ同じ性能を持つニューラルネットワークを与える、異なる重みの集合が多数存在するということです。実際のニューラルネットワークの訓練では、多くのランダムな選択が行われ、その結果、以下のように「異なるが同等の解」が得られます:
[図]
しかし、そのような「異なる解決策」はそれぞれ、わずかに異なる動作を示します。訓練例を与えた領域の外側で「外挿」を求めると、まったく異なる結果が得られる可能性があります。
[図]
では、これらの結果のうちどれが「正しい」のでしょうか?実際には、それを言う方法はありません。どれも「観測データと一致している」のです。外挿の結果は数学的にすべて妥当です。例えば、数列の規則性:1, 2, 4, 8, 16, ? 最後の数には多くの選択肢があり、それぞれが「合理的な理由」に基づいています。ただし、人間にとっては、あるものの方が他のものより「より合理的」に見えることもあります。
ニューラルネットワーク訓練の実践とテクニック
特に過去10年間で、ニューラルネットワーク訓練の技術は多くの進歩を遂げてきました。そう、これは基本的に芸術なのです【現在ではよく「錬丹術」と呼ばれます】。時には、特に後から振り返ると、私たちの成功した応用は何らかの「科学的説明」に基づいているように見えます。しかし、ほとんどのものは試行錯誤によって発見され、追加されたアイデアやテクニックが徐々に、ニューラルネットワークを扱う上で重要な技術的伝統を築いてきました。
ここにいくつかの重要な要素があります。まず、特定のタスクに対してどのニューラルネットワーク構造を使うべきか。次に、ニューラルネットワークを訓練するためのデータをどのように取得するかという重要な問題があります。現在では、ネットワークをゼロから訓練する必要がないケースが増えています。新しいネットワークは、別の既に訓練されたネットワークを直接組み込んだり、少なくともそのネットワークを利用して自分自身の訓練例をさらに生成したりすることができます。
人は、特定のタスクごとに異なるニューラルネットワーク構造が必要だと思うかもしれません。しかし、明らかに異なるタスクであっても、同じ構造がしばしば機能することが分かっています。ある意味では、これは汎用計算の考え方(および私の計算等価性原理)を思い起こさせますが、後で議論するように、これはむしろ、私たちがニューラルネットワークに実行させようとするタスクが「人間らしい」ものであり、ニューラルネットワークがかなり普遍的な「人間らしいプロセス」を捉えることができるという事実を反映していると思います。
ニューラルネットワークの初期の頃は、「ニューラルネットワークの負担をできるだけ減らすべきだ」と考える傾向がありました。例えば、音声をテキストに変換する際には、まず音声を分析し、それを音素などに分解すべきだと考えられていました。しかし、少なくとも「人間らしいタスク」については、通常は「エンドツーエンドの問題」でニューラルネットワークを訓練しようとする方が良いことが分かりました【つまり、データの前処理や特徴量エンジニアリングに過度に介入せず、比較的未加工のデータをニューラルネットワークに与え、必要な中間特徴量やエンコーディングなどを自動的に「発見」させる】。
また、ニューラルネットワークに複雑な個別コンポーネントを導入し、実際に「特定のアルゴリズム的アイデアを明示的に実装」させるべきだという考えもありました。しかし、これもほとんどの場合には価値がなく、むしろ非常に単純なコンポーネントを扱い、それらに(通常は私たちには理解できない方法で)「自己組織化」させて、それらのアルゴリズム的アイデアの等価物を実現させる方が良いのです。
これは、ニューラルネットワークに「構造的アイデア」が関連しないという意味ではありません。例えば、画像を処理する初期段階では、局所的に接続されたニューロンの2次元配列を使用することが少なくとも非常に有用です。また、「シーケンスを振り返る」【つまり、後の層の後ろの方のニューロンが前の層の前の方のニューロンに接続(振り返り)するもので、これは「前の単語から後の単語を推測する」ことに非常に似ています】接続パターンは有用であるように思われます——後で見るように——ChatGPTのような人間の言語を扱う場合などに。
しかし、コンピュータと同様に、ニューラルネットワークの重要な特徴は、結局のところデータを処理しているだけだということです。現在のニューラルネットワーク——および現在のニューラルネットワーク訓練方法——は、ある意味では数値配列を専門に扱うだけです。しかし、処理の過程で、これらの配列は完全に並べ替えられ、再形成される可能性があります。例えば、上で数字を認識するために使用したネットワークは、2次元の「画像スタイル」の入力配列から始まり、すぐに多くのチャンネルに「厚くなり」、その後層を経るごとに1次元配列に「集中」し、最終的にこの1次元配列には異なる可能な出力数字を表す要素が含まれます:
[図]
しかし、特定のタスクにどれだけの大きさのニューラルネットワークが必要かをどのように判断するのでしょうか?これは芸術のようなものです。ある意味では、鍵は「タスクの難易度」を知ることです。しかし、人間らしいタスクについては、その難易度を推定するのは通常困難です。はい、コンピュータが非常に「機械的に」タスクを完了する体系的な方法が存在するかもしれません。しかし、少なくとも「人間レベルの」タスクをより簡単に完了できるようにする、いわゆるコツや近道があるかどうかを知るのは難しいです。ゲームを例にとると、あるゲームを「機械的に」プレイするには、巨大なゲームツリーを列挙する必要があるかもしれませんが、「人間レベルのプレイ」を実現するためのより簡単な(「発見的」)方法が存在する可能性があります。
小さなニューラルネットワークと単純なタスクを扱う場合、「この道は通じない」という状況が明確に見えることがあります。例えば、以下は前のセクションのタスクをいくつかの小さなニューラルネットワークで実行した最良の結果です:
[図]
ここで見られるのは、ニューラルネットワークが小さすぎると、(どんなに努力しても)望む関数を再現できないということです。しかし、規模が一定以上になると、通常は十分な数のサンプルで十分な時間訓練すれば、この問題を解決できます。さらに、これらの画像はニューラルネットワークのテクニックの一つを示しています。中間に「ボトルネック」を設計し、すべての情報をより小さな中間ニューロン数を通すように強制することで、ネットワークのサイズを圧縮し、性能にあまり影響を与えないようにすることができます(ちなみに、「中間層のない」ニューラルネットワーク(いわゆる「パーセプトロン」)は本質的に線形な関数しか学習できませんが、少なくとも1つの中間層が存在すれば、原理的には常に任意の関数を十分に近似できます。少なくとも十分な数のニューロンがあればですが、訓練を実行可能にするためには、通常は何らかの形の正則化や正規化が必要です)。
では、あるニューラルネットワークの構造が決まったと仮定しましょう。次に問題となるのは、ネットワークを訓練するためのデータをどのように入手するかです。ニューラルネットワークや機械学習における実際の課題の多くは、必要な訓練データの取得や準備に集中しています。多くの場合(「教師あり学習」)、入力と期待される出力の明確な例を入手したいと考えます。例えば、画像内の内容やその他の属性をラベル付けしたいかもしれません。場合によっては、明示的に何らかの労力をかけてラベル付けする必要があります【例:データアノテーションチーム】。しかし、多くの場合、既に完了した作業を活用したり、それを何らかの代理として利用することで問題を解決できます。例えば、ネット上の画像に付与されたaltテキスト【Webページ上の画像の代替テキスト】を利用して、その画像の情報をラベル付けすることができます。あるいは別の分野では、動画用に作成されたクローズドキャプションを利用できます。また、言語翻訳の訓練では、異なる言語で存在するWebページやその他のドキュメントのパラレル版を利用できます。
ニューラルネットワークを訓練するために、どれだけのデータを提示する必要があるのでしょうか?これも第一原理から見積もるのは困難です。もちろん、「転移学習」を用いて、別のネットワークで既に学習された重要な特徴のリストを「転移」することで、要求を大幅に減らすことができます。しかし一般的に、ニューラルネットワークはうまく訓練されるために「多くの例を見る」必要があります。特定のタスクでは、訓練例の反復が非常に重要になることがあります。実際、標準的な戦略の一つは、既存のすべての例を繰り返しニューラルネットワークに提示することです。各「訓練エポック」において、ニューラルネットワークは少なくとも少し異なる状態にあるため、「特定の例を思い出させる」ことは、その例を「記憶させる」のに役立ちます。(そう、これは人間の記憶における反復の効用に似ているかもしれません。)
しかし、単に同じ例を繰り返すだけでは不十分で、ニューラルネットワークに例のバリエーションを提示する必要もあります。これもニューラルネットワークのテクニックの一つであり、データ拡張によるバリエーションは複雑である必要はなく、基本的な画像処理で画像をわずかに修正するだけでも、ニューラルネットワークの訓練にとって「新しい画像と同じくらい有効」になります。同様に、自動運転車の訓練に必要な実際のビデオなどのデータを使い果たした場合、シミュレーションゲームのような環境で動作するシミュレーションデータを利用することができ、現実世界のシーンの詳細すべては必要ありません。
では、ChatGPTのようなモデルはどうでしょうか?ChatGPTには「教師なし学習」が可能という優れた特徴があり、訓練に必要な例を入手するのがより容易になります。思い出してください。ChatGPTの基本的なタスクは、与えられたテキストの断片をどのように続けるかを見つけることです。したがって、訓練例を入手するには、テキストの一部を取得し、その末尾を隠して「訓練用の入力」とし、「出力」は隠されていない完全なテキストとします。これについては後でさらに詳しく説明しますが、主なポイントは、画像内の内容を学習するのとは異なり、ChatGPTは「明示的なトークン」を必要とせず、実際には与えられたテキスト例から直接学習できるということです。
ニューラルネットワークの実際の学習プロセスは、結局のところ、どの重みが与えられた訓練例を最もよく捉えるかを決定することに帰着します。これを調整するために、さまざまな詳細な選択肢や「ハイパーパラメータ設定」(重みは「パラメータ」と見なせるため)があります。異なる損失関数の選択(二乗和、絶対値和など)があります。異なる損失最小化手法(各ステップで重み空間をどれだけ移動するかなど)があります。そして、最小化する損失を減らすための、連続する学習更新の「バッチ」サイズなどの問題があります。機械学習(例えばWolfram Language内)を適用して、機械学習を自動化し、ハイパーパラメータなどを自動設定することもできます。しかし最終的には、損失がどのように段階的に減少するかを観察することで、訓練プロセス全体を特徴づけることができます(このWolfram自社製品の表示のように)。
[図]
一般的に、損失は時間とともに減少しますが、最終的にはある値で安定します。その値が十分に小さければ、訓練は成功したと見なせます。そうでなければ、ネットワークアーキテクチャを変更することを試みるべきかもしれません。
「学習曲線」が安定するまでにどれくらいの時間がかかるかを知ることはできるでしょうか?他の多くのことと同様に、使用するニューラルネットワークの規模とデータ量に依存する、近似的なべき乗則のスケーリング関係が存在するようです。しかし、全体的な結論として、ニューラルネットワークの訓練は困難であり、大量の計算作業を必要とします。実際、作業の大部分は数値配列の操作(例えば行列乗算)であり、これはGPUが得意とする分野です。そのため、ニューラルネットワークの訓練はしばしばGPUの可用性に制限されます。
将来的に、根本的に優れたニューラルネットワークの訓練方法、あるいは基本的にニューラルネットワークと同等だがより効率的なアルゴリズム【注:ここでのChatGPT原文は「あるいは通常ニューラルネットワークが行うこと」】が登場するでしょうか?私はほぼ間違いなく登場すると思います。ニューラルネットワークの基本的なアイデアは、多数の単純な(基本的に同一の)コンポーネントを使用して柔軟な「計算構造」を作り、その「構造」を段階的に修正して例から学習できるようにすることです。現在のニューラルネットワークでは、実際には微積分の考え方(実数に適用)を用いてこの段階的修正を行っています。しかし、高精度の数値は重要ではないことが明らかになりつつあります。現在の方法でも、8ビット以下で十分かもしれません。
【より急進的な方法は】セル・オートマトンのような計算システムを使用し、多数の個別のビット上で並列操作を行うことです。このような段階的修正をどのように行うかはこれまで明確ではありませんでしたが、それが不可能である理由はありません。実際、「2012年のディープラーニングのブレークスルー」のように、より複雑な状況ではこのような段階的修正がより容易になるかもしれません。
ニューラルネットワーク(おそらく脳に似ている)は、実質的に固定されたニューロンのネットワークとして設定されており、変更されるのはそれらの間の接続の強さ(「重み」)です。(少なくとも若い脳では、大量の新しい接続が成長することもあるかもしれません。)しかし、これは生物学にとって便利な設定かもしれませんが、それが私たちが必要とする機能を実現するための最適な方法に近いかどうかはまったく明らかではありません。そして、漸進的なネットワークの書き換え(おそらく私たちのWolfram Physics Projectに似たもの)が、最終的にはより良い可能性があります。
既存のニューラルネットワークの枠組みの中でも、依然として重要な制限があります。現在のニューラルネットワークのトレーニング方法は、基本的に順次(バッチ単位、ミニバッチ)で行われ、各バッチの例の影響が逆伝播されて重みが更新されます。実際には、GPUを考慮しても、現在のコンピュータハードウェアはトレーニング中にほとんどの場合「アイドル」状態であり、一部の時間だけが更新に使用されます。ある意味では、これは現在のコンピュータがCPU(またはGPU)とメモリを分離している傾向があるためです。しかし、脳ではこれは異なる可能性があります。各「メモリ要素」(つまりニューロン)は、潜在的にアクティブな計算ユニットでもあります。このように将来のコンピュータハードウェアを設計できれば、トレーニングはより効率的になるかもしれません。
「十分に大きなネットワークがあれば何でもできる!」
ChatGPTのような技術の能力は非常に印象的に見えるため、単に「トレーニングを続けて」ニューラルネットワークをどんどん大きくすれば、最終的には「何でもできる」ようになると思うかもしれません。人間が直接考えられること(直感的にできること)に注目するなら、これはおそらく正しいでしょう。しかし、過去数百年の科学は、形式的なプロセスで推論できるが、人間が直接考えるのは難しいものがあることを教えています。
非自明な数学は良い例です。しかし、一般的には、これはある種の計算と等価です。そして最終的な問題は、計算の非還元性(計算不可簡約性)という現象です。ある計算は多くのステップを必要とするかもしれませんが、実際には非常に直接的な形に「簡約」できる場合があります。しかし、計算の非還元性の発見は、この方法が常に機能するわけではないことを意味します。逆に、以下の例のようなプロセス(一次元セルオートマトン)は、何が起こっているのかを理解するために、各ステップの計算を追跡することが不可避です:
[図]
私たちが通常脳で処理する事柄は、おそらく計算の非還元性を避けるように選択されています。脳内で(非還元な)数学的演算を行うには特別な努力が必要です。実際、頭の中で(例えば、純粋に頭の中で演算のプロセスを想像して、ファイルのSHA-256ダイジェストを生成するなど)非自明なプログラムの操作のステップを「考える」ことは、実質的に不可能です。
しかし、私たちにはコンピュータがあります。コンピュータを使えば、長時間の計算非還元なことを簡単に実行できます。重要なのは、一般的に、これらのことには近道がないということです。
はい、特定の計算システムで何が起こるかについて、多くの特定の例を記憶することはできます。おそらく、少数の一般化を可能にする(「計算還元可能な」)パターンさえ見えるかもしれません。しかし、計算の非還元性は、予期しないことが起こらないという保証が決してないことを意味し、特定の状況で実際に何が起こるかを知るには、明示的に計算を実行するしかありません。
最終的に、学習と計算の非還元性の間には根本的な緊張関係があります。学習は実際には、規則性を利用してデータを圧縮することです。しかし、計算の非還元性は、どれだけ多くの規則性を把握しても、圧縮できないデータが存在することを意味します。
実際、訓練可能なシステムの中に小さな計算デバイス(例えばセルオートマトンやチューリングマシン)を構築することを想像できます。これらのデバイスは、Wolfram|AlphaがChatGPTの良いツールであるように、ニューラルネットワークの良い「ツール」として機能します。しかし、計算の非還元性は、これらのデバイスに「入り込んで」学習させることができるとは期待できないことを意味します。
言い換えれば、能力と訓練可能性の間には根本的なトレードオフがあります。システムにその計算能力を最大限に活用させようとすればするほど、計算の非還元性を示すようになり、訓練が難しくなります。そして、訓練が容易であればあるほど、複雑な計算を行うことが難しくなります。
(現在のChatGPTの状況では、実際にはさらに極端です。なぜなら、各出力トークンを生成するニューラルネットワークは純粋な「フィードフォワード」ネットワークであり、ループがないため、非自明な「制御フロー」を使用した計算(例えば再帰や任意の長さのループ)ができないからです。)
もちろん、非還元な計算が本当に重要かどうか疑問に思うかもしれません。実際、人類の歴史の大部分において、それは特に重要ではありませんでした。しかし、私たちの現代の技術世界は、少なくとも数学的計算を利用した工学に基づいており、ますます汎用的な計算を使用するようになっています。自然界を見ると、それは非還元な計算で満ちており、私たちはそれらをシミュレートし、技術的目的に利用する方法をゆっくりと理解しつつあります。
はい、ニューラルネットワークは確かに自然界の規則性を認識できます。これらの規則性は、私たちも「AI支援なしの人間の思考」で容易に気づくことができます。しかし、数学や計算科学の領域に属する問題を解決したい場合、ニューラルネットワークは、効果的に「通常の」計算システムをツールとして「使用」しない限り、それを達成できません。
しかし、これらすべてには潜在的な混乱が存在するかもしれません。過去には、作文を含む多くのタスクがあり、これらはコンピュータにとって「基本的に難しすぎる」と考えられていました。現在、ChatGPTなどのモデルがこれらのタスクを実行できるのを見て、私たちは突然、コンピュータがより強力になったに違いないと考える傾向があります。特に、コンピュータがすでに基本的に実行できていたこと(例えば、以前のセルオートマトンのような計算システムの振る舞いを段階的に計算すること)を超えて。
しかし、これは正しい結論ではありません。計算上非還元なプロセスは依然として計算上非還元であり、コンピュータにとって根本的に困難なままです。たとえコンピュータがその個々のステップを簡単に計算できたとしてもです。むしろ、私たちが導き出すべき結論は、ある意味で、コンピュータには不可能だと思われていたタスク——例えば文章作成——の実際の計算が、私たちが考えていたよりも簡単だということです。
言い換えれば、ニューラルネットワークが文章をうまく書けるのは、文章作成という問題が、私たちが想像していたよりも計算の深さが浅いからです。ある意味で、これは人間がどのように文章作成や、一般的に言語を扱うのかという理論を前進させます。
十分に大きなニューラルネットワークがあれば、確かに、人間が簡単にできることなら何でも実現できるかもしれません。しかし、自然界の一般的な能力や、自然界から作り出した道具の能力を捉えることはできません。まさにこれらの道具——実用的なものであれ概念的なものであれ——こそが、ここ数世紀で私たちを「純粋な人間の思考」の限界を超えさせ、物理的・計算的な宇宙のより多くの部分を人間の目的のために捉えることを可能にしてきたのです。
埋め込みの概念
ニューラルネットワークは(少なくとも現時点では)基本的に数値に基づいています。そのため、テキストのようなものを処理するには、テキストを数値で表現する方法が必要です。もちろん、最初のステップとして(ChatGPTのように)辞書内の各単語に数値インデックスを割り当てることから始められます。しかし、「埋め込み」という重要な概念があります。このより優れたアイデアはChatGPTにとって極めて重要です。埋め込みとは、あるものの「本質」を数値の配列で表現しようとする試みと考えることができ、「近いもの」が近い数値で表現されるようにします。
例えば、単語の埋め込みは、意味的に類似した単語が埋め込み内の隣接する位置に現れるような、ある種の「意味空間」に単語を配置しようとする試みと見なせます。実際に使われる埋め込み——例えばChatGPTで——は、高次元の配列を伴うことが多いです。しかし、それらを2次元空間に投影すれば、単語がどのように「意味空間」に埋め込まれているかを示せます:
[図]
これらの埋め込みが私たちの日常的な印象と一致していることがわかります。しかし、このような埋め込みはどのように構築するのでしょうか?大まかなアイデアは、大量のテキスト(ここではウェブから収集した50億語)を調べ、異なる単語が異なるテキスト環境でどの程度「類似しているか」を見ることです。例えば、「アリゲーター」と「クロコダイル」は、意味が似ている文で互換的に使われることが多く、そのため埋め込み内で近い位置に配置されます。一方、「ニンジン」と「ワシ」は意味が似ている文に現れる可能性が低いため、埋め込み内で遠く離れて配置されます。
では、ニューラルネットワークを使ってこのような機能を実際に実装するにはどうすればよいでしょうか?まず、単語の埋め込みではなく、画像の埋め込みについて考えてみましょう。私たちは、配列を使って画像を特徴づける方法を見つけ、「私たちが類似していると考える画像」に類似した配列を割り当てたいと考えています。
「画像の類似性」はどのように判断するのでしょうか?画像が手書き数字の画像であれば、同じ数字であれば「2つの画像は類似している」と見なせます。以前、手書き数字を認識するように訓練されたニューラルネットワークについて議論しました。このニューラルネットワークは、最終出力で画像を10個の異なる容器(各容器は数字を表す)に分類するように設定されていると見なせます。
しかし、最終的な「これは『4』だ」という出力の前に、ニューラルネットワーク内部で何が起こっているかを「傍受」したらどうなるでしょうか【つまり、ニューラルネットワークの「中間表現」を取得する】?ニューラルネットワーク内部には、画像を「大部分は『4』に似ているが、少し『2』にも似ている」などと特徴づける数値が存在すると期待できます。このような数値を抽出し、埋め込みの要素として使用するというアイデアです。
これが一つの概念です。「どの画像がどの画像に近いか」を直接特徴づけようとする代わりに、明確に定義されたタスク(この場合は数字認識)を考え、そのタスクに対して明確な訓練データを取得し、ニューラルネットワークがこのタスクを実行する際に暗黙的に行う「近似判断」を利用します。したがって、「画像の近さ」について明示的に語る必要はなく、画像が表す具体的な数字について語り、「画像の近さ」が何を意味するかをニューラルネットワークに暗黙的に決定させるのです。
では、数字認識ネットワークの場合、具体的な実装はどのように機能するのでしょうか?ネットワークは11の連続した層から構成されていると想像できます。それらを図式的に次のようにまとめられます(活性化関数は別の層として表示):
[図]
最初に、実際の画像を最初の層に供給します。この画像はピクセル値の2次元配列で表されます。最終的に、最後の層から、10個の値を持つ配列が得られます。これは、ニューラルネットワークが画像が数字0から9のどれに対応すると思うかの「確信度」を表していると見なせます。
画像
[図]
を供給し、その最後の層のニューロンの値を取得します:
[図]
言い換えれば、この時点でニューラルネットワークはこの画像が数字4であると「非常に確信して」おり、実際に数字4を出力するには、最大値を持つニューロンの位置を選ぶだけです。
しかし、もう一歩先を見たらどうでしょうか?ネットワーク内の最後の操作は、いわゆるソフトマックスであり、これは「各数字の確信度、あるいは確率分布を強制的に出力する」ことを試みます【ChatGPTの元の訳では「確信度を強制する」とされていた】。しかし、その前のニューロンの値は次のようになります:
[図]
「4」を表すニューロンは依然として最も高い値を持っています。しかし、他のニューロンの値の中にも、画像に関する情報が含まれています。これらの数字のリストは、何らかの形で画像の「本質」を表すために使えると期待できます——つまり、埋め込みとして使える何かを提供してくれます。例えば、ここではそれぞれの4がわずかに異なる「シグネチャ」(または「特徴埋め込み」)を持っており、いずれも8とはまったく異なっています。
[図]
ここでは基本的に、10個の数字を使って画像を特徴付けています。しかし通常は、より多くの数字を使う方が良いでしょう。例えば、数字認識ネットワークでは、前の層にアクセスすることで、500個の数字を含む配列を得ることができます。これは「画像埋め込み」として使うのに妥当な配列かもしれません。
手書き数字の「画像空間」を明示的に可視化したい場合、次元削減を行い、得られた500次元のベクトルを3D空間に射影する必要があります。これにより、次のことが可能になります。
[図]
私たちはこれまで、同じ手書き数字に対応するかどうか(訓練データセットに基づいて)を判断することで画像の類似性を特定し、画像の特徵(そこから埋め込みベクトルを得る)を作成する方法について議論してきました。もし、5000種類の一般的な物体(猫、犬、椅子など)のいずれに各画像が属するかを識別できる訓練データセットがあれば、同じ方法で画像埋め込みベクトルを生成することもできます。这样、私たちは共通の物体によって「アンカー」された画像埋め込みベクトルを作成し、ニューラルネットワークの振る舞いに基づいて「一般化」することができます。この振る舞いが人間が画像を認識・解釈する方法と一致するなら、その埋め込みベクトルは最終的に「理にかなった」ものとなり、「人間らしい判断」を行うタスクにおいて有用になります。
では、同じ手法を使って単語の埋め込みベクトルを見つけるにはどうすればよいでしょうか?鍵となるのは、簡単に訓練できる単語タスクから始めることです。標準的なタスクは「単語予測」です。空格「the ___ cat」を想像してください。大規模なテキストコーパス(例えばウェブのテキストコンテンツ)に基づいて、空格に入る異なる単語の確率はどのくらいでしょうか?あるいは、「___ black ___」が与えられたとき、間に入る異なる単語の確率はどのくらいでしょうか?
この問題をニューラルネットワークのためにどう設定すればよいでしょうか?最終的には、すべてを数字で表現しなければなりません。一つの方法として、英語の一般的な50,000単語にそれぞれ一意の数字を割り当てることです。例えば、「the」は914、「 cat」(前にスペース付き)は3542かもしれません。(これらの数字はGPT-2が実際に使用している数字です。)したがって、「the ___ cat」という問題に対して、入力は{914, 3542}となります。出力は50,000個の数字を含むリストで、それぞれ可能な「穴埋め」単語の確率を効果的に与えるものです。同様に、埋め込みベクトルを見つけるためには、ニューラルネットワークが「結論に達する前」の「内部」を「インターセプト」し、そこに出現する数字のリストを取得したいのです。このリストは「各単語を記述する」数字と見なすことができます。
では、これらの特徵はどのようなものに見えるでしょうか?過去10年間で、一連の異なるシステム(word2vec、GloVe、BERT、GPTなど)が開発されてきました。それぞれが異なるニューラルネットワーク手法に基づいています。しかし最終的に、これらのシステムはすべて単語を数百から数千の数字のリストで記述します。
生の形式では、これらの「埋め込みベクトル」はかなり無意味です。例えば、これはGPT-2が3つの特定の単語に対して生成した生の埋め込みベクトルです。
[図]
これらのベクトル間の距離を測定すれば、単語間の「近さ」を見つけることができます。このような埋め込みの「認知的」な意味については、後でより詳しく議論します。重要なのは、単語を「ニューラルネットワークに親和性のある」数字の集合に変換する有用な方法があるということです。
しかし実際には、単語だけでなく、単語のシーケンス、あるいはテキストブロック全体を同じ方法で記述することもできます。ChatGPTはまさにこのように処理しています。既存のテキストを入力として受け取り、それを表す埋め込みベクトルを生成します。次に、その目標は、出現しうる異なる単語の確率を見つけることです。そして、その答えは基本的に各可能な単語の確率を与える数字のシーケンスとして表現されます。
(厳密には、ChatGPTは単語を処理するのではなく、「トークン」【token】を処理します——トークンは便利な言語単位で、単語全体,也可能只是像「pre」「ing」「ized」のような部分単語です。トークンを使用することで、ChatGPTは珍しい単語や複合語、非英語単語をより容易に処理でき、時には新しい単語を作り出すことも可能です。)
ChatGPTの内部
さて、いよいよChatGPTの内部について説明する準備が整いました。そう、これは根本的に巨大なニューラルネットワークです——現在のところ、いわゆるGPT-3ネットワークのバージョン【GPT-3.5】であり、1750億もの重みを有しています。多くの点において、このニューラルネットワークは私たちが議論してきた他のニューラルネットワークと非常に似ています。しかし、これは特に自然言語処理のために調整されたニューラルネットワークであり、その最も顕著な特徴として「transformer」と呼ばれるニューラルネットワークアーキテクチャを採用しています。
先ほど議論した最初のニューラルネットワークでは、各ニューロンは特定の層において、前の層のすべてのニューロンと(少なくともいくつかの重みを持って)接続されていました。しかし、特定の既知の構造を持つデータを処理する場合、このような全結合ネットワークは過剰に複雑になる可能性があります。そのため、画像を処理する初期段階では、いわゆる畳み込みニューラルネットワークがよく使用されます——このネットワークでは、ニューロンは画像内のピクセルグリッドに似た配置され、近接するグリッド上のニューロンとのみ接続されます。
transformerのアイデアは、テキストを構成するトークン列に対して同様の操作を実行することです。しかし、transformerは列内で接続が存在する固定領域を定義するだけでなく、「注意(アテンション)」の概念を導入し、列の特定の一部に他よりも注目する考え方を採用しています。もしかしたらある日、汎用的なニューラルネットワークから始めて、トレーニングによってすべてをカスタマイズすることが有意義になるかもしれません。しかし、少なくとも現状では、transformerのように物事を「モジュール化」することが、実際には極めて重要であるように思われます。これは私たち自身の脳が行っていることとも一致するかもしれません。
それでは、ChatGPT(あるいはそれをベースにしたGPT-3ネットワーク)は実際には何をしているのでしょうか?覚えておいてほしいのは、その全体的な目標は、学習した内容(ウェブなどを含む数十億ページのテキストを閲覧すること)から「それらしく」テキストを続行することです。したがって、あらゆる瞬間において、それはある量のテキストを持っており、次のトークンとして適切な選択を追加することを目標としています。
それには3つの基本的な段階があります。まず、これまでに得られたテキストに対応するトークン列を取得し、それらを表す埋め込み(つまり、数値の配列)を求めます。次に、この埋め込みに対して操作を行います——「標準的なニューラルネットワークの方法」で、値が連続する層へと「層ごとに流れ」——新しい埋め込み(つまり新しい数値配列)を生成します。そして、この配列の最後の部分から、およそ50,000個の値の配列を生成します。これらの値は、異なる可能な次のトークンの確率に変換されます。(はい、偶然にも英語で使用される一般的な単語と同じ程度の数のトークンが使用されていますが、トークン全体で構成される単語は約3,000個のみで、残りは断片です。)
重要なのは、このプロセスの各部分がニューラルネットワークによって実装されており、その重みはエンドツーエンドのネットワークトレーニングによって決定されるということです。つまり、実際には全体のアーキテクチャを除いて、すべてがトレーニングデータから「学習」され、「明示的に設計」されるわけではないということです。
しかし、アーキテクチャの設定には多くの詳細があり、これらはさまざまな経験とニューラルネットワークの知識を反映しています。細部にわたることは確かですが、これらの詳細のいくつかについて話すことは依然として有意義であると思います。これにより少なくとも、ChatGPTのようなシステムを構築するのにどれだけの労力が必要かを実感できるでしょう。
まずは埋め込みモジュールです。以下はGPT-2のWolfram言語による概略図です:
[図]
入力はn個のトークンからなるベクトルです(前述のとおり、1から50,000程度の整数で表されます)。これらのトークンのそれぞれは埋め込みベクトルに変換されます(GPT-2では長さが768、ChatGPTのGPT-3では12,288)(単層ニューラルネットワークを介して行われます)。同時に、これらのトークンの(整数)位置列を取得し、これらの整数から別の埋め込みベクトルを作成する「補助チャネル」が存在します。最後に、トークン値とトークン位置の埋め込みベクトルが加算され、埋め込みモジュールからの埋め込みベクトルの最終的な列が生成されます。
なぜトークン値とトークン位置の埋め込みベクトルを単に加算するだけで十分なのでしょうか?ここには特に科学的な理由はないと思います。人々はさまざまな異なる方法を試してきましたが、この方法が効果的な方法の一つであることがわかりました。そしてニューラルネットワークの話の一部は、ある意味で、セットアップが「おおよそ正しければ」、通常は十分なトレーニングによって細部を調整でき、「ニューラルネットワークがどのように自身を構成するか」を実際に「理解する」エンジニアリングの詳細にはとらわれなくてよいということです。
これが埋め込みモジュールの動作方法です。文字列「hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye」を操作します:
[図]
各トークンの埋め込みベクトルの要素がページ下部に表示されています。一方、ページ上部には、まず一連の「hello」の埋め込みが、次に一連の「bye」の埋め込みが表示されています。上部の2番目の配列は位置埋め込みであり、その一見ランダムに見える構造は単に「学習された」ものです(この場合はGPT-2において)。
さて、埋め込みモジュールの後、transformerの「本題」が始まります:一連のいわゆる「アテンションブロック」です(GPT-2には12個あり、ChatGPTのGPT-3には96個あります)。このすべては非常に複雑で、理解しにくい典型的な大規模エンジニアリングシステム、あるいは生物学的システムに似ています。しかし、いずれにせよ、これが単一の「アテンションブロック」の模式的表現です(GPT-2に適用した場合):
[図]
各注意ブロックには一連の「アテンションヘッド【attention head】」が存在し(GPT-2 では 12 個、ChatGPT の GPT-3 では 96 個)、各ヘッドは埋め込みベクトルの異なる値ブロックに対して独立に動作します。(確かに、埋め込みベクトルをいくつの部分に分割するか、また異なる部分に分割することの意味や利点が何なのかはわかっていません。これは単に「効果的であることが発見された」事柄の一つに過ぎません。)
では、アテンションヘッドは何をしているのでしょうか?基本的に、これらはトークン列を「振り返る」方法(つまり、それまでに生成されたテキスト)であり、「過去の内容」を次のトークンを見つけるのに役立つ形でパッケージ化します。上記のパート 1 では、直接的な前置詞に基づいて単語を選択するために 2-gram を使用することについて触れました。transformer における「アテンション」メカニズムは、さらに前の単語にも「注意を払う」ことを可能にし、潜在的に以前の単語を「捕捉」して利用することができます。例えば、動詞が多くの単語前に出現した名詞を参照できるような場合です。
より詳細に言えば、アテンションヘッドが行うことは、異なるトークンに関連する埋め込みベクトルのブロックを、特定の重みを付けて再構成することです。例えば、最初の注意ブロック(GPT-2 の 12 個のアテンションヘッドのうちの一つ)は、上記の「hello, bye」文字列に対して「トークン列全体を後方参照する重み再構成」パターンが次のように行われます:
[図]
アテンションヘッドによる処理後、生成された「再重み付けされた埋め込みベクトル」(GPT-2 では長さ 768、ChatGPT の GPT-3 では長さ 12,288)は、標準的な「全結合」ニューラルネットワーク層を通過します。この層が実行している操作を理解するのは困難です。しかし、以下はそれが使用している 768×768 の重み行列のプロットです(ここでは GPT-2 の場合):
[図]
64×64 の移動平均を取ると、ある(ランダムウォーク【ブラウン運動に類似したランダム拡散パターンを指す】)構造が現れ始めます:
[図]
この構造は何によって決定されるのでしょうか?最終的には、これは人間の言語の特徴の何らかの「ニューラルネットワーク符号化」かもしれません。しかし、今のところ、これらの特徴は未知である可能性があります。実際に、私たちは「ChatGPT の脳を開いている」(あるいは少なくとも GPT-2 を)のであり、そこで起こっていることはすべて複雑で、理解できない——たとえ最終的にそれが認識可能な人間言語を生成するとしても——ということを発見しています。
さて、一つの注意ブロックを経由した後、新しい埋め込みベクトルが得られ、それが順番に他の注意ブロックを通過します(GPT-2 では合計 12 個、GPT-3 では 96 個)。各注意ブロックには、それぞれ特定の「アテンション」と「全結合」の重みパターンがあります。以下は、GPT-2 の最初のアテンションヘッドの「hello, bye」入力に対する注意重みのシーケンスです:
[図]
以下は、全結合層の(移動平均された)「行列」です:
[図]
興味深いことに、異なる注意ブロックにおけるこれらの「重み行列」はかなり類似して見えても、重み大きさの分布は異なる場合があります(また、常にガウス分布であるとは限りません):
[図]
では、一つの注意ブロックを経由した後、transformer の正味の効果は何でしょうか?基本的に、それはトークン列の元の埋め込み集合を最終的な集合へと変換することです。ChatGPT の特定の手法は、この集合内の最後の埋め込みを選択し、それを「デコード」して次のトークンの確率リストを生成することです。
これが ChatGPT の内部の大まかな様子です。複雑に見えるかもしれませんが(その多くの必然的にやや「arbitrary な工学的選択」だけでなく)、実際に涉及する最終的な要素は非常にシンプルです。なぜなら最終的に私たちが扱っているのは「人工ニューロン」で構成されるニューラルネットワークに過ぎず、各ニューロンは単純な操作——つまり、一組の数値入力を特定の重みと組み合わせる——を実行するからです。
ChatGPT の元の入力は数値配列(これまでのトークンの埋め込みベクトル)であり、ChatGPT が新しいトークンを生成するために「実行」されるとき、それはこれらの数値がニューラルネットワークの層を通じて「波紋」のように広がり、各ニューロンが「自分のタスクを実行」し、結果を次の層のニューロンに渡すことです。ループや「逆戻り」はありません。すべてはネットワークへの「フィードフォワード」です。
これは典型的な計算システム(チューリングマシンなど)とは大きく異なります。チューリングマシンでは、結果が同じ計算要素によって繰り返し「再処理」されます。少なくとも特定の出力トークンを生成する面では、ここでの各計算要素(つまりニューロン)は一度だけ使用されます。
しかし、ある意味では、ChatGPT には依然として「外部ループ」が存在しています。すなわち、新しいトークンを生成するたびに、ChatGPT は常にそれまでに出現したすべてのトークン列を「読み込み」(つまり入力として受け取り)ます。これには、ChatGPT が以前に「書き込んだ」トークン自体も含まれます。この設定を、ChatGPT が少なくともその最も外側の層において「フィードバックループ」を含んでいると解釈することもできます。もっとも、各反復は生成されたテキスト内にトークンとして明示的に現れるのですが。
しかし、ChatGPT の中核に戻りましょう:各トークン生成のためのニューラルネットワークが繰り返し使用されます。某种程度上、それは非常にシンプルです:まったく同じ人工ニューロンの集合が一式あります。ネットワークの一部の層は(「全結合」)ニューロン層のみで構成され、そこでは与えられた層上の各ニューロンが前層のすべてのニューロンと(特定の重みで)接続されています。しかし、特にその transformer アーキテクチャのために、ChatGPT はより多くの構造を持ち、異なる層の特定のニューロン間でのみ接続が行われます。(もちろん、「すべてのニューロンが接続されている」と表現することもできます——しかし、一部の重みはゼロです。)
さらに、ChatGPTのニューラルネットワークの一部の側面は、自然に「同質」な層のみで構成されているとは考えられていません。例えば、上記の象徴的な概要図(Transformer構造図)に示されているように、アテンションブロック内部には「複数のコピー」が存在する箇所があり、各コピーは異なる「処理経路」を通じて処理され、異なる数の層を経由した後に再結合されます。しかし、これは便宜上の表現として有効かもしれませんが、少なくとも原理的には常に「密に充填された」層(原文ママ)と見なすことができ、そのうち一部の重みがゼロであるに過ぎません。
ChatGPTの最長経路を見ると、約400の(重要な)層が関与しています——(他のニューラルネットワークと比較して)それほど多くはありません。しかし、数百万のニューロンがあり、合計1750億の接続、つまり1750億の重みが存在します。認識すべきことの一つは、ChatGPTが新しいトークンを生成するたびに、これらすべての重みを含む計算を実行しなければならないということです。実装の観点から見ると、これらの計算は高度に並列化可能であり、GPU上で効率的に実行できます。しかし、生成されるトークンごとに、依然として1750億回の計算(実際にはそれ以上)を実行する必要があります。そのため、ChatGPTを使用して長いテキストを生成するには時間がかかるのも不思議ではありません。
しかし最終的に注目すべきは、これらの操作は——それ自体は非常に単純ですが——一緒になって、驚くほど「人間らしい」方法でテキストを生成できることです。繰り返し強調しますが(少なくとも私たちが知る限り)、ChatGPTの設計が自然言語のようなあらゆる問題に対して必然的に有効であると予見する「究極の理論」は存在しません(しかし実際には非常に有効です)。実際、これから議論するように、私はこれを——潜在的に驚くべき——科学的発見として捉えるべきだと考えています。すなわち、ChatGPTのようなニューラルネットワークは、人間の脳が言語を生成する際に達成している本質を、何らかの形で捉えているのです。
ChatGPTの訓練
ここまでで、ChatGPTが設定完了後にどのように動作するかについて大まかに理解しました。では、どのように設定されるのでしょうか?その1750億のニューロンネットワークの重みはどのように決定されるのでしょうか?これは基本的に、人間が書いた大量のテキストコーパス——ウェブページ、書籍などを含む——に基づく大規模な訓練によって得られます。先に述べたように、たとえこれらの訓練データがあっても、ニューラルネットワークが「人間らしい」テキストを生成できるかどうかは確実ではありません。そして、それを実現するためには、詳細な工学的設計が必要です。しかし、ChatGPTの最大の驚きと発見は、それが可能であるということです。実際、「たった」1750億の重みを持つニューラルネットワークが、人間が書いた「合理的なモデル」のテキストを生成できるのです。
現代では、膨大な量の人間のテキストがデジタル形式で存在しています。公開ウェブ上には少なくとも数十億の人間が書いたページがあり、合計で約1兆語のテキストがあると推定されます。非公開のウェブページを含めると、その数は100倍になる可能性があります。現在、500万冊以上のデジタル化された書籍が利用可能であり(ただし、出版された書籍は約1億冊)、さらに約1000億語のテキストを提供しています。動画からの音声認識によるテキストなどはまだ含まれていません。(個人的な比較として、私が生涯に発表したテキストの総量は300万語未満、過去30年間に書いた電子メールの総量は約1500万語、タイプした総文字数はおそらく5000万語に達します——ここ数年だけで、ライブ配信で1000万語以上を話しました。そうです、私はこれらのコンテンツからボットを訓練するつもりです。)
さて、これらすべてのデータがあるとして、どのようにニューラルネットワークを訓練するのでしょうか?基本的なプロセスは、以前の単純な例で議論したものと同じです。一連の例を提供し、ネットワークがこれらの例に対して生成する誤差(「損失」)を最小化するように、ネットワーク内の重みを調整します。「バックプロパゲーション」における主なコストは、これを実行するたびに、ネットワーク内のすべての重みが通常わずかに変化し、大量の重みを処理する必要があることです。(実際の「逆方向計算」は、通常、順方向計算よりもわずかに複雑な定数倍程度です。)
最新のGPUハードウェアを使用すると、数千の例の結果を並列計算できます。しかし、ニューラルネットワークの重みを実際に更新する場合、現在の方法では基本的に一度に1バッチずつ実行する必要があります。(そうです、これが実際の脳が計算とメモリ要素を組み合わせる利点かもしれません。)
以前に議論した数値関数の学習という一見単純なケースでも、ネットワークをうまく訓練するには、少なくともゼロから始める場合、通常は数百万の例が必要であることがわかりました。では、「人間の言語のような」モデルを訓練するには、どれだけの例が必要なのでしょうか?理論的には、それを知る根本的な方法はないように思われます。しかし実際には、ChatGPTは数兆語のテキストから訓練されることで成功しています。
一部のテキストは複数回使用され、他のテキストは一度だけ使用されます。しかし、何らかの形で、見たテキストから「必要なものを得ています」。しかし、これほど多くのテキストで訓練する場合、それを「うまく学習する」ためにはどれだけの大きさのネットワークが必要なのでしょうか?繰り返しますが、根本的な理論はありません。最終的には——後でさらに議論するように——人間の言語とその典型的な使用法には、一定の「アルゴリズム」が存在する可能性があります。しかし、次の問題は、ニューラルネットワークがそのアルゴリズムの内容に基づくモデルを実装する際にどれほど効率的かということです。私たちはまだそれを知りませんが、ChatGPTの成功はそれがかなり効率的であることを示しています。
最後に、ChatGPT が約 2000 億個のパラメータ(重み)だけで機能を実現している点に注目できます。この数字は、ChatGPT が受け取った学習データの総単語数(またはトークン数)に匹敵します。某种程度上、これは驚くべきことかもしれません(ChatGPT のより小さなモデルでもこの現象は観察されています)。つまり、「実際に機能しているネットワークのサイズ」と「学習データのサイズ」が非常に近いということです。もちろん、「ChatGPT の内部」にウェブや書籍などのすべてのテキストが何らかの形で直接保存されているわけではありません。ChatGPT の内部には、実際には、すべてのテキストの集合的構造を、10 桁程度の精度で分散的にエンコードした数値が含まれています。
言い換えれば、私たちは人間の言語の「実効的な情報内容」と、人々が通常それを使って何を語るのかを考えることができます。言語の生コーパスと、ChatGPT のニューラルネットワーク表現があります。この表現は、おそらく以下に述べるような「アルゴリズム的に最小化された」表現からは程遠いものです。しかし、これはニューラルネットワークが容易に利用できる表現形式です。この表現では、学習データの圧縮はほとんど行われていないように見えます。平均すると、学習データの 1 単語あたりの「情報内容」を担うのに必要なニューラルネットワークの重みは、わずかに 1 個未満です。
ChatGPT を動かしてテキストを生成するとき、基本的にすべての重みを一度ずつ使用する必要があります。したがって、重みの数が n 個であれば、およそ n 個の計算ステップが必要になります。実際には、これらの計算ステップの多くは GPU 内で並列処理が可能です。しかし、これらの重みを設定するために約 n 個の学習データ単語が必要だとすると、上記の議論から、ネットワークの学習には約 n² 個の計算ステップが必要になると言えます。これが、現在の方法で最終的に数十億ドルの学習コストがかかる理由です。
基本学習を超えて
ChatGPT の学習において、ワークの大部分は、ウェブ、書籍などからの既存テキストを大量に示すことです。しかし、結果として、もう一つの部分も非常に重要であることが分かっています。
ニューラルネットワーク内部の ChatGPT が、提示された生のテキストコーパスから「生の学習」を完了すると、独自のテキストの生成を開始し、プロンプトなどからテキストを継続することができるようになります。しかし、特に長文の場合、人間らしくない方法で「彷徨う」【人間が使う慣習に合わず、効果的なやりとりができないテキストを生成すること】と、結果は一般的に妥当であるように見えますが、従来のテキスト統計分析では容易には検出できません。しかし、人間の読者はこの点に容易に気付きます。
ChatGPT 構築における重要な発想は、ウェブのようなものの「受動的な読書」の後に、人間との能動的なやりとりが必要だということです。人間はそのアウトプットを確認し、「良いチャットボットになるにはどうあるべきか」についてフィードバックを提供します。しかし、ニューラルネットワークはこのフィードバックをどのように活用するのでしょうか。最初のステップは、人間がニューラルネットワークの結果を評価することです。次に、これらの評価を予測しようとする別のニューラルネットワークモデルが構築されます。この予測モデルは実質的に損失関数として実行でき、元のネットワークを調整することを可能にし、人間のフィードバックによるネットワークの「調整」を実現します。实践中、システムが「人間らしい」出力を生成する上で、このアプローチは非常に効果的であるようです。
全体として興味深いのは、ネットワークを有用な特定の方向に発展させるためには、ごくわずかな「きっかけ」しか必要としないようだということです。ネットワークが「何か新しいことを学んだ」ように振る舞うためには、学習アルゴリズムを実行し、重みを調整するなどを行わなければならないと考える人もいるでしょう。
しかし、現実はそうではありません。むしろ、ChatGPT に与えるプロンプトの一部で一度だけ指示を出せば、ChatGPT はそれをうまく利用してテキストを生成できます。この働き方は、ChatGPT が「実際に何をしているのか」、そしてそれが人間の言語と思考の構造にどう関連しているのかを理解する上で重要な手がかりだと私は考えています。
これには確かに人間に似た特徴があります。少なくとも、すべての事前学習を完了した後であれば、一度何かを伝えさえすれば、ChatGPT はそれを「記憶」することができます——少なくとも、テキストを生成するために使用するには「十分な長さ」だけ。とは言うものの、この場合、実際には何が起きているのでしょうか。おそらく「教えたい内容はすでにどこかに存在している」——単に正しい位置に導いているだけなのだ、と考える人もいるでしょう。しかし、これは妥当とは思えません。むしろ可能性が高いのは、要素は確かに存在しているものの、具体的な内容は「これらの要素間の経路」のようなものによって定義されており、それはあなたが何かを伝えたときに導入されるものだ、ということです。
実際、人間の場合と同様に、何か奇妙で予想外の事柄を伝えた場合、それが ChatGPT の知っている枠組みに合わなければ、うまく「統合」できないように見えます。基本的に、すでに持っている枠組みに沿って単純に動く場合にのみ、それを「統合」できるのです。
ニューラルネットワーク自体には、本質的なアルゴリズム上の限界があることも再度指摘しておく価値があります。「これはこれになる」といった形式の「浅い」ルールを伝えた場合【この文は翻訳が困難】、ニューラルネットワークはおそらくこれらのルールをよく表現し再現できるでしょう。実際には、「すでに知っている」言語から即座に従うべきパターンを提供するでしょう。しかし、既約ステップを含む計算が絡むと、うまく機能しなくなります。(各ステップで、新しいトークンを生成する以外に、ループせず単にネットワーク内で「データを順伝播」するだけであることを思い出してください。)
もちろん、ネットワークは特定の「還元不可能な」計算の答えを学習することができます。しかし、組み合わせの数が膨大になった場合、そのような「テーブルルックアップ的」な方法は機能しなくなります。したがって、ちょうど人間と同じように、ニューラルネットワークが「到達」して実際の計算ツールを使う時が来たのです。(ええ、Wolfram|Alpha と Wolfram Language は、「世界の事物について語る」ように構築されているため、言語モデルのニューラルネットワークと非常に相性が良いのです。)
ChatGPT を成功させているものは何か?
人間の言語——そして言語を生成することに関わる思考プロセス——は常に複雑性の極致とみなされてきました。事実、人間の脳の「わずか」1000 億程度のニューロン(おそらく 1 兆の接続)がこのタスクを担えるというのは驚くべきことのように思えるかもしれません。或许、人々は、脳が単にニューロンのネットワークで構成されているだけでなく、まだ発見されていない新しい物理学的層が存在するのではないかと想像するかもしれません。しかし、今、ChatGPT が手に入ったことで、私たちは重要な新しい情報を得ました。脳のニューロン数に匹敵する接続数を持つ純粋な人工ニューラルネットワークが、人間言語を驚くほど生成できるということです。
ええ、それでもこれは巨大で複雑なシステムです——そのニューラルネットワークの重みの数は、現在世界で入手可能なテキストの単語数とおおよそ同じです。しかし、それでもなお、言語の豊かさとそれが語れる事柄が、このような有限なシステムの中に封じ込められ得ることは、どこか信じがたいことです。その一因は間違いなく、普遍的な現象(最も早くはルール 30 の例で明らかになったように)にあります。基礎となるルールが単純であっても、計算プロセスは実際にはシステムの表面的な複雑性を大いに増大させることができるのです。しかし、上述したように、ChatGPT で使用されているニューラルネットワークは、トレーニングをより扱いやすくするために、この現象の影響——そしてそれに関連する計算の還元不可能性——を特に制限するように構築される傾向があります。
では、ChatGPT のようなものはどのようにして言語を実現しているのでしょうか?基本的な答えは、根本的に、言語は見た目よりもある意味で単純だということです。つまり、ChatGPT が最終的に率直なニューラルネットワーク構造を採用しているにもかかわらず、それでも人間の言語とその背後にある思考の本質を首尾よく「捉える」ことができるのです。さらに、トレーニングの過程で、ChatGPT はこれらを可能にする言語(と思考)のあらゆる法則を何らかの形で「暗黙的に発見」しました。
ChatGPT の成功は、基本的かつ重要な科学的証拠を私たちに提示していると私は思います。それは、重大な新しい「言語の法則」——そして効果的な「思考の法則」——を発見できると期待できるということです。ニューラルネットワーク構築物としての ChatGPT において、これらの法則はせいぜい暗黙的なものです。しかし、何らかの形で法則を明示化することができれば、ChatGPT が行うようなことをより直接的、効率的、かつ透明な方法で行うことが可能になるでしょう。
では、これらの法則はどのようなものになるでしょうか?最終的には、それらは言語——そして私たちが言語で語る事柄——をどのように組み合わせるかについての指針を提供しなければなりません。後ほど、ChatGPT の「内部を覗く」ことがこの点についての手がかりを与えてくれる可能性があることと、計算言語学の構築から得られる前進の道筋について議論します。しかしその前に、長く知られている 2 つの「言語の法則」の例——そしてそれらが ChatGPT の操作とどのように関連するか——について議論しましょう。
1 つ目は、言語の文法です。言語は単なるランダムな単語の混ざり合いではありません。むしろ、異なる種類の単語がどのように組み合わされるかについて、(かなり)明確な文法規則があります。英語では、例えば、名詞の前には形容詞を、後ろには動詞を置くことができますが、通常 2 つの名詞を直接並べることはできません。このような文法構造は、(少なくとも近似的に)「解析木」を定義する一連のルールによって捉えることができます:
[図]
ChatGPT はこれらのルールを明示的に「知っている」わけではありませんが、トレーニングの過程で暗黙的に「発見」し、それからそれらに従うことを得意としているようです。これはどのように実現されているのでしょうか?「マクロ」のレベルからは明確ではありませんが、簡単な例を通じていくらかの洞察を得ることは有益かもしれません。
「( 」と「 )」の並びからなる「言語」を考えてみましょう。その文法は、かっこが常に平衡を保つべきだと規定しており、以下のような解析木になります:
[図]
ニューラルネットワークを訓練して「文法に適合した」かっこの並びを生成させることができるでしょうか?ニューラルネットワークにはシーケンスを処理する様々な方法がありますが、ChatGPT と同じように transformer ネットワークを使用します。そして、単純な transformer ネットワークを用意すれば、正しいかっこの並びをトレーニングサンプルとして与えることができます。1 つの微妙な点(実際、ChatGPT が人間言語を生成する際にも現れます)は、「コンテンツトークン」(ここでは「(」と「)」)に加えて、出力を続けるべきではないことを示す「終了」トークンを含めなければならないということです(ChatGPT にとっては「物語の終わり」に到達したことになります)。
注意ブロックを 1 つだけ持つ transformer ネットワークを、特徴ベクトルの長さ 128 で 8 ヘッド構成で設定すると(ChatGPT も特徴ベクトルの長さ 128 を使用しますが、96 個の注意ブロックがあり、各注意ブロックに 96 ヘッドあります)、それにかっこの言語について多くを学習させることは不可能なようです。しかし、2 つの注意ヘッドを使用すると、学習プロセスは収束するように見えます——少なくとも約 1000 万のサンプルを与えた後のことです(transformer ネットワークの一般的な例として、より多くのサンプルを見せても、パフォーマンスが低下するだけのようです)。
したがって、このネットワークに対して、ChatGPT のような操作を行い、かっこのシーケンスで次のトークンが何になるべきかの確率を問い合わせることができます:
[図]
最初のケースでは、ネットワークは「非常に確信して」シーケンスがここで終了できないと判断します。これは良いことです。なぜなら、もし終了すると括弧のバランスが崩れるからです。しかし、2番目のケースでは、シーケンスがここで終了できることを「正しく認識」しつつも、「(」を置いて、その後に「)」が続く可能性がある「再開」ができることも「指摘」しています。しかし困ったことに、約40万の重みをかけて訓練したにもかかわらず、次のトークンが「)」である確率を15%と予測します。これは誤りであり、必然的に括弧のバランスが崩れます。
もしネットワークに、徐々に長くなる(シーケンスに対して最も確率の高い完了形を生成するよう要求すると、以下の結果が得られます。
[図]
そう、ニューラルネットワークはある程度の長さまではうまく機能します。しかし、括弧が閉じているかどうかを明示的に計算するような、より複雑な「アルゴリズム的」タスクを実行する必要がある場合、ニューラルネットワークは「計算能力が浅すぎて」信頼性高く実行することができません。現在の完全なChatGPTでさえ、長いシーケンス内の括弧を正しくマッチングするのは困難です。
では、これはChatGPTのようなアプリケーションや、英語のような言語の文法にとって何を意味するのでしょうか?括弧言語はより「ミニマル」であり、どちらかというと「アルゴリズム的な」言語です。しかし英語では、単語に基づく局所的な選択や他のヒントによって、文法的な妥当性を「推測」することができます。そう、ニューラルネットワークはこの点でより優れています。たとえ「形式的に正しい」ケースを見逃すことがあっても、人間も同様に見逃す可能性があります。しかし主要なポイントは、言語には全体的な文法構造があるということです。つまり、すべての規則性を含む意味が、ニューラルネットワークが学習する必要のある「程度」をある程度制限しているのです。ニューラルネットワークのトランスフォーマーアーキテクチャは、すべての人間言語に(少なくとも近似的に)存在すると思われる、入れ子になった木構造の文法タイプをうまく学習しているようです。
文法は言語に制約を与えます。しかし、他にも側面があります。「好奇心旺盛な電子が青い理論を食べて魚を換える」のような文は文法的には正しいですが、人々が通常言うような文ではありません。もしChatGPTがこのような文を生成したら、成功したとはみなされないでしょう。なぜなら、それは基本的に無意味だからです。
しかし、文に意味があるかどうかを判断する普遍的な方法はあるのでしょうか?伝統的には全体を包括する理論はありません。しかし、数十億の(おそらく意味のある)ネット上の文などで訓練された後、ChatGPTは暗黙のうちに「理論を発展させている」と見なすことができます。
その理論はどのようなものになるでしょうか?ええと、約2000年前から基本的に知られている小さな一角があります。それは論理です。もちろん、アリストテレスが三段論法の形で発見したように、論理は基本的に、特定のパターンに従う文は妥当であり、他の文は妥当ではないという主張です。例えば、「すべてのXはYである。これはYではない。したがって、これはXではない。」(例:「すべての魚は青い。これは青くない。したがって、これは魚ではない。」)と言うのは妥当です。アリストテレスが多くの修辞例を通じて(「機械学習的に」)三段論法論理を発見したと想像できるように、ChatGPTの訓練においても、ネット上のテキストなどを大量に見ることで、「三段論法論理を発見する」ことができると想像できます。(そう、ChatGPTが三段論法論理に基づく「正しい推論」を生成すると期待できますが、より複雑な形式論理になると状況は異なります。括弧のマッチングと同じ理由で失敗すると思います。)
しかし、論理の狭い例の外では、合理的なテキストを体系的に構築(または認識)する方法は他にあるのでしょうか?そう、Mad Libsのように非常に特定の「フレーズテンプレート」を使用するものがあります。しかし、どういうわけかChatGPTは暗黙のうちにより普遍的な方法を持っています。おそらく、「1750億のニューラルネットワーク重みがあると、どういうわけかそれが起こる」としか言いようがないかもしれません。しかし、私はもっとシンプルで強力な答えがあると強く疑っています。
意味空間と意味運動の法則
上記では、ChatGPTにおいて、任意のテキストが効果的に数値配列として表現され、それをある種の「言語特徴空間」における点の座標と見なすことができると議論しました。したがって、ChatGPTがテキストを続けるとき、それは言語特徴空間内の軌跡を追跡することに相当します。では、この軌跡が私たちが意味があると考えるテキストに対応するのはなぜでしょうか?あるいは、おそらく「意味運動の法則」が存在し、それが言語特徴空間内の点の移動を定義または少なくとも制限し、同時に「意味があること」を維持しているのでしょうか?
では、この言語特徴空間はどのようなものでしょうか?これは、単語(ここでは普通名詞)が配置される可能性のある2D空間の例です。
[図]
以前、植物と動物を表す単語に基づく別の例を見ました。しかし、どちらの場合も「意味的に類似した単語」が近くに配置されています。
別の例として、異なる品詞に対応する単語が次のように配置されています。
[図]
もちろん、特定の単語は通常「一つの意味」だけを持つわけではありません(あるいは必ずしも一つの品詞に対応するわけではありません)。単語を含む文の特徴空間内の位置を観察することで、通常は異なる意味を「分割」できます。例えば、この単語「crane(鳥?それとも機械?)」の例です。
[図]
したがって、この特徴空間は「意味的に近い単語」を空間内の近い位置に配置すると考えることができます。しかし、この空間内でどのような追加構造を識別できるでしょうか?例えば、空間の「平坦性」を反映する「平行移動」の概念はあるでしょうか?これを調べる一つの方法は、類推を見ることです。
[図]
はい、2Dに投影した場合でも、通常は少なくともいくつかの「平坦さのヒント(hint of flatness)」が存在しますが、それが普遍的に存在するわけではありません。
では、軌跡についてはどうでしょうか?特徴空間内でChatGPTのプロンプトがたどる軌跡を確認し、ChatGPTがどのように続けるのかを見ることができます:
[図]
ここには明らかに「幾何学的に明白な」運動法則はありません。これは驚くべきことではありません。私たちはこれがかなり複雑な話であると完全に予想しています。例えば、「意味的な運動法則」があったとしても、それがどの埋め込み(あるいは実際にはどの「変数」)で最も自然に述べられるかは明らかではありません。
上の図では、「軌跡」のいくつかのステップを示しており、各ステップでChatGPTが最も可能性が高いと考える単語を選択しています(「ゼロ温度」の場合)。しかし、特定の時点で次に来る可能性のある単語とその確率を尋ねることもできます:
[図]
この場合、特徴空間内で1つ以上の明確な方向に沿って広がる、高確率の単語の「扇形」が見られます。さらに進むとどうなるでしょうか?軌跡に沿って移動する際に現れる連続的な「扇形」は次のようになります:
[図]
これは3D表現で、合計40ステップ進んだものです:
[図]
はい、これは非常に混乱して見え、ChatGPTが内部で何をしているのかを経験的に研究することで「数理物理学的な」「意味運動法則」を特定できるという私たちの考えを特に後押しするものではありません。しかし、おそらく私たちは単に「変数」(または座標系)を間違えて見ているだけかもしれません。正しく見れば、ChatGPTが測地線に従うなど、「数理物理学的に単純な」ことを行っていることがすぐにわかるでしょう。しかし、今のところ、ChatGPTが人間の言語の「組み合わせ」について「発見」したことを、その「内部動作」から「経験的に解読」する準備はできていません。
意味文法と計算言語の威力
「意味のある人間の言語」を生成するには何が必要でしょうか?過去には、これは人間の脳だけができることだと考えられていました。しかし今では、ChatGPTのニューラルネットワークがこれをかなりうまく実行できることがわかっています。しかし、おそらくこれが私たちが到達できる限界であり、より単純で理解しやすい方法は存在しないのかもしれません。しかし、私は強く疑っています。ChatGPTの成功は、重要な「科学的」事実を示唆しています。意味のある人間の言語は、私たちが考えていたよりもはるかに単純であり、最終的にはこの言語がどのように組み合わされるかを記述する、かなり単純なルールが存在する可能性があるということです。
上で述べたように、統語論的な文法は、異なる品詞の語彙がどのように人間の言語に組み合わされるかについてのルールを与えます。しかし、意味を扱うためには、さらに進む必要があります。その方法の1つは、言語の統語論的な文法だけでなく、意味文法も考慮することです。
統語論のためには、名詞や動詞などの品詞を特定します。しかし、意味のためには、「より細かい粒度」が必要です。例えば、「移動」という概念や、「位置とは独立してその同一性を維持する」という「オブジェクト」の概念を特定できます。これらの「意味概念」にはそれぞれ無数の具体例があります。しかし、私たちの意味文法では、「オブジェクト」は「移動」できるというような一般的なルールだけを持ちます。これを機能させる方法については多くの方法があります(私が以前に述べたものもあります)。しかしここでは、潜在的な前進の道筋を簡単に示すにとどめます。
注目すべき点は、たとえ文が意味文法的に完全に正しくても、それが実際に実現されている(あるいは実現可能でさえある)とは限らないことです。例えば、「象が月に行く」は間違いなく私たちの意味文法を通過できますが、少なくともまだ私たちの現実世界では実現されていません(少なくともまだ)。しかし、それは架空の世界では絶対に使用可能です。
「意味文法」について話し始めると、すぐに「その下には何があるのか?」と問うことになります。それはどのような「世界モデル」を仮定しているのでしょうか?統語論的な文法は実際には、語彙から言語を構築する方法にのみ関わります。しかし、意味文法は必然的に何らかの「世界モデル」を含みます。それは、実際の語彙から構成される言語を追加できる「骨格」として機能するものです。
つい最近まで、私たちは(人間の)言語が私たちの「世界モデル」を記述する唯一の一般的な方法であると考えていました。数世紀前には、特定の種類の事柄を数学に基づいて形式化することが始まりました。しかし今では、より一般的な形式化の方法があります。それは計算言語です。
はい、これは私が40年以上にわたって取り組んできた大規模プロジェクト(現在はWolfram言語に具現化されています)です。つまり、世界の事物や私たちが関心を持つ抽象的な事物について、可能な限り広範囲に語るための正確な記号表現を開発することです。例えば、都市、分子、画像、ニューラルネットワークのための記号表現を持ち、これらの事物を計算する方法に関する組み込みの知識を持っています。
数十年の作業を経て、私たちはこの方法で多くの領域をカバーしてきました。しかし、過去には「日常言語」を特に扱ってはいませんでした。「私は2ポンドのリンゴを買った」という文では、簡単に表現できます(そして「2ポンドのリンゴ」について栄養計算やその他の計算を行うこともできます)が、「私は買った」という記号表現は(まだ完全には)持っていません。
これらすべては、意味文法の概念と、何が何と組み合わさるかについてのルールを提供し、それによって私たちが人間の言語に変換できる「流れ」を決定する、概念の汎用的な記号「構築ツールキット」を持つという目標に関連しています。
しかし、このような「記号談話言語」を持っていると仮定しましょう。それで何をするのでしょうか?「局所的に意味のあるテキスト」を生成するようなことを始めることができます。しかし最終的には、より「大局的に意味のある」結果を得たいと思うでしょう。それは、実際に存在したり発生したりする事物についてのより多くの情報を「計算」することを意味します(あるいは、一貫した架空の世界の中で)。
Wolfram 言語には現在、多くの事物に関する膨大な量の組み込みの計算知識が存在します。しかし、完全な記号論述言語(symbolic discourse language)については、世界上に追加の「計算ルール」を構築する必要があります。たとえば、ある物体が A から B へ移動し、B から C へ移動したならば、それは A から C へ移動したことになる、などです。
記号論述言語が与えられると、それを用いて「独立した陳述」を行うことができます。また、「Wolfram|Alpha スタイル」で世界について問いかけることもできます。あるいは、何らかの外部活性化メカニズムを用いて、「実現したいこと」を記述することもできます。それから、現実世界について、あるいは小説などの特定の仮想世界について、断定を行うこともできます。
人間言語は本質的に不正確です。それは、特定の計算実装に「縛り付けられていない」というだけでなく、その意味が基本的に使用者間の「社会的契約」によってのみ定義されるからです。しかし、計算言語は本質上、ある程度の基本的な精度を持ちます。なぜなら、最終的にそれが指定する内容は常に「コンピュータ上で明確に実行」できるからです。人間言語は通常、ある程度の曖昧さから逃れることができます(例えば、「惑星」と言うとき、外惑星も含まれるのか?)。しかし、計算言語では、私たちが行うすべての区別を正確かつ明確に区別しなければなりません。
計算言語において、通常の人間言語を用いて名称を構築するのは便利なことが多いです。しかし、計算言語におけるそれらの意味は正確でなければならず、通常の人間言語の用法における特定の含意をカバーする場合としない場合があります。
一般的な記号論述言語に適用可能な基本的存在論を見出すにはどうすればよいでしょうか。これは簡単なことではありません。おそらくだからこそ、アリストテレスによる二千年以上前の原初的な始まり以来、この分野での成果はほとんどなかったのでしょう。しかし現在、私たちは世界を計算的に考える方法について多くのことを知っています(これは、Physics Project や ruliad からの「基本形而上学」【fundamental metaphysics】から助けを得ることと矛盾するものではありません)。
しかし、ChatGPT の文脈において、これはどのような意味を持つかというと、ChatGPT は訓練から、一定量の意味文法(semantic grammar)を事実上「寄せ集めて」います(かなり印象的です)。しかし、その成功は、より完全な計算言語形式を構築することが可能であるという根拠を与えてくれます。そして、これまでに ChatGPT の内部について私たちが発見してきたことと異なり、計算言語は人間が理解しやすいように設計できることが期待できます。
意味文法について語る際、それを三段論法と比喩的に対比させることができます。もともとは、三段論法は本質的に人間言語で表現された陳述に関する一連の規則に関するものでした。しかし(そう、二千年後)形式論理学が発展したとき、三段論法のもともとの基本構造は、現代のデジタル回路の演算を含む巨大な「形式的な塔」を構築するために使えるようになりました。したがって、より一般的な意味文法も同様になると期待できます。最初は、テキストのような単純なパターンしか扱えないかもしれません。しかし、計算言語の枠組み全体が一度構築されれば、これまで人間言語の「低レベル」、およびそのすべての曖昧さを介してでしか触れることのできなかったさまざまな事柄を、正確かつ形式的な方法で処理できる巨大な「一般化意味論理学」の塔を構築するために使用できることが期待できます。
計算言語と意味文法の構築は、ものを表現するための究極の圧縮を表していると考えることができます。なぜなら、それは通常の人間言語に存在するすべての「言い回しの変化」を扱わずに、可能性の本質について語ることを可能にするからです。ChatGPT の大きな利点も同様であると考えることができます。なぜなら、ChatGPT はある意味で「異なる言い回しの変化を気にせずに、言語を意味的に有意義な方法で組み合わせることができる」レベルまで「掘り下げている」からです。
では、ChatGPT を基礎となる計算言語に適用したらどうなるでしょうか。計算言語は可能性を記述できます。しかし、たとえばネットワーク上のすべてのコンテンツを読むデータに基づいて、「ファジーな(vague)」感覚を追加することもできます。そして、その基礎となる計算言語を操作することは、ChatGPT のようなシステムが、根本的に irreducible な計算を利用するための究極のツールへの即座の根本的アクセスを得ることを意味します。これにより、「もっともらしいテキストを生成する」だけでなく、生成されたテキストが世界やそれが論じているあらゆる事柄について実際に「正しい」陳述を行っているかどうか、あるいは論じるべき他の事柄があるかどうかについて理解することが期待できるようになります。
では……ChatGPTは何をしているのか、なぜ機能するのか?
ChatGPTの基本的な概念は、ある意味でかなりシンプルです。ウェブや書籍などのソースから、人間が作成した大量のテキストサンプルを取得します。そして、ニューラルネットワークを訓練して「似たような」テキストを生成できるようにします。特に、与えられた「プロンプト」から始めて、「訓練データに似た」テキストを続けて生成できるようにするのです。
見てきたように、ChatGPT内の実際のニューラルネットワークは、非常にシンプルな要素から構成されていますが、その数は数十億にものぼります。ニューラルネットワークの基本操作も非常にシンプルで、基本的には新しい単語(または単語の一部)ごとに「入力」を生成し、それを「要素を通して」(ループなどなしに)渡すだけです。
しかし、このプロセスが、ウェブや書籍などのコンテンツに「似ている」テキストをうまく生成できるというのは、非常に顕著で予想外のことです。それは単に一貫性のある人間の言語であるだけでなく、「プロンプトに従って」「話す」内容を、自身が「読んだ」内容を利用して生成します。しかし、常に「大局的に意味のあること」を言うわけではありません(あるいは正しい計算に対応するわけでもありません)。なぜなら(例えば、Wolfram|Alphaの「計算能力」にアクセスできない場合)、訓練データの中の「音声的に似た」ものに基づいて、「正しく聞こえる」ものを「言っている」に過ぎないからです。
ChatGPTの具体的なエンジニアリングは非常に魅力的です。しかし、結局のところ(少なくとも外部ツールを使用できるようになるまでは)、ChatGPTは蓄積された「常識的な統計データ」から「一貫性のあるテキストの糸」を引き出しているに過ぎません。しかし、その結果がどれほど人間らしいか。これが示唆するのは、少なくとも科学的に非常に重要なことです。すなわち、人間の言語(そしてその背後にある思考パターン)の構造は、私たちが想像していたよりも単純で、より「法則性」を持っているということです。ChatGPTはそれを暗黙のうちに発見しました。しかし、私たちは意味論的文法や計算言語学などを用いて、それを明示的に明らかにできるかもしれません。
ChatGPTはテキスト生成において非常に優れたパフォーマンスを発揮し、その結果はしばしば私たち人間が生成するものに非常に近いものです。では、これはChatGPTが脳のように機能していることを意味するのでしょうか?その基本的な人工ニューラルネットワーク構造は、最終的には脳の理想化モデルに基づいています。私たち人間が言語を生成するとき、多くの側面でかなり似たような働きをしている可能性が非常に高いです。
しかし、訓練(つまり学習)に関しては、脳と現在のコンピュータでは「ハードウェア」(そしておそらく未開発のアルゴリズム的アイデア)が異なるため、ChatGPTは脳とはかなり異なる(そしてある面でははるかに効率の悪い)戦略を使用する必要があります。もう一つの点:典型的なアルゴリズム計算とは異なり、ChatGPT内部には「ループ」や「データの再計算」がありません。これは必然的にその計算能力を制限し、現在のコンピュータと比較しても、ましてや脳と比較すればなおさらです。
この問題を「解決」しつつ、訓練システムの合理的な効率を維持する方法は、現時点では明らかではありません。しかし、それを実現できれば、将来のChatGPTはより「脳に近いこと」ができるようになるかもしれません。もちろん、脳が得意としないこともたくさんあります。特に、いわゆる既約計算に関わることです。これらの問題に対しては、脳もChatGPTのようなものも、外部ツール(例えばWolfram言語)を探さなければなりません。
しかし、今ChatGPTがすでに達成できていることを見るのは刺激的です。ある意味で、これは大量の単純な計算要素が驚くべき予想外のことを生み出せるという、素晴らしい基礎科学的事実です。そしてそれはまた、私たちが2000年にわたって人間の言語とその背後にある思考プロセスの基本的な特徴と原理をより深く理解するための、最高の原動力でもあります。
いくつかの読書メモ