- ได้สร้าง Mark V. Shaney Junior เครื่องมือสร้างข้อความแบบมาร์คอฟอย่างง่ายที่เขียนด้วย โค้ด Python ราว 30 บรรทัด โดยได้แรงบันดาลใจจากโปรแกรม Mark V. Shaney ในยุค 1980
- โมเดลนี้ใช้การทำนายคำถัดไปแบบความน่าจะเป็นบนพื้นฐานของ สามคำ (trigram) โดยใช้ บทความบล็อกราว 200 ชิ้น (ประมาณ 200,000 คำ) เป็นข้อมูลฝึก
- ประโยคที่สร้างขึ้นถูกแสดงออกมาในรูปแบบ ประโยคไร้ความหมาย (gibberish) ที่ผสมคำจากหัวข้อในบล็อก เช่น Lisp, Emacs, คณิตศาสตร์, การเขียนโปรแกรม
- เมื่อเพิ่ม order ของโมเดล ประโยคจะมีความสอดคล้องมากขึ้น แต่เมื่อเกิน 5 จะเริ่มอ้างข้อความต้นฉบับตรง ๆ ทำให้ ความสร้างสรรค์หายไป
- แม้จะอยู่ในยุคของโมเดลภาษาขนาดใหญ่ (LLM) แต่ ความชัดเจนเชิงโครงสร้างของโมเดลมาร์คอฟแบบเรียบง่าย ก็ยังถูกเสนอให้เป็นจุดเริ่มต้นที่ดีในการทำความเข้าใจหลักการสร้างภาษา
ภาพรวมโปรแกรม Mark V. Shaney Junior
- Mark V. Shaney Junior คือเครื่องมือสร้างข้อความที่เลียนแบบผู้ใช้เสมือน Mark V. Shaney ซึ่งเคยเคลื่อนไหวบน Usenet ในยุค 1980
- ต้นฉบับเป็นโปรแกรมที่ใช้โมเดลมาร์คอฟเพื่อสร้างโพสต์โดยอัตโนมัติ
- การนำมาทำครั้งนี้เป็น เวอร์ชันมินิมัล ที่ย่อแนวคิดนั้นให้เรียบง่ายลง และเผยแพร่บน GitHub
- โค้ดทั้งหมดมีเพียง Python ราว 30 บรรทัด และให้ความสำคัญกับ ความเรียบง่ายมากกว่าประสิทธิภาพ
- แม้แต่คนที่เพิ่งรู้จักโมเดลมาร์คอฟครั้งแรกก็ ทำความเข้าใจได้ภายใน 20 นาที
การเขียนโปรแกรมเชิงทดลองในฐานะงานอดิเรก
- ผู้เขียนชอบทำการเขียนโปรแกรมเพื่อ สำรวจไอเดีย มากกว่าจะแก้ปัญหาเฉพาะหน้า
- เคยทดลองกับมาร์คอฟเชนที่มี state space หลากหลายหลายครั้ง
- จากนั้นก็นำโค้ดทดลองเหล่านี้มาจัดระเบียบและแชร์บน GitHub หรือ Codeberg
- Mark V. Shaney Junior ก็เป็นหนึ่งในงานทดลองเหล่านี้ และเป็นกรณีที่นำมาขัดเกลาให้สมบูรณ์ขึ้นก่อนเผยแพร่
การสร้างข้อความด้วยข้อมูลจากบล็อก
- หลังจากทดสอบด้วยการฝึกโมเดลบน A Christmas Carol ของ Charles Dickens แล้ว
ก็ได้นำ บทความบล็อกตลอด 24 ปี (มากกว่า 200 ชิ้น ราว 200,000 คำ) มาใช้เป็นข้อมูลนำเข้า
- ไม่รวมคอมเมนต์ (ราว 40,000 คำ)
- ประโยคที่สร้างขึ้นออกมาเป็น ข้อความไร้ตรรกะ ที่ปะปนด้วย คำสั่งโปรแกรมมิง คำศัพท์ทางคณิตศาสตร์ และคำสั่งของเอดิเตอร์
- ตัวอย่างเช่น การนำคำสั่ง Emacs, โค้ด Lisp และศัพท์คณิตศาสตร์มาผสมกันแบบสุ่ม
- บางประโยคดึงคำมาจากบทความคนละชิ้นในบล็อกมาสร้างเป็น การจับคู่ที่ไร้ความหมาย
- ตัวอย่างเช่น “Lisp source file” กับ “self-esteem” ถูกดึงมาจากคนละบทความแล้วนำมาประกบกัน
คุณสมบัติแบบมาร์คอฟและโครงสร้างอัลกอริทึม
- ค่าตั้งต้นใช้ trigram (3 คำ) เป็นพื้นฐาน
โดยใช้สองคำก่อนหน้าเป็นคีย์ (key) และเก็บคำที่สามเป็นค่า (value) ใน โครงสร้างแบบแมป
- ขั้นตอนการสร้างข้อความ
- เลือกคู่คำแบบสุ่ม → เลือกหนึ่งคำจากคำถัดไปที่เป็นไปได้ด้วยความน่าจะเป็นเท่ากัน
- นำคำที่เพิ่งเลือกกับคำก่อนหน้ามาสร้างเป็นคู่ใหม่แล้วทำซ้ำ
- จบการทำงานเมื่อไม่มีคำถัดไปอีก หรือถึง ขีดจำกัด 100 คำ
- ถ้า trigram เดียวกันปรากฏหลายครั้ง คำถัดไปนั้นจะถูกเก็บซ้ำในลิสต์
ทำให้เกิด การสุ่มเลือกตามสัดส่วนความถี่ที่ปรากฏจริง
- กระบวนการนี้เป็น การเปลี่ยนสถานะแบบความน่าจะเป็นที่ขึ้นกับสถานะปัจจุบันเท่านั้น
ในเชิงสมการเขียนได้เป็น P(Xₙ₊₁ | Xₙ, Xₙ₋₁, …, X₁) = P(Xₙ₊₁ | Xₙ)
- คุณสมบัติ memoryless นี้คือแกนสำคัญของคุณสมบัติแบบมาร์คอฟ
การทดลองเพิ่มเติมและการปรับ order ของโมเดล
- ค่า order เริ่มต้นคือ 2 และสามารถเปลี่ยนได้ผ่านอาร์กิวเมนต์ของบรรทัดคำสั่ง
- หากเพิ่ม order เป็น 3~4 ประโยคจะ สอดคล้องและเป็นธรรมชาติมากขึ้น
- ตัวอย่างเช่น สามารถสร้างประโยคที่ดูมีเหตุผลมากขึ้นซึ่งผสมคำสั่ง IRC กับแนวคิดทางคณิตศาสตร์
- แต่เมื่อเพิ่ม order เป็น 5 จะเริ่มมีแนวโน้ม คัดลอกต้นฉบับตรง ๆ
ทำให้ ความไร้สาระเชิงสร้างสรรค์ (gibberish) หายไป
- ยังสามารถให้พรอมป์ตเริ่มต้นเพื่อสร้างข้อความได้ด้วย
- ตัวอย่างเช่น หากป้อนประโยคที่ขึ้นต้นด้วย “Finally we”
ก็จะได้ประโยคยาวที่ผสมคำอย่าง Emacs, MATLAB และ GNU bash เข้าด้วยกัน
ความหมายของโมเดลแบบเรียบง่าย
- แม้ในปี 2025 โมเดลภาษาขนาดใหญ่ (LLM) จะเป็นกระแสหลัก
แต่โมเดลมาร์คอฟก็ยังไม่สามารถจับ โครงสร้างระดับภาพรวมหรือการพึ่งพากันระยะยาว ได้
- ถึงอย่างนั้น ด้วย การออกแบบที่เรียบง่ายและการติดตั้งใช้งานที่ชัดเจน
มันก็ยังมีคุณค่าในฐานะ โมเดลเริ่มต้นสำหรับเรียนรู้หลักการสร้างภาษา
- ผู้เขียนอธิบายว่า “โมเดลนี้แหละคือ ‘Hello, world’ ของ language model”
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Markov Model คือเวอร์ชันเชิงสถิติของ state machine ที่สร้างโทเค็นถัดไปแบบความน่าจะเป็นโดยอิงจากสถานะปัจจุบันเท่านั้น
ถ้าจะอภิปรายกันให้มีความหมาย ต้องนิยามความสัมพันธ์ระหว่างสถานะกับโทเค็นให้ชัดเจน
ตัวอย่างเช่น ถ้าสถานะเป็นฟังก์ชันของค่าที่สังเกตล่าสุด k ค่า ก็จะเรียกว่า Markov Chain อันดับ k
มองได้ว่า RNN เป็นรูปแบบขยายที่นิยามสถานะเป็นฟังก์ชันของสถานะก่อนหน้าและโทเค็นล่าสุด
ความน่าจะเป็นของการเปลี่ยนสถานะอาจเป็นแบบกำหนดตายตัวหรือแบบสุ่มก็ได้ และความยาวของบริบทก็กำหนดแบบแปรผันได้เช่นกัน
แต่ Markov Model ไม่ใช่ทุกแบบที่จะเรียนรู้ได้
จำได้ว่าในปี 1992 เคยซื้อโปรแกรมแบบนี้จาก Egghead Software ในราคา 3 ดอลลาร์
เอางานเขียนคล้ายไดอารีของตัวเองตลอด 5 ปีใส่เข้าไป แล้วก็นั่งหัวเราะกับผลลัพธ์
ดูตัวอย่างเก่าได้จาก Babble 1.0.20 และโพสต์ในฟอรัมที่เกี่ยวข้อง Software Spotlight: Babble
อ่านโพสต์นี้แล้วผมก็ลองเล่นกับ Markov model เหมือนกัน
เริ่มจากระดับตัวอักษร แต่พอเปลี่ยนเป็นโมเดลอันดับ 2 ก็ไม่ได้ต่างมาก
พอขึ้นไปอันดับ 3 (trigram) ก็เริ่มดูเป็นธรรมชาติมากขึ้นนิดหน่อย
หลังจากนั้นลองใช้ข้อความที่ tokenize ด้วย BPE(Byte Pair Encoding) แล้วเอาไปใส่ Markov model อันดับ 1 ผลลัพธ์ก็ดูสอดคล้องกันมากขึ้นเล็กน้อย
แต่พอขยับเป็นอันดับ 2 มันก็ลอกต้นฉบับออกมาตรง ๆ — เพราะ BPE ตัดโทเค็นที่ซ้ำกันออก ทำให้การเปลี่ยนสถานะกลายเป็นแบบกำหนดตายตัว
พอลดจำนวนโทเค็นลง (เช่น 894 → 800) มันก็กลับมาไม่เป็นแบบกำหนดตายตัวอีก และข้อความก็ดูเป็นธรรมชาติมากขึ้นนิดหน่อย
ถ้าดันอันดับสูงเกินไป (เช่น อันดับ 5) ข้อความจะให้ความรู้สึกว่าแห้ง แข็ง และเรียงแต่ข้อเท็จจริง
สุดท้ายแล้ว Markov model เป็นเครื่องมือที่เรียบง่าย แต่สนุกมากสำหรับการทดลอง
คิดว่าถ้าตัด chain ที่มีโทเค็นถัดไปได้แค่ตัวเดียวออกก็น่าจะดีขึ้น แต่ก็เสี่ยงจะลบโครงสร้างไวยากรณ์ไปด้วย
ตอนนี้กำลังหาวิธีที่ดีกว่าเพื่อหลีกเลี่ยง chain ยาว ๆ แบบเส้นเดียวอยู่
ถ้ามีทางเดินที่เป็นไปได้แค่ทางเดียว ก็ลดลงมาเหลือ 4 คำอะไรแบบนั้น
หรืออีกมุมหนึ่ง เราอาจอยู่ลำพังและจิตใจก็แค่พยายามหาความเป็นระเบียบท่ามกลางความโกลาหลก็ได้
เมื่อก่อนผมก็เคยทำการทดลองคล้ายกัน
เอางานเขียนแฟนตาซีกับไซไฟที่เขียนสะสมมา 20 ปี ราว 500,000 คำ ใส่เข้าไปใน Markov model แล้วปรับด้วยสไลเดอร์ 2~5 แกรม
มันเป็นเหมือนเครื่องมือแบบ ‘บ่อน้ำแห่งความฝัน’ ที่ผมหยิบมาใช้ทุกครั้งเวลาต้องการแรงบันดาลใจ
รู้สึกเหมือนเป็นการต่อยอดจากนิสัยสมัยเด็กที่ชอบเปิดพจนานุกรมแบบสุ่มเพื่อหาไอเดียเขียนหนังสือ
ถ้าเอาคลังข้อความแบบนี้มาทดลอง น่าจะกลายเป็นโปรเจกต์ที่สนุกมาก
มี วิดีโอนำเสนอ ด้วย
เอางานเขียนส่วนตัวทั้งหมดไปฝึกเพื่อสร้างโมเดลของตัวเองได้ไหม?
ควรใช้โมเดลกับเครื่องมืออะไร และจะเขียนให้เป็นสำนวนของตัวเองได้โดยไม่ต้องมี system prompt หรือเปล่า
แล้วจะต่อยอดให้ตอบโทรศัพท์หรือข้อความใน Discord ได้อย่างเป็นธรรมชาติไหมก็อยากรู้เหมือนกัน
มี แฟนฟิก Harry Potter ที่สร้างด้วย Markov Chain อยู่
ชื่อว่า Harry Potter and the Portrait of What Looked Like a Large Pile of Ash
ดูได้ที่ ลิงก์ของ botnik.org
แค่ประโยคแรกก็ให้ความรู้สึกเหมือนเป็น ข้อความกลวงเปล่า แล้ว
ผมคิดว่ามันไม่มีทั้งอารมณ์และความหมาย ยิ่งกว่าหนังสือที่มนุษย์เขียนได้แย่ที่สุดเสียอีก
ความพยายามแบบ “I Fed 24 Years of My Blog Posts to a Markov Model” เป็นสิ่งที่ LLM หลายตัวทำซ้ำมาแล้ว อยู่ดี
นักเขียนอย่าง Barbara Cartwright ที่เขียนนิยายโรมานซ์คล้าย ๆ กันออกมามากกว่า 700 เล่ม ดูเหมือนน่าจะจำลองด้วย Markov model ได้
ภรรยาผมเองบางทีก็เผลอซื้อเล่มที่เคยอ่านแล้วกลับมาอ่านซ้ำอีก
จำได้ว่าเคยเห็น บอต Markov chain บน IRC ช่วงกลางยุค 2000
ก่อน GPT จะออกมา ก็ไม่มีอะไรที่ดีกว่านั้นแล้ว
ที่จริงสิ่งนี้ใกล้เคียงกับ trigram model มากกว่า Markov model
ถ้าขยายไปถึง 4-gram ขึ้นไป ก็น่าจะได้ประโยคที่เป็นธรรมชาติกว่านี้มาก
เมื่อก่อนเคยมีงานวิจัยโมเดล n-gram ขนาดมหึมาชื่อ “infini-gram” ซึ่งได้ยินมาว่าในบางโดเมนให้ประสิทธิภาพใกล้เคียง LLM เลย
ขอบคุณที่แบ่งปันประสบการณ์และความคิดตลอด 24 ปีที่ผ่านมา
ในยุคนี้ที่มีแต่การเสพและสิ่งกระตุ้นล้นเกิน การแบ่งปันอย่างจริงใจแบบนี้เป็นสิ่งพิเศษมาก