Dictionary · กลไกโมเดล · 68 / 301

Top-p

ปุ่มปรับความหลากหลายของคำตอบที่ทำงานด้วยการตัดคำที่โอกาสน้อยทิ้งก่อนสุ่ม ต่างจาก temperature ที่ปรับความชันของทั้งการกระจาย เอกสาร OpenAI แนะนำให้ปรับทีละตัว

Top-p หรือชื่อทางเทคนิคว่า nucleus sampling (ชื่อช่องในเอกสาร API ของผู้ให้บริการเขียนว่า top_p) คือค่า setting ตัวหนึ่งที่ส่งแนบไปพร้อมคำสั่งเรียกใช้ llm เพื่อคุมความหลากหลายของคำตอบตอน inference จุดเด่นของมันคือคัดตัวเลือกทิ้งก่อนจะเริ่มสุ่ม ไม่ใช่ไปปรับน้ำหนักของตัวเลือกทั้งชุด เอกสาร API ของ OpenAI อธิบายว่า top-p เป็นทางเลือกแทนการสุ่มด้วย temperature โดยโมเดลจะพิจารณาเฉพาะกลุ่มคำที่ความน่าจะเป็นรวมกันได้ตามสัดส่วนที่ตั้งไว้ ตั้งไว้ที่ 0.1 หมายถึงพิจารณาเฉพาะกลุ่มคำที่รวมกันเป็น 10% บนสุดของความน่าจะเป็นทั้งหมด เอกสาร Messages API ของ Anthropic อธิบายกลไกเดียวกันแบบลงรายละเอียดขึ้นว่าระบบจะไล่เรียงตัวเลือกของ token ตัวถัดไปจากความน่าจะเป็นมากไปหาน้อย บวกสะสมไปทีละตัว แล้วตัดจบทันทีที่ยอดสะสมแตะค่า top_p ที่กำหนดไว้

ความต่างจาก temperature อยู่ตรงนี้ หลังโมเดลให้คะแนนคำถัดไปทุกตัวตามกลไก next-token-prediction แล้ว temperature จะเข้าไปปรับความชันของการกระจายความน่าจะเป็นทั้งชุดก่อนสุ่ม คำที่โอกาสน้อยไม่ได้ถูกตัดออกจากชุดตัวเลือก มีแต่โอกาสถูกหยิบที่มากขึ้นหรือน้อยลงตามค่าที่ตั้ง ยกเว้นเมื่อตั้ง temperature ไว้ที่ปลายล่างสุดของช่วง ซึ่งผลจะเอนไปที่คำคะแนนสูงสุดจนแทบไม่เหลือโอกาสให้คำอื่น ส่วน top-p ตัดหางของการกระจายทิ้งไปก่อน คำที่ตกขอบจึงหมดสิทธิ์ในรอบนั้นทันที และขนาดของกลุ่มที่รอดมาก็ไม่คงที่ ถ้าจังหวะนั้นมีคำเดียวที่ความน่าจะเป็นสูงลิ่ว กลุ่มก็เหลือแค่ไม่กี่คำ ถ้าคะแนนกระจายเฉลี่ยๆ กันไป กลุ่มก็กว้างขึ้นเอง เปเปอร์ที่เสนอวิธีนี้เป็นครั้งแรกคือ The Curious Case of Neural Text Degeneration ของ Holtzman และคณะ ซึ่งส่งขึ้น arXiv เมื่อเมษายน 2019 และตีพิมพ์ใน ICLR 2020 เรียกกลุ่มที่ยืดหดได้นี้ว่า dynamic nucleus และเสนอว่าการตัดหางที่เชื่อถือได้น้อยทิ้งจะให้ข้อความที่หลากหลายขึ้นโดยไม่เสียความลื่นไหล เรื่องค่าตัวเลขนั้นแต่ละที่กำหนดไม่เหมือนกัน เอกสาร Messages API ของ Anthropic ระบุว่า temperature มีค่าเริ่มต้น 1.0 ปรับได้ในช่วง 0.0 ถึง 1.0 ส่วนช่อง top_p ไม่ได้ระบุค่าเริ่มต้นไว้ แต่กำกับทั้ง top_p และ top_k ตรงกันว่า "Recommended for advanced use cases only" คือแนะนำให้ใช้เฉพาะงานขั้นสูง ขณะที่เอกสารของ OpenAI ระบุช่วง temperature ไว้ที่ 0 ถึง 2 ฝั่งเครื่องมือรันโมเดลเปิด (open-weight) อย่าง Hugging Face Transformers ระบุว่าค่าเหล่านี้ปกติมาจากไฟล์ generation_config.json ของโมเดลแต่ละตัว ถ้าไฟล์นั้นไม่ได้กำหนดไว้ top_p จะเท่ากับ 1.0 top_k เท่ากับ 50 และ temperature เท่ากับ 1.0 เอกสารเดียวกันเขียนไว้ด้วยว่าการกรองแบบ top-p จะเริ่มทำงานเมื่อค่าน้อยกว่า 1 เท่านั้น ค่าเริ่มต้น 1.0 จึงเท่ากับปล่อยให้ทุกคำเข้ารอบตามเดิม คำแนะนำที่ชัดที่สุดเรื่องการปรับสองปุ่มพร้อมกันมาจาก OpenAI ซึ่งเขียนกำกับไว้ตรงกันทั้งที่ช่อง temperature และช่อง top_p ว่าโดยทั่วไปแนะนำให้ปรับตัวใดตัวหนึ่ง ไม่ใช่ปรับพร้อมกันทั้งคู่ เหตุผลที่เห็นภาพง่ายที่สุดคือทั้งสองค่าต่างเข้าไปยุ่งกับการกระจายชุดเดียวกัน ขยับพร้อมกันเมื่อไหร่ก็แยกไม่ออกว่าผลที่เห็นมาจากปุ่มไหน

คนทำงานจะเจอ top-p เป็นแถบเลื่อนหรือช่องกรอกที่วางอยู่ข้าง temperature ในหน้า playground ของผู้ให้บริการโมเดล และในกล่องตั้งค่าของเครื่องมือ automation ที่ต่อ API เข้ากับโมเดลโดยตรง สิ่งที่ต้องเช็คก่อนวางแผนพึ่งค่านี้คือโมเดลที่ใช้อยู่ยังเปิดให้ปรับหรือเปล่า เพราะรุ่นใหม่หลายตัวปิดช่องนี้ไปแล้ว เอกสารเรื่องโหมด thinking ของ Anthropic ระบุว่าบน Claude Fable 5, Claude Mythos 5, Claude Mythos Preview, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7 และ Claude Sonnet 5 การส่งค่า temperature, top_p หรือ top_k ที่ไม่ใช่ค่าเริ่มต้นจะถูกตีกลับเป็น error 400 ในทุกคำขอ ไม่ว่าจะเปิดโหมด thinking หรือไม่ก็ตาม ส่วนโมเดลรุ่นก่อนหน้านั้น ข้อจำกัดจะมีผลเฉพาะตอนเปิดโหมด thinking โดย temperature กับ top_k ใช้ร่วมกับโหมดนี้ไม่ได้ ส่วน top_p ยังตั้งได้แต่เฉพาะค่าระหว่าง 0.95 ถึง 1 เท่านั้น อีกเรื่องที่คนเข้าใจผิดบ่อยคือคิดว่าบีบ top-p ให้แคบแล้วคำตอบจะแม่นขึ้น ความจริงคือค่านี้คุมแค่ความกว้างของตัวเลือกตอนสุ่มคำ ไม่ได้ตรวจว่าเนื้อหาที่ออกมาถูกหรือผิด และไม่ได้ทำให้ผลลัพธ์ซ้ำเดิมทุกตัวอักษร เพราะความไม่คงที่อีกส่วนมาจากระบบฝั่ง server ที่รันโมเดล ไม่ได้มาจากค่าที่เราตั้งเอง งานที่ต้องการคำตอบหน้าตาแน่นอน เช่น ดึงข้อมูลลงตาราง จึงควรบังคับรูปแบบด้วย structured-output แทนการไล่ปรับค่าสุ่มไปเรื่อยๆ แล้วหวังว่าจะนิ่งเอง

ตัวอย่างจากบทสนทนาจริง

ฝ่ายการตลาด: ในหน้าตั้งค่าของเครื่องมือที่ทีมใช้ มีทั้งช่อง temperature และช่อง top-p อยากให้ข้อความโปรยที่ AI ร่างออกมาหลากหลายกว่านี้ เลื่อนขึ้นพร้อมกันทั้งสองอันเลยได้ไหมคะ

ทีม IT: ขยับทีละตัวดีกว่าครับ เอกสารของ OpenAI แนะนำไว้เองว่าให้ปรับตัวใดตัวหนึ่ง เพราะสองค่านี้เข้าไปยุ่งกับการเลือกคำชุดเดียวกัน ขยับพร้อมกันแล้วพอผลออกมาแปลก เราจะไล่ไม่ถูกว่าเป็นเพราะปุ่มไหน ผมแนะนำให้ปล่อย top-p ไว้ที่ค่าเริ่มต้นก่อน แล้วขยับ temperature ขึ้นทีละนิด เก็บผลไว้เทียบกันสักสามรอบครับ ถ้าโมเดลที่เราใช้เป็นรุ่นที่ไม่รับค่าพวกนี้แล้ว ระบบจะตีกลับมาเป็น error เอง ตรงนั้นต้องไปแก้ที่ prompt แทน

ระวังสับสนกับ

  • temperature : temperature ปรับความชันของการกระจายทั้งชุดแล้วค่อยสุ่ม คำที่โอกาสน้อยไม่ได้ถูกตัดออกจากชุดตัวเลือก เหลือแต่โอกาสถูกหยิบที่มากขึ้นหรือน้อยลงตามค่าที่ตั้ง ส่วน top-p ตัดคำที่ตกขอบทิ้งก่อนสุ่ม คำเหล่านั้นหมดสิทธิ์ในรอบนั้นทันที และเอกสารของ OpenAI แนะนำให้ปรับทีละตัว ไม่ใช่ขยับพร้อมกัน
  • top-k : top-k จำกัดจำนวนตัวเลือกไว้เป็นตัวเลขตายตัว เช่น เก็บไว้ 50 คำแรกทุกรอบ ซึ่งเป็นค่าเริ่มต้นของ Hugging Face Transformers เมื่อโมเดลไม่ได้กำหนดมาเอง ส่วน top-p ไม่ล็อกจำนวนคำ แต่ล็อกที่ความน่าจะเป็นสะสม กลุ่มที่รอดจึงกว้างแคบไม่เท่ากันในแต่ละรอบ
  • parameters : parameters ของโมเดลคือค่าน้ำหนักจำนวนมหาศาลที่ถูกล็อกไว้ตั้งแต่ train เสร็จ ผู้ใช้แก้ไม่ได้ตอนใช้งาน ส่วน top-p เป็นค่า setting ที่ส่งไปพร้อมคำขอแต่ละครั้งและเปลี่ยนได้ทุกครั้งที่เรียกใช้ ในโมเดลที่ยังเปิดให้ปรับ
  • non-determinism : top-p คือปุ่มที่เราตั้งเองเพื่อคุมความกว้างของตัวเลือก ส่วน non-determinism คือปรากฏการณ์ที่คำตอบไม่ซ้ำเดิมซึ่งมีสาเหตุจากฝั่งระบบที่รันโมเดลด้วย บีบ top-p ให้แคบแค่ไหนก็ไม่ได้แก้เรื่องนั้น

ดูคำนี้ใน Knowledge Atlas →

■ ไม่อยากพลาดของใหม่

อ่านจบแล้วอยากตามเรื่อง AI แบบนี้ต่อทุกวัน เรามีสรุปข่าวภาษาไทยส่งทาง LINE ทุกเช้า กดเพิ่มเพื่อนไว้ได้เลย ไม่มีค่าใช้จ่าย

เพิ่มเพื่อนใน LINE →
QR เพิ่มเพื่อน LINE ของ TRAINIAC AIคอมพิวเตอร์สแกนด้วยมือถือได้เลย

TokenizationTraining