- LLM จะคำนวณ การแจกแจงความน่าจะเป็นของโทเคน ถัดไปแล้วเลือกหนึ่งโทเคน โดย sampling จะเพิ่มความสุ่มแบบควบคุมเข้าไปในวิธี greedy เพื่อปรับความหลากหลายของเอาต์พุต
- temperature, repetition penalty, DRY, Top-K/Top-P/Min-P จะเปลี่ยน logits หรือการแจกแจงความน่าจะเป็นก่อนหรือหลังการเลือกโทเคน เพื่อจัดโครงสร้างขอบเขตผู้สมัครและความน่าจะเป็นสัมพัทธ์ใหม่
- sampler แต่ละแบบจะคงไว้หรือตัดโทเคนออกตาม เกณฑ์ที่ต่างกัน เช่น จำนวนคงที่, ความน่าจะเป็นสะสม, อัตราส่วนเทียบกับความน่าจะเป็นสูงสุด, entropy, การซ้ำของ n-gram, surprisal ฯลฯ
- ใน pipeline จริง ลำดับการใช้ filtering, penalty, temperature และการปรับการแจกแจง ส่งผลต่อผลลัพธ์อย่างมาก และอาจเสริมหรือทับผลกันได้ขึ้นอยู่กับการผสมผสาน
- ขนาดคำศัพท์และวิธีแบ่ง ของ tokenizer จะเปลี่ยนหน่วยที่โมเดลให้ความน่าจะเป็น และเปลี่ยน pattern ที่ sampler แบบอิง n-gram อย่าง DRY ตรวจจับได้
โครงสร้างพื้นฐานของการสร้างข้อความและ sampling ใน LLM
- LLM รับข้อความอย่าง prompt ของผู้ใช้เป็นอินพุต แล้วคำนวณ โทเคน ที่สอดคล้องกับคำถัดไป
- โมเดลมีชุดคำศัพท์ที่ประกอบด้วยโทเคนที่ใช้งานได้ และอ้างอิงชุดคำศัพท์นี้ทั้งในการฝึกและการอนุมาน
- ระหว่างการฝึก โมเดลจะอ่านข้อความจำนวนมากและสร้างแผนที่ความน่าจะเป็นภายในของโทเคน ส่วนระหว่างการอนุมานจะตัดสินโทเคนถัดไปตามความน่าจะเป็นที่เรียนรู้มา
- กระบวนการสร้างแบ่งเป็นสองขั้นตอน
- การทำนาย: คำนวณการแจกแจงความน่าจะเป็นของโทเคนถัดไปทั้งหมดที่เป็นไปได้ในแต่ละตำแหน่ง
- การเลือก: เลือกโทเคนหนึ่งจากการแจกแจงนั้นแล้วเพิ่มเข้าไปในเอาต์พุต
- วิธี greedy จะเลือกโทเคนที่เป็นไปได้มากที่สุดเสมอ จึงมักสร้างข้อความที่ซ้ำและกำหนดได้แน่นอน
- sampling ใส่ ความสุ่มแบบควบคุม ในขั้นตอนการเลือก เพื่อให้เอาต์พุตหลากหลายขึ้น
ทำไมเป็นโทเคน ไม่ใช่คำหรืออักขระ
- การทำ tokenization ระดับอักขระทำให้ข้อความเดียวกันกลายเป็นลำดับที่ยาวกว่ามาก และ
tokenizationอาจกลายเป็น 12 โทเคน แทนที่จะเป็น 2~3 โทเคนแบบ subword - ลำดับที่ยาวต้องใช้การคำนวณมากขึ้นใน self-attention และโมเดลต้องเชื่อมข้อมูลหลายตำแหน่งอย่าง
t-h-eให้เป็นแนวคิดเดียว - การทำ tokenization ระดับคำต้องรวมคำภาษาอังกฤษทั้งคำและคำของหลายภาษา ทำให้ เมทริกซ์ embedding ใหญ่และมีต้นทุนสูงมาก
- เมื่อเจอคำใหม่หรือคำหายาก วิธีระดับคำมักแทนที่ด้วยโทเคน
"unknown"ทำให้สูญเสียข้อมูลเชิงความหมาย - การทำ tokenization แบบ subword สามารถแทนคำใหม่อย่าง
grompuficiousด้วยการผสม subword ที่มีอยู่เดิมได้ - โมเดลภาษาที่ใช้ tokenizer ใหม่จะฝึก tokenizer ให้หา subword ที่พบบ่อยจากตัวอย่างที่เป็นตัวแทนของข้อมูลฝึก และกำหนดขนาดคำศัพท์ไว้ล่วงหน้า
ค่าหลักที่ sampler จัดการ
- logits: คะแนนก่อน normalization ที่โมเดลส่งออกให้กับแต่ละโทเคนในชุดคำศัพท์ ยิ่งค่าสูงยิ่งมีแนวโน้มเป็นโทเคนถัดไป
- softmax: แปลง logits เป็นค่าระหว่าง 0~1 และเปลี่ยนเป็นการแจกแจงความน่าจะเป็นที่ผลรวมทั้งหมดเท่ากับ 1
- entropy: แสดงความไม่แน่นอนหรือความสุ่มของการแจกแจงความน่าจะเป็น ยิ่งสูงยิ่งหมายความว่าโมเดลไม่มั่นใจในโทเคนถัดไป
- perplexity: แสดงว่าโมเดล “ประหลาดใจ” กับข้อความมากเพียงใด ยิ่งต่ำยิ่งมีความเชื่อมั่นสูง
- n-gram: ลำดับของโทเคนต่อเนื่อง n ตัว เช่น
"once upon a"คือ 3-gram - context window: จำนวนโทเคนสูงสุดที่ LLM ประมวลผลได้ในครั้งเดียว รวมทั้ง prompt และเอาต์พุตที่สร้างขึ้น
sampler พื้นฐานที่ปรับการแจกแจงความน่าจะเป็นโดยตรง
- Temperature ทำงานเหมือน “ปุ่มปรับความคิดสร้างสรรค์” ของ LLM
- temperature ต่ำทำให้โทเคนที่มีคะแนนสูงสุดเด่นขึ้น เพิ่มความคาดเดาได้
- temperature สูงอย่าง 0.7~1.0 ทำให้ผู้สมัครอันดับ 3 หรือ 4 ก็ถูกเลือกได้ เพิ่มความหลากหลาย แต่ก็เพิ่มโอกาสผิดพลาด
- temperature ที่สูงมากเกิน 1.0 หากไม่ใช้ร่วมกับ sampling อื่นอย่าง Min-P อาจทำให้เอาต์พุตหยาบและคาดเดายาก
- ในเชิงเทคนิคคือหาร logits ด้วยค่า temperature แล้วจึงใช้ softmax
- Presence Penalty ใช้ penalty คงที่กับโทเคนที่เคยปรากฏอย่างน้อยหนึ่งครั้ง
- ลบค่า penalty ออกจาก logits ของโทเคนที่เคยใช้ก่อนหน้า โดยไม่ขึ้นกับจำนวนครั้งที่ปรากฏ
- โดยทั่วไปไม่แนะนำ เพราะมีกลยุทธ์ penalty ที่ดีกว่า
- Frequency Penalty เพิ่ม penalty ตามสัดส่วนจำนวนครั้งที่โทเคนปรากฏ
- หากโทเคนหนึ่งปรากฏสามครั้ง logits จะลดลง
3 × frequency penalty - ยิ่งโทเคนเดิมซ้ำมากเท่าไร โอกาสถูกเลือกอีกครั้งจะค่อย ๆ ลดลง
- หากโทเคนหนึ่งปรากฏสามครั้ง logits จะลดลง
- Repetition Penalty ใช้กับโทเคนที่ปรากฏทั้งใน prompt และเอาต์พุตที่สร้างขึ้น
- logits ที่เป็นบวกจะถูกหารด้วย penalty ส่วน logits ที่เป็นลบจะถูกคูณด้วย penalty ให้ติดลบมากขึ้น
- มีประโยชน์ในการตัดลูปการซ้ำ แต่ค่าที่รุนแรงจะมีต้นทุนด้านความสอดคล้อง
DRY สำหรับป้องกัน pattern ซ้ำ
- DRY(Don't Repeat Yourself) ตรวจจับ pattern การซ้ำได้กว้างกว่าการซ้ำคำแบบง่าย
- หา n-gram ที่ซ้ำในลำดับโทเคนที่สร้างขึ้น และลง penalty กับโทเคนที่จะทำให้ pattern นั้นดำเนินต่อไป
- หาก pattern อย่าง
"the cat sat on the"เคยปรากฏก่อนหน้า และกระแสเดียวกันเริ่มขึ้นอีกครั้ง จะทำให้โทเคนถัดไปที่เคยตามหลัง pattern นั้นมีโอกาสถูกเลือกน้อยลง - ยิ่ง pattern ซ้ำยาว ก็ยิ่งใช้ penalty แรงขึ้น
- พารามิเตอร์หลักได้แก่ multiplier ซึ่งเป็นความแรงของ penalty, base ซึ่งเป็นอัตราเพิ่มตามความยาว n-gram, ความยาว n-gram ต่ำสุดและสูงสุด, sequence breaker, range limit ฯลฯ
- sequence breaker อย่าง punctuation สามารถรีเซ็ตการจับคู่ pattern ได้ และยังมีการจำกัดช่วงให้พิจารณาเฉพาะข้อความล่าสุดเพื่อประสิทธิภาพ
- มีประโยชน์เป็นพิเศษในงานอย่างการเขียนเชิงสร้างสรรค์ ซึ่งวลีซ้ำ ๆ ดูไม่เป็นธรรมชาติ
sampler แบบ filtering ที่ตัดผู้สมัครออก
- Top-K คงไว้เฉพาะโทเคน K อันดับแรก แทนที่จะใช้ทั้งชุดคำศัพท์
- หาก K เท่ากับ 40 จะเลือกจากผู้สมัครที่มีความเป็นไปได้สูงสุด 40 ตัวเท่านั้น
- logits ที่เหลือจะถูกตั้งเป็น
-∞ทำให้หลัง softmax ความน่าจะเป็นแทบเป็น 0
- Top-P(Nucleus) คงชุดผู้สมัครขั้นต่ำที่ความน่าจะเป็นสะสมเกิน threshold P แทนจำนวนคงที่
- หาก P เท่ากับ 0.9 จะรวมผู้สมัครอันดับต้น ๆ จนกว่าความน่าจะเป็นสะสมจะถึง 90%
- เมื่อโมเดลมั่นใจ ผู้สมัครจะน้อย และเมื่อไม่แน่นอน ผู้สมัครจะเหลือมากขึ้น
- จะคงโทเคนอย่างน้อยหนึ่งตัวเสมอ โดยรักษาโทเคนที่มีความน่าจะเป็นสูงสุดไว้
- Min-P ตั้งเส้นฐานคุณภาพเป็นอัตราส่วนเทียบกับโทเคนที่มีความน่าจะเป็นสูงสุด
- หากความน่าจะเป็นสูงสุดคือ 0.6 และ Min-P คือ 0.1 ค่า threshold จะเป็น 0.06
- โทเคนที่มีความน่าจะเป็นต่ำเกินไปเมื่อเทียบกับผู้สมัครสูงสุดจะถูกตัดออก
- มักใช้ร่วมกับ temperature สูง 1.0~1.2 และใช้ค่า Min-P ต่ำมากประมาณ 0.1
- มีประสิทธิภาพกว่า เพราะไม่ต้องเรียงลำดับชุดคำศัพท์ทั้งหมดเหมือน Top-K หรือ Top-P
- Top-A ใช้ threshold ที่แปรผันตามกำลังสองของความน่าจะเป็นสูงสุด
- ยิ่งโมเดลมั่นใจ ผลของกำลังสองจะทำให้ threshold สูงขึ้นและลดผู้สมัครลงมาก
- เป็นวิธีที่มาก่อน Min-P และในเชิงเทคนิค Min-P เป็นแบบเชิงเส้น ส่วน Top-A อิงกำลังสอง
- Epsilon Cutoff ลบโทเคนที่ต่ำกว่า threshold ความน่าจะเป็นคงที่
- ใช้เกณฑ์เดียวกันโดยไม่ขึ้นกับคุณลักษณะของการแจกแจง
- เรียบง่ายและคาดเดาได้ แต่ไม่ปรับตัวเท่า Eta Cutoff
sampler ที่ใช้รูปทรงการแจกแจงและความไม่แน่นอน
- Top-N-Sigma สร้าง threshold เชิงสถิติโดยใช้ค่าสูงสุดของ logits และส่วนเบี่ยงเบนมาตรฐาน
- เกณฑ์คือ
logit สูงสุด - N × ส่วนเบี่ยงเบนมาตรฐาน - สะท้อนทั้งค่าสัมบูรณ์ของการแจกแจงและการกระจายตัวของคะแนนทั้งหมด
- เกณฑ์คือ
- Tail-Free Sampling(TFS) ดูความโค้งของการแจกแจงความน่าจะเป็นเพื่อหาจุดที่หางยาวเริ่มต้น
- เรียง logits จากมากไปน้อย แปลงเป็นความน่าจะเป็น แล้วคำนวณค่าสัมบูรณ์ของผลต่างอันดับสอง
- ลบโทเคนหลังจุดที่การแจกแจงสะสมของความโค้งเกิน threshold
- โฟกัสที่ รูปทรง ของการแจกแจงมากกว่าค่าความน่าจะเป็นสัมบูรณ์
- Eta Cutoff ใช้ทั้งความน่าจะเป็นรายตัวและ entropy รวม
- ในสถานการณ์ entropy ต่ำที่โมเดลมั่นใจ จะใช้ cutoff ที่เข้มงวดขึ้น
- ในสถานการณ์ entropy สูงที่โมเดลไม่แน่นอน จะใช้ cutoff ที่ผ่อนปรนกว่า
- threshold กำหนดจากค่าต่ำสุดของ
etaและsqrt(eta) * exp(neg_entropy)
- Locally Typical Sampling ดูว่าใกล้กับ surprisal เฉลี่ยแค่ไหน ไม่ใช่ความน่าจะเป็นโดยตรง
- มองทั้งโทเคนที่คาดเดาได้เกินไปและโทเคนที่น่าประหลาดใจเกินไปว่า “typical” น้อยลง
- เรียงโทเคนตาม surprisal deviation จากน้อยไปมาก และกำหนดปริมาณความน่าจะเป็นสะสมที่จะคงไว้ด้วย
typical-p
- Quadratic Sampling ไม่ใช่ filtering แต่เป็นการแปลงการแจกแจง logits ทั้งหมดแบบไม่เชิงเส้น
- ปรับความต่างระหว่างโทเคนคะแนนสูงสุดกับ logits อื่นด้วยพจน์ quadratic และ cubic
- smoothing factor ควบคุมความแรงของการปรับ ส่วน smoothing curve ควบคุมรูปแบบการแปลง
- หาก
sเป็นบวก การแจกแจงจะมีปลายแหลมขึ้น และหากkเป็นบวก จะทำงานในทิศทางที่ทำให้การแจกแจงแบนลง
วิธีขั้นสูงสำหรับควบคุมความคาดเดาได้และความหลากหลาย
- XTC(eXclude Top Choices) เปิดใช้งานแบบมีความน่าจะเป็น และตั้งใจตัดตัวเลือกที่คาดเดาได้มากที่สุดออก
- ใช้ความน่าจะเป็นในการเปิดใช้งานและ threshold การตัดออกเป็นพารามิเตอร์
- จากผู้สมัครอันดับต้น ๆ ที่เกิน threshold จะยกเว้นผู้สมัครคะแนนต่ำสุดหนึ่งตัว แล้วลบผู้สมัครความน่าจะเป็นสูงที่เหลือ
- ต่างจาก filter ทั่วไปที่ตัดผู้สมัครความน่าจะเป็นต่ำ โดยวิธีนี้เล็งตัวเลือกที่ชัดเจนเกินไป
- Mirostat เป็นวิธี feedback ที่ปรับแบบไดนามิกเพื่อรักษา surprisal เป้าหมาย
- กรองโทเคนที่น่าประหลาดใจเกินไปด้วย threshold
muปัจจุบัน - หลังเลือกโทเคน จะคำนวณ surprisal จริงแล้วเทียบกับค่าเป้าหมาย
tau etaคือ learning rate ที่กำหนดว่าจะปรับmuเร็วเพียงใด- สูตรอัปเดตคือ
mu_{t+1} = mu_t - η × (surprisal_t - τ) - เป็นวิธีควบคุมตัวเองที่พยายามรักษา perplexity ของการสร้างข้อความให้คงที่
- กรองโทเคนที่น่าประหลาดใจเกินไปด้วย threshold
- Dynamic Temperature Sampling เปลี่ยน temperature ตาม entropy ของการแจกแจงปัจจุบัน
- เมื่อ entropy ต่ำ จะใช้ temperature สูงขึ้นเพื่อเพิ่มความหลากหลาย
- เมื่อ entropy สูง จะใช้ temperature ต่ำลงเพื่อโฟกัสเอาต์พุต
- ผู้ใช้ตั้งค่า temperature ต่ำสุด, temperature สูงสุด และ exponent
- สูตรคำนวณคือ
temperature = min_temp + (max_temp - min_temp) * (normalized_entropy ^ exponent)
Beam Search และ Contrastive Search
- Beam Search รักษาลำดับผู้สมัครหลายชุดแบบขนาน เพื่อหาเส้นทางที่มีความน่าจะเป็นรวมสูง
- รักษาลำดับผู้สมัครตาม beam width และในแต่ละ decoding step จะขยายผู้สมัครแล้วคงไว้เฉพาะอันดับต้น ๆ
- โดยปกติสุ่มตัวอย่างผู้สมัคร
2kในแต่ละขั้น เพื่อให้หลังตัดลำดับที่จบแล้ว ฯลฯ ยังมีผู้สมัครเพียงพอ - คะแนนคือผลรวม logprob ของทุกโทเคนในลำดับ
- ให้เอาต์พุตเดียวกันแบบ deterministic สำหรับอินพุตเดียวกัน มีต้นทุนสูง และปัจจุบันไม่ค่อยใช้มากนักเพราะมีวิธี sampling ที่ดีกว่า
- Contrastive Search ปรับให้เหมาะทั้งความน่าจะเป็นสูงที่เข้ากับบริบทและการหลีกเลี่ยง pattern ซ้ำ
- เลือกผู้สมัคร Top-K ก่อน
- เปรียบเทียบ hidden representation ของ context เดิมกับ continuation ผู้สมัคร เพื่อคำนวณ degeneration penalty ตาม similarity
- คะแนนสุดท้ายคือ
score(x) = α * P(x) - (1-α) * sim(x, context) αปรับสมดุลระหว่างความเป็นไปได้กับความหลากหลาย- เป็นวิธีที่ไม่ได้ใช้แพร่หลาย คล้ายกับ Beam Search
ลำดับการใช้ sampler เปลี่ยนผลลัพธ์อย่างไร
- ในการ implement LLM จริง มักใช้เทคนิค sampling ตามลำดับ บางไลบรารีอนุญาตให้เปลี่ยนลำดับตามคำขอได้ แต่ส่วนใหญ่ไม่อนุญาต
- pipeline ทั่วไปเป็นไปตามลำดับนี้
- โมเดลสร้าง raw logits
- filter หรือห้ามโทเคนที่ไม่ควรพิจารณา
- ใช้ repetition, frequency, presence penalty
- ใช้เทคนิคอิง pattern อย่าง DRY
- ใช้ temperature scaling
- ใช้เทคนิคปรับการแจกแจงอย่าง Top-K, Top-P, Min-P
- sampling โทเคนจากการแจกแจงความน่าจะเป็นสุดท้าย
- Temperature จะถูกใช้ตอนต้นหรือตอนท้าย นอก penalty และ sampler แบบ post-softmax ขึ้นอยู่กับ implementation
- สำหรับงานส่วนใหญ่ temperature จะถูกใช้ก่อน
- สำหรับการเขียนเชิงสร้างสรรค์ มักใช้ตอนท้าย
- sampler แต่ละตัวเปลี่ยนภูมิทัศน์ความน่าจะเป็นที่ sampler ถัดไปจะเห็น
- penalty ลด peak ของโทเคนที่เคยใช้แล้ว และยกผู้สมัครอื่นขึ้นโดยสัมพัทธ์
- temperature ต่ำทำให้การแจกแจงแหลมขึ้น ส่วน temperature สูงทำให้แบนลง
- filter อย่าง Top-K/P ลบโทเคนความน่าจะเป็นต่ำ แล้ว renormalize ความน่าจะเป็นที่เหลือ
ปฏิสัมพันธ์ที่ขึ้นกับลำดับและการผสมผสาน
- ลำดับ Temperature → Filtering จะจัดโครงสร้างการแจกแจงทั้งหมดใหม่ก่อน แล้วจึง filter
- temperature ต่ำทำให้มวลความน่าจะเป็นกระจุกในโทเคนจำนวนน้อยตั้งแต่ก่อน filter
- temperature สูงทำให้มวลความน่าจะเป็นกระจายกว้างขึ้นก่อนถูก filter
- ลำดับ Filtering → Temperature จะตัดผู้สมัครก่อน แล้ว temperature จึงปรับเฉพาะความน่าจะเป็นสัมพัทธ์ระหว่างโทเคนที่เหลือ
- แม้ใช้ temperature สูง โทเคนที่ถูก filter ออกแต่แรกก็จะไม่กลับมา
- ใน Top-K 40 กับ temperature 1.5 หากใช้ filter ก่อน ก็จะเหลือเฉพาะ 40 อันดับแรกเดิม
- Penalties → Temperature ลดความน่าจะเป็นของโทเคนซ้ำก่อน แล้ว temperature จึงขยายหรือลดการปรับนั้น
- เมื่อ temperature สูง ผลของ penalty อาจถูกลบล้างไปในทางปฏิบัติ
- เมื่อ temperature ต่ำ penalty อาจถูกขยายแรงเกินไป
- Temperature → Penalties ให้ penalty ทำงานบนการแจกแจงที่ถูกจัดโครงสร้างใหม่ด้วย temperature ทำให้ผลของ penalty สมดุลและคาดเดาได้มากขึ้น
- DRY ไวต่อตำแหน่ง
- หากใช้ช่วงต้นของ pipeline จะป้องกันการซ้ำได้แรง แต่ sampler ภายหลังอาจดึงโทเคนที่โดน penalty กลับขึ้นมาได้
- หากใช้ช่วงท้าย อาจอ่อนลงเพราะ sampler ก่อนหน้าได้ลบผู้สมัครบางส่วนไปแล้ว แต่จะเป็นแนวป้องกันสุดท้ายต่อการซ้ำก่อนเลือกโทเคน
- มีการผสมผสานที่เสริมกันด้วย
- Top-K + Top-P: Top-K ให้ขีดจำกัดแบบ hard limit และ Top-P ปรับตามความมั่นใจของโมเดล
- Temperature + Min-P: temperature สูงทำให้การแจกแจงแบนลง และ Min-P วางขีดล่างด้านคุณภาพเทียบกับผู้สมัครสูงสุด
- มีการผสมผสานที่ขัดกันด้วย
- High Temperature + Low Top-K: Top-K ต่ำจำกัดผู้สมัครอย่างมาก จึงทับผลของ temperature ไปมาก
- ใช้ filtering หลายแบบพร้อมกัน: หากใช้ Top-K, Top-P, Min-P, TFS ร่วมกัน วิธีที่จำกัดที่สุดจะครอบงำและทำให้วิธีอื่นซ้ำซ้อน
- XTC + Top-A: ทั้งคู่พยายามตัดตัวเลือกอันดับบนด้วยวิธีต่างกัน อาจทำให้พื้นที่ sampling แคบเกินไป
tokenizer สร้างพื้นที่ sampling อย่างไร
- tokenizer กำหนดว่าโมเดลทำนายความน่าจะเป็นของอะไร และ sampler จัดการผู้สมัครแบบใด
- อัลกอริทึม subword สร้างสมดุลระหว่างปัญหาลำดับยาวของระดับอักขระ กับปัญหาชุดคำศัพท์ใหญ่และ unknown ของระดับคำ
- BPE(Byte Pair Encoding) เริ่มจากชุดคำศัพท์ที่อิงอักขระหรือ byte แล้วรวมคู่ symbol ที่อยู่ติดกันและพบบ่อยที่สุดในคลังข้อมูลฝึกซ้ำ ๆ
- ทำการรวมซ้ำจนถึงขนาดคำศัพท์ที่ต้องการ
- ตัวอย่างขนาดคำศัพท์ที่ยกมาคือ 32000 หรือ 128256 units
- BPE มาตรฐานอาจต้องใช้ pre-tokenization ตามช่องว่างและเครื่องหมายวรรคตอน และการจัดการ whitespace อาจไม่สอดคล้องกันในแต่ละ implementation
- SentencePiece จัดการข้อความเป็นลำดับอักขระ Unicode โดยตรง โดยไม่แบ่งล่วงหน้า
- สามารถเข้ารหัสช่องว่างเป็นส่วนหนึ่งของโทเคนได้
- เพราะทำงานกับ raw Unicode จึงสามารถเข้ารหัส whitespace อย่างชัดเจนเป็น
U+2581ทำให้ tokenization และ de-tokenization reversible และ lossless - ภายในสามารถ implement ได้ทั้ง BPE หรือ unigram language model
- เป็นที่นิยมใน LLM สมัยใหม่เพราะไม่ขึ้นกับภาษาและย้อนกลับได้
ผลของขนาดคำศัพท์ ขอบเขตโทเคน และคำหายาก
- tokenizer มีขนาดคำศัพท์คงที่ โดยคำศัพท์ขนาดใหญ่จะบรรจุคำเต็มได้มากกว่า ส่วนคำศัพท์ขนาดเล็กจะพึ่งพา subword มากกว่า
- หาก
"sampling"หรือ"probability"เป็นโทเคนเดียว โมเดลจะทำนายความเป็นไปได้ของแนวคิดทั้งหมดในครั้งเดียว- ในวลีที่พบบ่อย จะสร้างเอาต์พุตได้ตรงและคาดเดาได้มากขึ้น
- สำหรับคำหายาก อาจเกิดปัญหา
<UNK>หรือการผสม subword ที่ดูฝืน
- หากแบ่ง
"sampling"เป็นsampl+ingโมเดลจะทำนายเป็นขั้นที่ละเอียดขึ้น- หาก sampler อย่าง temperature อนุญาต ก็มีโอกาสเปลี่ยนจาก
samplingเป็นsampler - สามารถประกอบคำหายากจากชิ้นส่วนได้
- หากติดอยู่กับ common sub-word prefix อาจเกิดเอาต์พุตที่ไม่สอดคล้องหรือค้างได้
- penalty อย่าง DRY ต้องติดตามลำดับที่สั้นกว่าและมีความหมายไม่ชัดเจนกว่า
- หาก sampler อย่าง temperature อนุญาต ก็มีโอกาสเปลี่ยนจาก
- วลีเดียวกันอาจถูกแบ่งต่างกันตาม tokenizer
"State-of-the-art"อาจกลายเป็นState+-+of+-+the+-+artหรือในสไตล์ SentencePiece อาจเป็นState+_of+_the+_art- หากปรากฏบ่อย ทั้งวลีอาจกลายเป็นโทเคนเดียวได้
- ขอบเขตโทเคนส่งผลโดยตรงต่อ sampler แบบอิง n-gram อย่าง DRY
- หาก
"once upon a time"เป็น 4 โทเคน DRY จะตรวจจับ 4-gram ได้ง่าย - หากเป็นโทเคนเดียว จะลง penalty แบบเดียวกันได้ยาก เว้นแต่จะ rollback เอาต์พุต
- หาก
- คำที่หายากหรือคำใหม่สามารถถูกแยกเป็นชิ้นส่วนที่รู้จักใน BPE และ SentencePiece ได้
- หากสร้าง
<UNK>จะทำให้ sampler มีตัวเลือกที่มีความหมายให้พิจารณาน้อยลงหนึ่งตัว - วิธี subword สามารถผสมชิ้นส่วนอย่างสร้างสรรค์ได้ แต่การสร้างคำหายากต้องผ่าน sampling หลายขั้น จึงมีโอกาสหลุดกลางทางมากกว่า known token เดียว
- หากสร้าง
1 ความคิดเห็น
ความเห็นจาก Hacker News
เกี่ยวกับเรื่องนี้ งานวิจัย min_p ของพวกเราได้อันดับ 18 จากผลงานส่งเข้า ICLR ทั้งหมด 12,000 ฉบับ และได้รับเลือกให้เป็นการนำเสนอแบบปากเปล่า
https://iclr.cc/virtual/2025/oral/31888
โปสเตอร์ก็ได้รับความนิยมมากเช่นกัน: https://iclr.cc/media/PosterPDFs/ICLR%202025/30358.png?t=174...
ดูการนำเสนอแบบปากเปล่าได้ที่นี่ มีช่วงที่แซะ Yoshua Bengio ในประเด็นนี้ แล้วเขาก็กลายเป็นคนถามคำถามคนแรก ผู้บรรยายคนที่สองเริ่มราว ๆ 19:30 และมีสไลด์ประกอบด้วย ค่อนข้างขำดี: https://iclr.cc/virtual/2025/session/31936
งานวิจัย: https://arxiv.org/abs/2407.01082
ในฐานะหนึ่งในผู้เขียน min_p ผมยืนยันได้ว่าตอนนี้แซมเพลอร์แบบใช้งานทั่วไปที่ดีที่สุดแบบทิ้งห่างคือ Top N sigma นอกจากนี้ยังสามารถและควรปรับ temperature ให้สูงกว่าที่ใช้กันอยู่ตอนนี้มาก ๆ ด้วย ถ้าใช้เทคนิคอย่าง min_p หรือ top N sigma ต่อให้ temperature 100 ก็ยังโอเคสบาย ๆ
อีกอย่างหนึ่ง ตอนท้ายงานวิจัย ผู้เขียนพูดถึงชุดค่าผสม top_k = 2 กับ temperature สูงมาก ที่พวกเขาไม่แนะนำ แต่มันก็น่าสนใจมากในตัวเอง ประมาณทุก 10 คำจะมีคำสะกดผิดหนึ่งครั้ง แต่ในขณะเดียวกันก็ดูเหมือนจะก่อให้เกิดความคิดสร้างสรรค์ที่น่าสนใจไม่น้อย
ผมรู้ว่าจำนวนกิ่งก้านมันใหญ่แบบไร้เหตุผลและต้นทุนในการขยายโหนดก็แพง แต่การที่มันไม่ค้นหาเลยจริง ๆ ก็ยังรู้สึกแปลกอยู่เสมอ
สิ่งหนึ่งที่ขาดหายไปตรงนี้คือ แซมเพลอร์ไม่สามารถเข้าถึงสถานะภายในของโมเดลได้ แซมเพลอร์แค่เอาคณิตศาสตร์พื้นฐานไปใช้กับการกระจายผลลัพธ์ และถึงแม้ว่าการกระจายนั้นในทางเทคนิคจะมีความหมายเชิงความหมายแฝงอยู่บ้าง แต่ถ้าไม่ฉลาดเท่าโมเดลก็ถอดรหัสมันไม่ได้
แซมเพลอร์อย่าง repetition penalty หรือ DRY ที่อธิบายในที่นี้ก็เหมือนกัน โมเดลสามารถวนซ้ำตัวเองได้อีกนับไม่ถ้วนรูปแบบ และวิธีเดียวที่จะหยุดมันทั้งหมดได้คือการฝึกที่ดีกว่า ไม่ใช่การค้นหา n-gram หรือวิธี NLP แบบดั้งเดิม มันเหมือนพยายามเอานิ้วอุดรูทุกแห่ง แต่มือเรามีนิ้วกี่นิ้วกัน?
การแฮ็กกระบวนการ autoregressive อาจให้การปรับปรุงหรือทริกฉลาด ๆ แบบ ผลไม้ที่เก็บได้ง่าย อย่าง Min-P ได้ แต่ถ้าจุดประสงค์คือพยายามเปลี่ยนโมเดลแย่ ๆ ให้เป็นโมเดลดี ๆ ก็ถือว่าเดินผิดทางแล้ว
Top n sigma มีมาตั้งแต่กลางปี 2024 และ min_p มาตั้งแต่ปี 2023 แต่จนถึงตอนนี้นอกโลกโอเพนซอร์ส หรือก็คือนอก HF/vllm เราก็ยังต้องรอให้เอานวัตกรรมเหล่านี้ไปผนวกใช้งานอยู่ดี เหตุผลที่ผู้ให้บริการ API จงใจทำช้าก็เพราะไม่อยากรับความเสี่ยงที่โมเดลจะสร้างสรรค์เกินไป และ temperature สูงก็มีโอกาสสูงที่จะทำลาย watermarking ด้วย
อีกอย่าง การทำให้โมเดลรู้การตั้งค่าแซมพลิงของตัวเองนั้นง่ายมาก แค่ป้อนค่าพวกนั้นกลับเข้าไปให้โมเดลทุกโทเค็นหรือทุกครั้งที่ generate ก็พอ เช่นทำได้ผ่าน structured generation โมเดลสามารถควบคุมการตั้งค่าแซมพลิงของตัวเองได้ และด้วยการเขียนโปรแกรมเพิ่มอีกเพียงนิดเดียว ก็สามารถ “เข้าถึงสถานะภายใน” ได้แล้ว ตอนนี้ตัวโมเดลเองก็อาจเขียนโค้ดส่วนนั้นแทนคุณได้ด้วย
เมื่อไม่นานมานี้ผมก็ลองเขียน ไกด์เรื่องการแซมพลิง สำหรับ Ollama/llama.cpp ไว้นิดหน่อยเช่นกัน ยินดีรับฟังฟีดแบ็กหรือข้อเสนอแก้ไข: https://smcleod.net/2025/04/comprehensive-guide-to-llm-sampl...
โดยรวมเรียบเรียงมาดีและอธิบายง่าย ซึ่งผมชอบตรงที่มันเปิดให้เห็นว่าควรลองอะไรใหม่ ๆ ตรงไหนถึงจะได้ผล
เช่นทำไมเราไม่ใช้ ทั้งคำเป็นโทเค็น ไปเลย? เราอาจสร้าง “หุ่นยนต์” ที่มี “สำเนียงหุ่นยนต์” แบบจำกัดได้ มันคงไม่มีความสามารถในการจัดการคำใหม่หรือคำหายาก แต่เราสามารถแก้ข้อมูลฝึกและข้อมูลนำเข้าเพื่อแปลคำพวกนั้นให้เป็นคำศัพท์ที่มีอยู่เดิมได้ แบบนั้นก็จะได้ mapping ที่เล็กลงมาก แถมยังให้ความรู้สึกเป็นหุ่นยนต์แบบตรงตัว และผู้ใช้ก็จะตั้งความคาดหวังได้ว่าหุ่นยนต์นี้จะตอบแบบไหน คล้าย C-3PO
ถ้าความพยายามคือทำให้ LLM ส่งออกเป็น ไอเดีย แทนที่จะเป็นแค่ “โทเค็นถัดไป” กระบวนการเลือกบนเวกเตอร์ logit ก็ดูเหมือนจะทำลายไอเดียดั้งเดิมนั้นไป ถ้าไอเดียเสร็จสมบูรณ์อยู่แล้ว ก็น่าจะไม่จำเป็นต้องใช้การแซมพลิงกับ logit
ในกรอบนี้ การแซมพลิงไม่ควรเกิดขึ้นในระดับที่ใกล้ผลลัพธ์มากขนาดนั้น คือระดับ “คำถัดไปที่จะพูดคืออะไร”
เมื่อไม่กี่สัปดาห์ก่อนผมทำบทความอินเทอร์แอ็กทีฟเกี่ยวกับหัวข้อที่เกี่ยวข้องกันคือ constraint sampling บทความนี้ละเอียดกว่ามากก็จริง
http://michaelgiba.com/grammar-based/index.html
โมเดล LLM สามารถทำ tokenization โดยปริยายได้ไหม? หมายถึงการยอมรับสตริงแบบใดก็ได้โดยไม่ต้องสร้าง tokenizer แยกต่างหาก แล้วให้โครงข่ายประสาทแปลงมันเป็นโทเค็น พร้อมฝึกน้ำหนักของโครงข่ายนั้นไปด้วยกันกับ LLM ส่วนที่เหลือ
เวกเตอร์ one-hot เหล่านี้จะผ่านชั้นเชิงเส้นเพื่อบีบอัดให้เหลือขนาดเท่ากับ hidden state ของโมเดล เช่น vocabulary ของโทเค็นอาจมี 10,000~100,000 ตัว แต่ขนาด hidden state อาจมีแค่ประมาณ 500~2,000 เท่านั้น ส่วนที่เหลือของโมเดลทั้งหมดจะทำงานอยู่ใน hidden state space[1] ซึ่งภายในนั้นบรรจุแนวคิดระดับสูงหลายอย่างไว้
ถ้าตัด tokenization ออก ตัว encoder ก็ต้องทำงานมากขึ้นเพื่อไปให้ถึง hidden state space ที่เราคุ้นเคยจากไบต์ที่ยังไม่ถูกจับคู่ อาจเป็นไปได้ว่าจะหา encoding ที่มีประสิทธิภาพกว่าสำหรับแปลงจากไบต์ที่ไม่ถูกจับคู่ไปยัง hidden space แต่เมื่อดูจากข้อเท็จจริงที่ว่า tokenization ของโมเดลส่วนใหญ่ก็อิงกับคุณสมบัติทางสถิติของชุดฝึกอยู่แล้ว ความเป็นไปได้นี้ก็ดูต่ำ ถ้าไม่รวม “anti” หรือ “ism” ให้เป็นโทเค็นเดียวโดยอัตโนมัติก่อนส่งเข้าโมเดล attention head ในชั้นล่างของโมเดลก็ต้องมาทำงานเดียวกันแทน
ในอดีตเคยฝึกโมเดลด้วยลำดับอักขระมาก่อน แล้วจึงย้ายมาใช้ tokenization เพราะเหตุผลด้านประสิทธิภาพ ดังนั้นความแลกเปลี่ยนแบบนี้ก็น่าจะไม่คุ้มค่า
[0] จะให้รายการ token ID ตรงๆ ไม่ได้ โทเค็น 123.25 ไม่มีความหมายทางคณิตศาสตร์ และการเพิ่มหรือลด token ID ก็ไม่มีความหมายเช่นกัน
[1] ประสิทธิภาพดีขึ้น แต่การตีความกลับยากขึ้น โดยเฉพาะอย่างยิ่ง basis vector ของ hidden space ไม่ได้สอดคล้องกับคำหรือแนวคิดโดยตรง และทุกแนวคิดก็อยู่บนวงแหวนแบบ N มิติชนิดหนึ่ง
การเรียกการอัปเดตเทคนิคให้ใช้เทคโนโลยีที่เพิ่งถูกประดิษฐ์ขึ้นเมื่อไม่กี่ปีก่อนว่า สมัยใหม่ นั้นแทบจะเป็นปัญหาเรื่องความเข้าใจการอ่านเลย ถ้าจะเรียกว่าสมัยใหม่ มันเทียบกับอะไร หรือมีสิ่งที่เรียกว่า LLM sampling แบบคลาสสิกด้วยหรือ?
modern, adj. designed and made using the most recent ideas and methods
— https://dictionary.cambridge.org/us/dictionary/english/moder...
สิ่งที่บทความนี้อธิบายเข้ากับคำนิยามนั้นอย่างตรงตัว ในช่วงราว 7 ปีที่ผ่านมา มีความก้าวหน้ามากมายในด้านนี้ และตัวอย่างเช่น GPT 1, 2, 3 ก็เก่าอย่างชัดเจนมากเมื่อเทียบกับมาตรฐานปัจจุบัน และในความหมายตามคำนิยามข้างต้นก็ไม่ใช่สิ่งที่สมัยใหม่
ChatGPT เป็นเพียงจุดเปลี่ยนที่ทำให้คนทั่วไปเข้าถึงได้เท่านั้น และก่อนหน้านั้นคีย์บอร์ดสมาร์ตโฟนก็ใช้ LLM กันมาตั้งแต่ 10 ปีก่อนแล้ว
เป็นเอกสารที่มีประโยชน์มาก คำอธิบายชัดเจนมากและครอบคลุมกว้าง
มีใครรู้ไหมว่าใครเป็นคนเขียน? ไม่มีการระบุผู้เขียนและมันถูกโพสต์ไว้บน Markdown pastebin ฟรี
ส่วน DRY repetition penalty น่าสนใจดี ผมมักอยากให้ LLM คัดลอกอินพุตแบบตรงตัวโดยตั้งใจในหลายกรณี เช่น เวลาสรุปบทสนทนายาวๆ ผมมักขอคำพูดอ้างอิงแบบตรงตัวที่แสดงประเด็นได้ดีที่สุด เพราะจะได้กลับไปค้นในต้นฉบับเพื่อตรวจสอบข้อเท็จจริงทีหลังได้ง่าย
DRY penalty ดูเหมือนจะทำงานสวนทางกับเป้าหมายแบบนั้น