天天看點

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

作者:機器之心Pro

機器之心報道

編輯:小舟

Google Deepmind 可能早就意識到了這個問題。

今年,大型語言模型(LLM)成為 AI 領域最受關注的焦點,OpenAI 的 ChatGPT 和 GPT-4 更是爆火出圈。GPT-4 在自然語言了解與生成、邏輯推理、代碼生成等方面性能出色,令人驚豔。

然而,人們逐漸發現 GPT-4 的生成結果具有較大的不确定性。對于使用者輸入的問題,GPT-4 給出的回答往往是随機的。

我們知道,大模型中有一個 temperature 參數,用于控制生成結果的多樣性和随機性。temperature 設定為 0 意味着貪婪采樣(greedy sampling),模型的生成結果應該是确定的,而 GPT-4 即使在 temperature=0.0 時,生成的結果依然是随機的。

在一場圓桌開發者會議上,有人曾直接向 OpenAI 的技術人員詢問過這個問題,得到的回答是這樣的:「老實說,我們也很困惑。我們認為系統中可能存在一些錯誤,或者優化的浮點計算中存在一些不确定性......」

值得注意的是,早在 2021 年就有網友針對 OpenAI Codex 提出過這個疑問。這意味着這種随機性可能有更深層次的原因。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

圖源:https://community.openai.com/t/a-question-on-determinism/8185

現在,一位名為 Sherman Chann 的開發者在個人部落格中詳細分析了這個問題,并表示:「GPT-4 生成結果的不确定性是由稀疏 MoE 引起的」。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

Sherman Chann 部落格位址:https://152334h.github.io/blog/non-determinism-in-gpt-4/

Sherman Chann 這篇部落格受到了 Google DeepMind 最近一篇關于 Soft MoE 的論文《From Sparse to Soft Mixtures of Experts》啟發。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

論文位址:https://arxiv.org/pdf/2308.00951.pdf

在 Soft MoE 論文的 2.2 節中,有這樣一段描述:

在容量限制下,所有稀疏 MoE 都以固定大小的組來路由 token,并強制(或鼓勵)組内平衡。當組内包含來自不同序列或輸入的 token 時,這些 token 通常會互相競争專家緩沖區中的可用位置。是以,模型在序列級别不再具有确定性,而僅在批次級别(batch-level)具有确定性,因為某些輸入序列可能會影響其他輸入的最終預測。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

此前,有人稱 GPT-4 是一個混合專家模型(MoE)。Sherman Chann 基于此做出了一個假設:

GPT-4 API 用執行批推理(batch inference)的後端來托管。盡管一些随機性可能是因為其他因素,但 API 中的絕大多數不确定性是由于其稀疏 MoE 架構未能強制執行每個序列的确定性。

也就是說,Sherman Chann 假設:「稀疏 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 時,結果如下表所示:

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

在 Sherman Chann 注意到 logit_bias 問題之前,還得到了如下結果(max_tokens=256):

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

實驗結果表明,GPT-4 的輸出總是不确定的(unique completion 數值很高,表明對于相同的輸入,GPT-4 生成的輸出總是不同的),這幾乎可以證明 GPT-4 存在問題。并且,所有其他不會陷入重複無用循環的模型也存在某種程度的不确定性。這似乎說明不可靠的 GPU 計算也會造成一定程度的随機性。

Sherman Chann 表示:「如果不确定性是稀疏 MoE 批推理固有的特征,那麼這一事實對于任何使用該類模型的研究來說都應該是顯而易見的。Google Deepmind 的研究團隊顯然知道這一點,并且他們認為這個問題很微不足道,以至于隻是把它寫成了一句不經意的話放在論文中」。

此外,Sherman Chann 還推測 GPT-3.5-Turbo 可能也使用了 MoE。

網友怎麼看

這篇部落格發表後,開發者們也開始讨論 GPT-4 輸出的不确定問題。有人認為這可能是「多線程并行」造成的:

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

也有人表示:「雖然計算是确定的,但是執行計算的多個處理器之間可能存在時鐘頻率偏差」:

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

一位支援 Sherman Chann 的假設的開發者說道:「GPT-3.5-Turbo 可能就是 OpenAI 為 GPT-4 建構的小型測試模型」。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

還有開發者分析道:「按照 Soft MoE 論文的說法,稀疏 MoE 不僅引入了不确定性,還可能會使模型的響應品質取決于有多少并發請求正在争奪專家子產品的配置設定」。

你有沒深入想過,什麼造成了GPT-4的輸出很随機?

對此,你怎麼看?

參考連結:

https://news.ycombinator.com/item?id=37006224