The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

淺談 LLM 大型語言模型的 Temperature、Top-P 和 Top-K 參數

深度學習模型在自然語言處理 (NLP) 領域中扮演著重要的角色,而調整模型的參數可以影響生成的文字風格和品質。在大語言模型中,TemperatureTop-PTop-K 是常見的參數,用於控制文字生成過程中的隨機性創造性。我自己在開發 LLM 應用時,主要也都只會去調整 Temperature 而已,其實 Top-PTop-K 很少去調他,因為每次調整都沒有什麼好結果,之前因為不太理解這兩個參數的真正含意,最後還是回歸預設值處理。這篇文章我打算好好的理一理這幾個參數的真正含意。

llm-temperature-topp-topk

Temperature (溫度)

在自然語言處理中,Temperature 就像一個控制語言模型創造力的旋鈕。它調整模型選擇低機率詞彙的傾向,進而影響生成文本的多樣性。

設定較高的 Temperature 值意味著鼓勵模型去冒險,選擇較不常見的詞彙,產生更多樣化、出乎意料,甚至天馬行空的文字,適合用於腦力激盪或探索新穎概念。

設定較低的 Temperature 值則讓模型趨於保守,偏好大機率詞彙,生成更保守、符合預期的文字,適合用於講求準確性一致性的任務。

我以 OpenAI 的 API 為例 (API Reference),Chat Completion APItemperature 的範圍是 0.02.0 之間,您可以根據具體需求調整這個參數,控制生成文字的風格和創造性。官方文件有特別舉例,設定 0.2 的值會導致生成的文字更具有決定性,而設定 0.8 的值會導致更隨機的結果。

若以 Gemini 的 API 為例 (Generative Language API),models.generateContentGenerationConfig 也有個 temperature 參數,設定值一樣是 0.0 ~ 2.0 之間。不過官方文件並沒有舉例,您可以自行嘗試不同的值,看看生成的文字風格有何不同。

我以 OpenAI 的 GPT-3.5 Turbo 為例,當我查詢的條件為:

  • 系統提示 = You are a helpful assistant. You will help user calculate math.
  • 使用者提示 = 請告訴我 0 ~ 100 的所有質數
  • Temperature = 2.0

我連續執行 4 次,每次都不一樣,這就是所謂的隨機性(Randomness):

  1. 第一次嘗試

    0到100之間的所有質數如下:
    
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
    
    這些數字都是只能被1和自己整除的數字(不包括1)。
    
  2. 第二次嘗試

    0 到 100 之間的質數為:
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97。
    
  3. 第三次嘗試

    0 到 100 的質數列表如下:
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97。
    
  4. 第四次嘗試

    0 到 100 裡的質數有:
    
    2, 3, 5, 7, 11,
    13, 17, 19, 23, 29,
    31, 37, 41, 43, 47,
    53, 59, 61, 67, 71,
    73, 79, 83, 89, 97.
    

這種隨機性的應用場景,通常用於生成對話創意寫作、甚至遊戲劇情等,讓模型能夠產生更多元化、更具創造性的內容。

接著我繼續測試,參數如下:

  • 系統提示 = You are a helpful assistant. You will help user calculate math.
  • 使用者提示 = 請告訴我 0 ~ 100 的所有質數
  • Temperature = 0.0
  1. 第一次嘗試

    0 到 100 之間的質數有:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97。
    
  2. 第二次嘗試

    0 到 100 之間的質數有:
    
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
    
  3. 第三次嘗試

    0 到 100 之間的質數有:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97。
    
  4. 第四次嘗試

    0 到 100 之間的質數有:
    
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
    

有趣的地方是,當我設定 Temperature0.0 時,生成的文字風格變得更加穩定一致,但並不是完全一樣,因此對於某些需要精準回應的場景,可能還需要額外下點苦工!例如 Function calling (OpenAI) 或 Tool use (Claude) 或 JSON mode (Gemini) 就是個還不錯的解決方案,他可以強制模型回應 JSON 格式的回應,只要稍微做一點「提示工程」的技巧,提醒模型回應的格式,就可以得到更加一致的結果。

Top-P (Nucleus Sampling) (核心採樣)

Top-P 又稱為核心採樣 (Nucleus Sampling),是一個用於控制語言模型文本生成的機率篩選器。這些大語言模型在生成文字時,其實是以 Token 為單位,而在文字生成的過程中,所有的 Tokens 會先依據「機率」進行排序,排序完之後,模型會根據 Top-P 的設定,只考慮最可能Tokens,這樣可以避免生成不合理不合適的文字。

你可以將 Top-P 視為一種取樣的替代方法,跟 temperature 有點類似,但 temperature 是用來控制整體的創造性,而 Top-P 則提供更精細的控制。

我以 OpenAI 的 API 為例 (API Reference),Chat Completion APItop_p 的範圍是 0.11.0 之間,如果你設定為 0.1 的話,則意味著你讓模型僅考慮包含前 10% 機率質量 (probability mass) 的 Tokens。

機率質量 (probability mass) 這個術語在統計學機率論中具有特定的含義。在機率論和統計學中,機率質量函式 (probability mass function,簡稱為 PMF) 是一種數學函式,它計算一個離散隨機變數恰好為特定值機率。換句話說,機率質量函式離散隨機變數的每個可能值賦予了一個特定的機率。因此,機率質量函式描述了離散變數整個值範圍的機率分佈

由於我們無法得知這些大語言模型的內部運作,因此 Top-P 比較難以預測哪些 Tokens 的機率比較高,就算你調整了,也很難看出明顯的變化。也因為這樣,OpenAI 的 API 參考文件就寫了,你可以選擇 temperaturetop_p 來控制生成的文字,但建議不要兩個都設定,因為一般人真的很難駕馭這兩個參數。

備註: OpenAI 的 Chat Completion APItemperature 的預設值為 1 (介於 0 ~ 2 中間),而 top_p 的預設值為 1 (介於 0.1 ~ 1.0 中間)。這也意味著,OpenAI 的 Chat Completion API 在生成文字時,並不會刻意的透過機率質量 (probability mass) 來篩選 Tokens,主要透過 temperature 來控制生成的文字風格。

Top-K (Top-K Sampling)

Top-K 就像一個 Tokens 排名榜,你可以設定一個固定數量 (k),模型只會從機率最高的 kTokens 中進行選擇。

舉例來說,如果 Top-K 設定為 64,模型只會考慮機率最高的 64 個詞彙,並從中隨機選擇下一個 Tokens。通過限制選擇範圍,Top-K 能夠確保生成的文字更集中、更符合主題,避免出現過於發散或不相關的內容。

我以 OpenAI 的 API 為例 (API Reference),Chat Completion API 並沒有所謂的 top_k 參數,所以你沒辦法調整這個參數。但是,OpenAI 的 API 有提供 logit_bias 參數,用於修改模型生成輸出中指定 Tokens 出現的機率,這個參數接受一個 JSON 物件,將 Tokens 映射到相關偏差值,從 -100 (禁止出現) 到 100 (一定會出現) 等機率設定。這是一個相當有趣的參數,詳情請見 Using logit bias to alter token probability with the OpenAI API 文章說明。

我在 Facebook 的 Generative AI 技術交流中心 社團中曾經有一則貼文分享了 GPT-4o 的 Tokenizer 詞彙表擴充了兩倍,加入了一些「母湯」的詞彙,如果你不想要在生成的文字中出現這些詞彙,就可以透過這個 logit_bias 參數來控制,將這些「母湯」的詞彙直接封鎖,把機率降為 -100% 即可!

Gemini API 中,Google 有提供 topK 參數,但不同模型之間的預設值差別蠻大的,有些模型 topK 的預設值為 0,通常意味著這個模型的 topK 是不允許設定的。

以下就是我從 models.list API 整理出來的各項超參數預設值:

Name Version Temperature Top P Top K
models/chat-bison-001 001 0.25 0.95 40
models/text-bison-001 001 0.7 0.95 40
models/embedding-gecko-001 001 - - -
models/gemini-1.0-pro 001 0.9 1 -
models/gemini-1.0-pro-001 001 0.9 1 -
models/gemini-1.0-pro-latest 001 0.9 1 -
models/gemini-1.0-pro-vision-latest 001 0.4 1 32
models/gemini-1.5-flash-latest 001 1 0.95 64
models/gemini-1.5-pro-latest 001 1 0.95 64
models/gemini-pro 001 0.9 1 -
models/gemini-pro-vision 001 0.4 1 32
models/embedding-001 001 - - -
models/text-embedding-004 004 - - -
models/aqa 001 0.2 1 40

這些不同模型的 Temperature, Top P, Top K 參數預設值,肯定是 Google 的研發團隊經過多次測試,才得出這些數值,從我們局外人的眼裡,其實很難知道最好的數值為何,除非你能比 Google 做更多的科學實驗,才有可能找到最佳的數值。

不過,即便如此,像是 Gemini 最新的 models/gemini-1.5-flash-latestmodels/gemini-1.5-pro-latest 模型,都有提供 Top-PTop-K 參數可供你微調,如此一來你就能依據不同的應用場景,調校出最適合的參數組合。

可惜 Gemini 並沒有提供 logit_bias 參數來控制 Tokens 出現的機率,可能跟 Google 至今不願意開源 Tokenizer 的詞彙表有關,沒有詞彙表,就找不出 Tokens 的代號,沒有代號,自然就無法精細的控制 Tokens 的機率。很自然的,也就不會有 logit_bias 這個參數了。

總結

開發 LLM 應用程式最難的地方,除了 Prompting engineering (提示工程) 之外,就是去調整這些參數了,因為 LLM 的應用範圍太廣,不同的應用場景就可能需要不同的參數組合,這就是為什麼我們在開發 LLM 應用程式時,需要不斷的嘗試,最終才能找到最適合的參數組合。

最後用幾個列點來總結一下:

  • Temperature 控制整體的創造性,Top-PTop-K 則提供更精細的控制。
  • Top-P 根據累積機率動態調整選擇範圍,Top-K 根據排名設定固定的 Tokens 選擇數量
  • 選擇哪個參數來設定,或者如何組合使用,取決於您的具體需求和應用場景,沒有標準答案!

應用場景:

  • 文本生成: Top-K 可以控制模型生成的文本的多樣性,而 Top-P 可以控制文本的流暢度。
  • 機器翻譯: Top-KTop-P 可以幫助模型選擇最有可能的翻譯。
  • 問答系統: Top-KTop-P 可以幫助模型選擇最有可能的答案。

舉例:

假設模型預測下一個詞彙的可能性列表如下:

詞彙 可能性
0.3
0.2
0.1
0.1
0.05
0.05
  • TopK=2: 模型會選擇可能性最高的兩個詞彙,即「狗」和「貓」。
  • TopP=0.6: 模型會選擇累積可能性達到 60% 的詞彙,即「狗」、「貓」和「鳥」。

相關連結

留言評論