GPT-4 の出力がなぜそれほどランダムなのか、深く考えたことはありますか?

GPT-4 の出力がなぜそれほどランダムなのか、深く考えたことはありますか?

今年はAI分野で大規模言語モデル(LLM)が注目され、OpenAIのChatGPTやGPT-4が大人気となりました。 GPT-4 は、自然言語の理解と生成、論理的推論、コード生成などにおいて、優れた驚くべきパフォーマンスを発揮します。

しかし、GPT-4 によって生成された結果には大きな不確実性があることが徐々にわかってきました。 GPT-4 は、ユーザーが入力した質問に対してランダムな回答を返すことがよくあります。

大規模モデルには温度パラメータがあり、生成される結果の多様性とランダム性を制御するために使用されることが分かっています。温度を 0 に設定すると貪欲サンプリングとなり、モデルによって生成された結果は決定論的になります。ただし、温度 = 0.0 の場合でも、GPT-4 によって生成された結果はランダムです。

開発者の円卓会議で、誰かが OpenAI の技術スタッフに直接この質問をしたところ、次のような答えが返ってきました。「正直に言うと、私たちも困惑しています。システムに何らかのエラーがあるか、最適化された浮動小数点計算に不確実性があるのではないかと考えています…」

注目すべきは、2021年にはすでに、一部のネットユーザーがOpenAI Codexについてこの疑問を提起していたことだ。つまり、このランダム性にはより深い理由がある可能性があるということです。

画像ソース: https://community.openai.com/t/a-question-on-determinism/8185

現在、Sherman Chann という開発者が個人ブログでこの問題を詳細に分析し、「GPT-4 の生成結果の不確実性は、スパース MoE によって引き起こされる」と述べています。

シャーマン・チャンのブログアドレス: https://152334h.github.io/blog/non-determinism-in-gpt-4/

Sherman Chann このブログ投稿は、Google DeepMind の最近のソフト MoE に関する論文「From Sparse to Soft Mixtures of Experts」に触発されました。


論文アドレス: https://arxiv.org/pdf/2308.00951.pdf

Soft MoE 論文のセクション 2.2 には、次のような説明があります。

容量の制約下では、すべてのスパース MoE はトークンを固定サイズのグループにルーティングし、グループ内のバランスを強制 (または推奨) します。グループに異なるシーケンスまたは入力からのトークンが含まれている場合、通常、これらのトークンはエキスパート バッファー内の使用可能な位置をめぐって互いに競合します。その結果、一部の入力シーケンスが他の入力の最終予測に影響を与える可能性があるため、モデルはシーケンス レベルでは決定論的ではなく、バッチ レベルでのみ決定論的になります。

以前は、GPT-4 を専門家混合 (MoE) モデルと呼ぶ人もいました。シャーマン・チャンはこれに基づいて次のような仮説を立てました。

GPT-4 API は、バッチ推論を実行するバックエンドでホストされます。一部のランダム性は他の要因によるものである可能性がありますが、API の不確実性の大部分は、スパース MoE アーキテクチャが各シーケンスの決定論を強制できないことに起因しています。

つまり、シャーマン・チャンは、「スパース MoE モデルにおけるバッチ推論が、GPT-4 API における不確実性のほとんどの根本原因である」という仮説を立てています。この仮説を検証するために、Sherman Chann は GPT-4 を使用してコード スクリプトを作成しました。

 import os import json import tqdm import openai from time import sleep from pathlib import Path chat_models = ["gpt-4", "gpt-3.5-turbo"] message_history = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Write a unique, surprising, extremely randomized story with highly unpredictable changes of events."} ] completion_models = ["text-davinci-003", "text-davinci-001", "davinci-instruct-beta", "davinci"] prompt = "[System: You are a helpful assistant]\n\nUser: Write a unique, surprising, extremely randomized story with highly unpredictable changes of events.\n\nAI:" results = [] import time class TimeIt: def __init__(self, name): self.name = name def __enter__(self): self.start = time.time() def __exit__(self, *args): print(f"{self.name} took {time.time() - self.start} seconds") C = 30 # number of completions to make per model N = 128 # max_tokens # Testing chat models for model in chat_models: sequences = set() errors = 0 # although I track errors, at no point were any errors ever emitted with TimeIt(model): for _ in range(C): try: completion = openai.ChatCompletion.create( model=model, messages=message_history, max_tokens=N, temperature=0, logit_bias={"100257": -100.0}, # this doesn't really do anything, because chat models don't do <|endoftext|> much ) sequences.add(completion.choices[0].message['content']) sleep(1) # cheaply avoid rate limiting except Exception as e: print('something went wrong for', model, e) errors += 1 print(f"\nModel {model} created {len(sequences)} ({errors=}) unique sequences:") print(json.dumps(list(sequences))) results.append((len(sequences), model)) # Testing completion models for model in completion_models: sequences = set() errors = 0 with TimeIt(model): for _ in range(C): try: completion = openai.Completion.create( model=model, prompt=prompt, max_tokens=N, temperature=0, logit_bias = {"50256": -100.0}, # prevent EOS ) sequences.add(completion.choices[0].text) sleep(1) except Exception as e: print('something went wrong for', model, e) errors += 1 print(f"\nModel {model} created {len(sequences)} ({errors=}) unique sequences:") print(json.dumps(list(sequences))) results.append((len(sequences), model)) # Printing table of results print("\nTable of Results:") print("Num_Sequences\tModel_Name") for num_sequences, model_name in results: print(f"{num_sequences}\t{model_name}")

N=30、max_tokens=128 の場合、結果は次の表のようになります。

Sherman Chann が logit_bias 問題に気付く前は、次の結果が得られました (max_tokens=256)。

実験結果によると、GPT-4 の出力は常に不確実です (一意の完了値が非常に高く、同じ入力に対して GPT-4 によって生成される出力が常に異なることを示しています)。これは、GPT-4 に問題があることをほぼ裏付けています。そして、反復的で無駄なサイクルに陥らない他のすべてのモデルにも、ある程度の不確実性があります。これは、信頼性の低い GPU コンピューティングでも、ある程度のランダム性が生じる可能性があることを示しているようです。

シャーマン・チャン氏は次のように述べた。「不確実性がスパース MoE バッチ推論の固有の特徴であるならば、この事実はそのようなモデルを使用するあらゆる研究にとって明白であるはずです。Google Deepmind の研究チームは明らかにこれを知っていたようで、彼らはこの問題があまりにも些細なものだと考え、論文の中で何気ないコメントとしてそれを書いただけです。」

さらに、シャーマン・チャン氏は、GPT-3.5-Turbo でも MoE が使用される可能性があると推測しました。

ネットユーザーはどう思う?

このブログ投稿が公開された後、開発者たちは GPT-4 出力の不確実性についても議論し始めました。これは「マルチスレッド並列処理」によって発生する可能性があると考える人もいます。

「計算は決定論的ですが、計算を実行する複数のプロセッサ間でクロック周波数の偏差が生じる可能性があります」と言う人もいます。

シャーマン・チャンの仮説を支持する開発者は、「GPT-3.5-Turboは、OpenAIがGPT-4用に構築した小さなテストモデルである可能性がある」と述べた。

別の開発者は次のように分析しています。「Soft MoE の論文によると、スパース MoE は不確実性をもたらすだけでなく、エキスパート モジュールの割り当てをめぐって競合する同時リクエストの数に応じてモデルの応答品質が左右される可能性もあります。」

これについてどう思いますか?

<<:  GitHubが11,000スターを獲得、ソフトウェア開発プロセスをシミュレート、オープンソースフレームワークMetaGPTが爆発的に増加

>>:  MetaGPTが人気に! 2ドルでボスになれる、GitHubには11.2万個のスターがつき、AIエージェント「オールラウンダー」が誕生

ブログ    

推薦する

プログラマーの芸術: ソートアルゴリズムのダンス

1. バブルソート 2. シェルソート 3. 選択ソート 4. 挿入ソート 5. クイックソート 6...

...

サーバーが過負荷状態です! GANで生成された肖像油絵は人気があり、一瞬でルネッサンス時代に戻ることができます

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

...

...

2018 年に先導するオープンソース AI プロジェクトはどれでしょうか?

[[219623]] [51CTO.com クイック翻訳] 最近では、人工知能 (AI) や機械学...

大規模機械学習システムでは無料のランチはない

[[205684]] Tu Weiwei 氏は、Fourth Paradigm Prophet プラ...

教師あり学習の一般的なアルゴリズムは何ですか?どのように適用されますか?

教師あり学習とは何ですか?教師あり学習は機械学習のサブセットであり、機械学習モデルの入力データにラベ...

バイトマルチモーダル大規模モデル PixelLM: SA に頼らない効率的なピクセルレベル推論

マルチモーダルな大規模モデルが爆発的に増加していますが、画像編集、自動運転、ロボット工学などのきめ細...

グラフ ネットワークをより堅牢にします。 Googleは、データのラベル付けバイアスやドメイン転送を恐れないSR-GNNを提案

グラフ ニューラル ネットワーク (GNN) は、機械学習でグラフ構造データを活用するための強力なツ...

...

...

CESの半導体大手:自動運転のオープンな競争と5Gの秘密の競争

[[255293]]明らかに、自動運転と5Gはチップビジネスそのものよりもはるかに魅力的です。 AI...