3 คะแนน โดย GN⁺ 2025-05-06 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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
    • ยิ่งโทเคนเดิมซ้ำมากเท่าไร โอกาสถูกเลือกอีกครั้งจะค่อย ๆ ลดลง
  • 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 ของการสร้างข้อความให้คงที่
  • 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 ต้องติดตามลำดับที่สั้นกว่าและมีความหมายไม่ชัดเจนกว่า
  • วลีเดียวกันอาจถูกแบ่งต่างกันตาม 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 ความคิดเห็น

 
GN⁺ 2025-05-06
ความเห็นจาก 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 คำจะมีคำสะกดผิดหนึ่งครั้ง แต่ในขณะเดียวกันก็ดูเหมือนจะก่อให้เกิดความคิดสร้างสรรค์ที่น่าสนใจไม่น้อย

    • ผมสงสัยว่ามีแซมเพลอร์แบบที่ไม่เกือบจะโลภเสมอไปจริง ๆ หรือเปล่า หมายถึงแบบที่ทำ tree search จริง ๆ
      ผมรู้ว่าจำนวนกิ่งก้านมันใหญ่แบบไร้เหตุผลและต้นทุนในการขยายโหนดก็แพง แต่การที่มันไม่ค้นหาเลยจริง ๆ ก็ยังรู้สึกแปลกอยู่เสมอ
  • สิ่งหนึ่งที่ขาดหายไปตรงนี้คือ แซมเพลอร์ไม่สามารถเข้าถึงสถานะภายในของโมเดลได้ แซมเพลอร์แค่เอาคณิตศาสตร์พื้นฐานไปใช้กับการกระจายผลลัพธ์ และถึงแม้ว่าการกระจายนั้นในทางเทคนิคจะมีความหมายเชิงความหมายแฝงอยู่บ้าง แต่ถ้าไม่ฉลาดเท่าโมเดลก็ถอดรหัสมันไม่ได้
    แซมเพลอร์อย่าง repetition penalty หรือ DRY ที่อธิบายในที่นี้ก็เหมือนกัน โมเดลสามารถวนซ้ำตัวเองได้อีกนับไม่ถ้วนรูปแบบ และวิธีเดียวที่จะหยุดมันทั้งหมดได้คือการฝึกที่ดีกว่า ไม่ใช่การค้นหา n-gram หรือวิธี NLP แบบดั้งเดิม มันเหมือนพยายามเอานิ้วอุดรูทุกแห่ง แต่มือเรามีนิ้วกี่นิ้วกัน?
    การแฮ็กกระบวนการ autoregressive อาจให้การปรับปรุงหรือทริกฉลาด ๆ แบบ ผลไม้ที่เก็บได้ง่าย อย่าง Min-P ได้ แต่ถ้าจุดประสงค์คือพยายามเปลี่ยนโมเดลแย่ ๆ ให้เป็นโมเดลดี ๆ ก็ถือว่าเดินผิดทางแล้ว

    • ไม่ใช่ เป้าหมายคือเปลี่ยนโมเดลที่ไม่สร้างสรรค์ให้เป็น โมเดลที่สร้างสรรค์ เพราะมีคนคิดว่าการแซมพลิงไม่สำคัญ หรือเป็นการฝืน bitter lesson ผมเลยต้องชี้ตรง ๆ ในการพูดแบบปากเปล่าที่ ICLR ว่าทั้งวงการนี้มีจุดบอดขนาดใหญ่ต่อการวิจัยแนวนี้
      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

    • โทเค็นไนเซอร์ที่ใช้เฉพาะทั้งคำเป็นวิธีที่คนเคยทำกันในยุค RNN/LSTM มันไม่ได้ดีกว่าในเชิงฟังก์ชันไปกว่าแนวทางอย่าง BPE หรือ WordPiece/SentencePiece และยังทำให้ใช้สัญญาณเชิงความหมายที่มีประโยชน์อย่างเครื่องหมายวรรคตอนได้ยากขึ้น จนคุณภาพแย่ลงอีก
  • ถ้าความพยายามคือทำให้ LLM ส่งออกเป็น ไอเดีย แทนที่จะเป็นแค่ “โทเค็นถัดไป” กระบวนการเลือกบนเวกเตอร์ logit ก็ดูเหมือนจะทำลายไอเดียดั้งเดิมนั้นไป ถ้าไอเดียเสร็จสมบูรณ์อยู่แล้ว ก็น่าจะไม่จำเป็นต้องใช้การแซมพลิงกับ logit
    ในกรอบนี้ การแซมพลิงไม่ควรเกิดขึ้นในระดับที่ใกล้ผลลัพธ์มากขนาดนั้น คือระดับ “คำถัดไปที่จะพูดคืออะไร”

    • LLM ถูกฝึกให้เพิ่มความน่าจะเป็นของการทำนาย โทเค็นถัดไป ให้สูงสุด ไม่ใช่ “ไอเดีย” คุณไม่สามารถนิยามไอเดียให้เป็นเป้าหมายของ loss สำหรับการฝึกได้
  • เมื่อไม่กี่สัปดาห์ก่อนผมทำบทความอินเทอร์แอ็กทีฟเกี่ยวกับหัวข้อที่เกี่ยวข้องกันคือ constraint sampling บทความนี้ละเอียดกว่ามากก็จริง
    http://michaelgiba.com/grammar-based/index.html

  • โมเดล LLM สามารถทำ tokenization โดยปริยายได้ไหม? หมายถึงการยอมรับสตริงแบบใดก็ได้โดยไม่ต้องสร้าง tokenizer แยกต่างหาก แล้วให้โครงข่ายประสาทแปลงมันเป็นโทเค็น พร้อมฝึกน้ำหนักของโครงข่ายนั้นไปด้วยกันกับ LLM ส่วนที่เหลือ

    • ทำแบบนั้นกันอยู่แล้ว โครงข่ายประสาทไม่สามารถจัดการโทเค็นได้โดยตรง และรับได้แค่ เวกเตอร์จำนวนจริง กับอินพุตที่หาอนุพันธ์ได้[0] ดังนั้นแทนที่จะป้อนโทเค็น 123, 456 ตรงๆ ก็ต้องแปลงแต่ละโทเค็นเป็นเวกเตอร์ one-hot encoding ซึ่งเป็นเวกเตอร์ที่มีค่า 1 เฉพาะตำแหน่งที่ token ID ชี้อยู่ และตำแหน่งอื่นทั้งหมดเป็น 0
      เวกเตอร์ 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 ก็เก่าอย่างชัดเจนมากเมื่อเทียบกับมาตรฐานปัจจุบัน และในความหมายตามคำนิยามข้างต้นก็ไม่ใช่สิ่งที่สมัยใหม่
    • อัลกอริทึมจำนวนมากในกลุ่มนี้ถูกคิดค้นขึ้นราวปี 2019 เช่น TFS หรือบางอย่างก็เก่ากว่านั้นอย่าง temperature
    • LLM มีมานานกว่านั้นมาก รางวัลโนเบลที่เกี่ยวข้องก็แสดงให้เห็นว่าความก้าวหน้าสำคัญเหล่านี้เกิดขึ้นได้อย่างไรตั้งแต่หลายสิบปีก่อน
      ChatGPT เป็นเพียงจุดเปลี่ยนที่ทำให้คนทั่วไปเข้าถึงได้เท่านั้น และก่อนหน้านั้นคีย์บอร์ดสมาร์ตโฟนก็ใช้ LLM กันมาตั้งแต่ 10 ปีก่อนแล้ว
  • เป็นเอกสารที่มีประโยชน์มาก คำอธิบายชัดเจนมากและครอบคลุมกว้าง
    มีใครรู้ไหมว่าใครเป็นคนเขียน? ไม่มีการระบุผู้เขียนและมันถูกโพสต์ไว้บน Markdown pastebin ฟรี
    ส่วน DRY repetition penalty น่าสนใจดี ผมมักอยากให้ LLM คัดลอกอินพุตแบบตรงตัวโดยตั้งใจในหลายกรณี เช่น เวลาสรุปบทสนทนายาวๆ ผมมักขอคำพูดอ้างอิงแบบตรงตัวที่แสดงประเด็นได้ดีที่สุด เพราะจะได้กลับไปค้นในต้นฉบับเพื่อตรวจสอบข้อเท็จจริงทีหลังได้ง่าย
    DRY penalty ดูเหมือนจะทำงานสวนทางกับเป้าหมายแบบนั้น

    • ไม่รู้มาก่อนว่าไม่มีการระบุผู้เขียน บทความนี้เขียนโดย @AlpinDale