สัมผัสกลไกการทำงานของโมเดลภาษาได้ด้วยตัวเองผ่าน GuppyLM โมเดลภาษาขนาดเล็ก
(github.com/arman-bd)- โมเดลภาษาขนาดเล็กมากที่มีพารามิเตอร์เพียงประมาณ 9 ล้านตัว และสามารถ ฝึกได้ภายใน 5 นาทีด้วย Colab โน้ตบุ๊กเพียงอันเดียว
- ทำครบทั้งกระบวนการตั้งแต่ การสร้างข้อมูล, tokenizer, การฝึกโมเดล ไปจนถึงการอนุมาน ในสภาพแวดล้อมเดียว และรองรับทั้ง เบราว์เซอร์·Colab·เครื่องโลคัล
- ออกแบบเป็น คาแรกเตอร์ ‘Guppy’ ที่จินตนาการโลกใต้น้ำ สนทนาด้วยประโยคสั้นและเรียบง่าย โดยเน้น ความโปร่งใสเพื่อการเรียนรู้
- ใช้ สถาปัตยกรรม Transformer แบบพื้นฐาน เพื่อให้เห็นโครงสร้างแกนหลักของโมเดลภาษาอย่างชัดเจนโดยไม่พึ่งเทคนิคซับซ้อน
- เป็นโครงการโอเพนซอร์สที่ทุกคนสามารถทดลองและเรียนรู้ได้ ด้วย ชุดข้อมูลสาธารณะบน HuggingFace และไลเซนส์ MIT
ภาพรวมของ GuppyLM
- GuppyLM คือโมเดลภาษาขนาดเล็กมากที่มีพารามิเตอร์ประมาณ 9 ล้านตัว เป็นโมเดลที่พูดคุยเหมือนปลาคาแรกเตอร์ ‘Guppy’
- ถูกออกแบบโดยตั้งเป้าเป็น LLM ที่สามารถฝึกได้เองภายใน 5 นาทีด้วย Colab โน้ตบุ๊กเพียงอันเดียว ทำให้ทำครบทุกขั้นตอนตั้งแต่การสร้างข้อมูล, tokenizer, โครงสร้างโมเดล, ลูปการฝึก ไปจนถึงการอนุมานได้ในสภาพแวดล้อมเดียว
- สร้างขึ้นเพื่อให้สามารถ สัมผัสการทำงานภายในของโมเดลภาษาได้โดยตรง โดยไม่ต้องมี GPU คลัสเตอร์ขนาดใหญ่หรือความรู้เฉพาะทาง
- แม้จะไม่สามารถสร้างข้อความยาวแบบโมเดลขนาดใหญ่ได้ แต่เป็น โมเดลเพื่อการเรียนรู้ที่แสดงให้เห็นทั้งกระบวนการตั้งแต่การรับอินพุต การเรียนรู้น้ำหนัก ไปจนถึงการสร้างเอาต์พุตอย่างโปร่งใส
- สามารถรันได้ทั้งใน เบราว์เซอร์, Colab และสภาพแวดล้อมโลคัล และมีการเผยแพร่ทั้งชุดข้อมูลและโมเดลผ่าน HuggingFace
คุณสมบัติของโมเดล
- GuppyLM เป็นคาแรกเตอร์ที่คิดโดยมีโลกใต้น้ำเป็นศูนย์กลาง เช่น น้ำ, อุณหภูมิ, แสง, การสั่นสะเทือน, อาหาร
- ใช้ ประโยคสั้นและตัวพิมพ์เล็ก และไม่เข้าใจแนวคิดนามธรรมของมนุษย์ เช่น เงินหรือการเมือง
- มี บุคลิกเป็นมิตร อยากรู้อยากเห็น และเรียบง่าย
- ข้อมูลฝึกประกอบด้วย 60 หัวข้อ และตัวอย่างบทสนทนาสังเคราะห์ 60,000 รายการ และสามารถฝึกได้ภายในประมาณ 5 นาทีบน GPU เดี่ยว
- ด้วยขนาดโมเดลที่เล็ก จึงสามารถทำ การอนุมานบนเบราว์เซอร์ด้วย WebAssembly ได้
สถาปัตยกรรม
- จำนวนพารามิเตอร์: 8.7M
- จำนวนเลเยอร์: 6
- มิติ hidden: 384
- หัว attention: 6
- มิติ FFN: 768 (ReLU)
- ขนาดคำศัพท์: 4,096 (BPE)
- ความยาวซีเควนซ์สูงสุด: 128 โทเค็น
- การทำ normalization: LayerNorm
- position embedding: แบบเรียนรู้ได้
- LM head: แชร์น้ำหนักร่วมกับ embedding
- ใช้ โครงสร้าง Transformer แบบพื้นฐาน โดยไม่ใช้เทคนิคซับซ้อนอย่าง GQA, RoPE, SwiGLU, early exit เป็นต้น
บุคลิกและหัวข้อสนทนา
- Guppy สนทนาด้วย ประโยคสั้น, การใช้ตัวพิมพ์เล็ก, และ การคิดที่ยึดประสาทสัมผัสเป็นหลัก
- ตอบสนองต่อหัวข้อต่าง ๆ เช่น อาหาร, น้ำ, แสง, ตู้ปลา, ฟองอากาศ, การสะท้อน, ผิวน้ำ, โลกภายนอก
- หัวข้อหลัก 60 รายการประกอบด้วย การทักทาย, อารมณ์, อุณหภูมิ, อาหาร, แสง, น้ำ, ตู้ปลา, เสียงรบกวน, ความเหงา, ความฝัน, ฤดูกาล, เรื่องตลก, ความรัก, สุขภาพ, TV เป็นต้น
วิธีรันและการใช้งาน
-
รันบนเบราว์เซอร์
- ทำ การอนุมานแบบโลคัล ด้วย WebAssembly
- ดาวน์โหลด โมเดล ONNX แบบ quantized ขนาดประมาณ 10MB แล้วรันได้โดยไม่ต้องมีเซิร์ฟเวอร์หรือ API key
-
แชตบน Colab
- ดาวน์โหลดโมเดลที่ pretrain ไว้แล้วจาก HuggingFace เพื่อใช้งานผ่าน อินเทอร์เฟซแบบโต้ตอบ
- รันทุกเซลล์แล้วสามารถเริ่มแชตได้ทันที
-
ฝึกบน Colab
- ตั้งค่า runtime เป็น T4 GPU แล้วรันทุกเซลล์
- ทำอัตโนมัติทั้งการดาวน์โหลดชุดข้อมูล, ฝึก tokenizer, ฝึกโมเดล และทดสอบ
- สามารถอัปโหลดโมเดลที่ได้ไปยัง HuggingFace หรือบันทึกไว้ในเครื่องโลคัล
-
แชตในสภาพแวดล้อมโลคัล
- ติดตั้ง
pip install torch tokenizersแล้วรันคำสั่งpython -m guppylm chat - หากบทสนทนายาวเกินไป คุณภาพจะลดลงเนื่องจากข้อจำกัด 128 โทเค็น
- รองรับโหมดที่ป้อนพรอมป์ต์ครั้งเดียว รับคำตอบ แล้วจบการทำงานได้เช่นกัน
- ติดตั้ง
ชุดข้อมูล
- ใช้ชุดข้อมูล arman-bd/guppylm-60k-generic บน HuggingFace
- จำนวนตัวอย่าง: 60,000 (ฝึก 57K / ทดสอบ 3K)
- รูปแบบ:
{"input": "...", "output": "...", "category": "..."} - จำนวนหมวดหมู่: 60
- วิธีสร้าง: ข้อมูลสังเคราะห์แบบอิงเทมเพลต
- ใช้เทมเพลตราว 60 แบบ, วัตถุในตู้ปลา 30 แบบ, ชนิดอาหาร 17 แบบ, และชุดกิจกรรม 25 แบบ เพื่อ สร้างเอาต์พุตที่ไม่ซ้ำกันราว 16,000 รายการ
โครงสร้างโปรเจกต์
-
guppylm/
config.py: โมเดลและไฮเปอร์พารามิเตอร์การฝึกmodel.py: โมเดล Transformer แบบพื้นฐานdataset.py: การโหลดข้อมูลและการจัดการแบตช์train.py: ลูปการฝึก (cosine LR, AMP)generate_data.py: สร้างข้อมูลบทสนทนา 60 หัวข้อeval_cases.py: ชุดกรณีทดสอบprepare_data.py: เตรียมข้อมูลและฝึก tokenizerinference.py: อินเทอร์เฟซแชต
-
tools/
make_colab.py: สร้าง Colab โน้ตบุ๊กexport_onnx.py: ส่งออกเป็นโมเดล ONNX (uint8 quantization)export_dataset.py: อัปโหลดชุดข้อมูลไปยัง HuggingFacedataset_card.md: คำอธิบายชุดข้อมูลสำหรับ HuggingFace
-
docs/
index.html: เดโมบนเบราว์เซอร์ (ONNX + WASM)download.sh: ดาวน์โหลดโมเดลและ tokenizermodel.onnx: โมเดลที่ถูก quantize แล้ว (~10MB)tokenizer.json: BPE tokenizerguppy.png: ภาพโลโก้
การตัดสินใจด้านการออกแบบ
-
ตัด system prompt ออก:โมเดลขนาด 9M ทำตามคำสั่งแบบมีเงื่อนไขได้ยาก จึงฝังบุคลิกลงในน้ำหนักโดยตรง แทนการใช้พรอมป์ต์เดียวกันกับทุกตัวอย่าง
- ทำให้ประหยัดได้ประมาณ 60 โทเค็นในขั้นตอนอนุมาน
- บทสนทนาแบบเทิร์นเดียว: ด้วยข้อจำกัด 128 โทเค็น คุณภาพจะเริ่มลดลงหลัง 3~4 เทิร์น
- แม้จะเข้ากับคอนเซปต์ ‘ความจำแบบปลาทอง’ ของ Guppy แต่ การสนทนาแบบเทิร์นเดียวมีความเสถียรมากที่สุด
- คง Transformer แบบพื้นฐานไว้: เทคนิคอย่าง GQA, SwiGLU, RoPE, early exit ไม่ได้ช่วยเพิ่มคุณภาพกับโมเดลขนาด 9M และมีแต่เพิ่มความซับซ้อน
- ชุด standard attention + ReLU FFN + LayerNorm ก็ให้ประสิทธิภาพเพียงพอ
- ใช้ข้อมูลสังเคราะห์: เพื่อรักษาบุคลิกของคาแรกเตอร์ให้คงเส้นคงวา จึงเลือกใช้วิธี สร้างข้อมูลแบบอิงเทมเพลต
ไลเซนส์
- ไลเซนส์ MIT
1 ความคิดเห็น
ความเห็นจาก Hacker News
สงสัยว่าโปรเจ็กต์นี้มี เอกสารประกอบ หรือไม่
ตัวโค้ดเองดูเหมือนจะเป็นหนึ่งในอิมพลีเมนเทชันที่เรียบง่ายที่สุดของ (Not So) Large Language Model แต่สำหรับนักพัฒนาที่ยังไม่คุ้นกับ multi-head attention, ReLU FFN, LayerNorm, positional embedding ฯลฯ ก็อาจเข้าใจได้ไม่ง่าย
โปรเจ็กต์นี้มีลักษณะเชิงการศึกษาใกล้เคียงกับ Minix เหมือนที่ Minix ถูกใช้เป็นเครื่องมือเรียนรู้การออกแบบระบบปฏิบัติการ การให้นักศึกษาเพิ่มฟีเจอร์เข้าไปใน GuppyLM เพื่อเรียนรู้การออกแบบ LLM ก็เป็นแนวทางที่ดี
สงสัยว่าโปรเจ็กต์นี้ต่างจาก microgpt หรือ minGPT ของ Andrej Karpathy อย่างไร
มีตัวอย่าง ภาพแสดงผลแบบ 3D ของเลเยอร์ LLM ขนาดเล็กอยู่ที่ bbycroft.net/llm ซึ่งช่วยให้เข้าใจการทำงานภายในได้มาก
ดูการพูดคุยที่เกี่ยวข้องได้ที่ ที่นี่
ยอดเยี่ยมมากสำหรับการเริ่มต้นเรียนรู้ LLM
เมื่อก่อนเคยสร้างโมเดลของตัวเองโดยใช้ Paradise Lost ของ Milton เป็นฐาน
ดูเพิ่ม: wvrk.org/works/milton
อันนี้น่าจะเป็นผลมาจากการที่ ข้อมูลฝึกทั้งหมดเป็นตัวพิมพ์เล็ก
ถึงอย่างนั้นคาแรกเตอร์ของมันก็ยังชัดอยู่
ชวนให้สงสัยว่าจะสร้าง LLM ที่ฝึกด้วย Toki Pona อย่างเดียวได้ไหม
ดู วิกิ Toki Pona
กำลังทำโปรเจ็กต์ที่ให้เอเจนต์ LLM หลายตัวแบ่งปัน โลกเสมือน ร่วมกันและโต้ตอบกันอย่างอัตโนมัติ
สิ่งที่น่าทึ่งคือการมีอยู่ของ ‘โลก’ ส่งผลต่อพฤติกรรมของโมเดลอย่างมาก
ถึงจะเป็นโมเดลเดียวกันและพรอมป์ต์เดียวกัน แต่ถ้าปัจจัยแวดล้อมอย่างข้อจำกัดด้านทรัพยากร เอเจนต์อื่น ๆ หรือหน่วยความจำแบบต่อเนื่องเปลี่ยนไป ผลลัพธ์ก็เปลี่ยนไปโดยสิ้นเชิง
พวกเรามัวแต่โฟกัสกับการปรับแต่งตัวโมเดลเอง และคิดถึง สภาพแวดล้อมการทำงาน ของมันน้อยเกินไป
ในที่สุดก็รู้สึกเหมือนมี LLM ที่ซื่อสัตย์ เกี่ยวกับโลกออกมาแล้ว
คำตอบที่ว่า “ความหมายของชีวิตคืออาหาร” ดูจะผิดน้อยกว่าคำตอบจากโมเดลที่ใหญ่กว่านี้ 10,000 เท่า
ไอเดียดี แต่ตัวอย่างดูเหมือนจะ คัดลอกจากข้อมูลฝึกตรง ๆ
เลยอยากรู้ว่ามันรับมือกับคำถามที่ไม่รู้จักอย่างไร
เป้าหมายของโปรเจ็กต์นี้คือการ สาธิตหลักการทำงาน ของ LLM
งานยอดเยี่ยมมาก ขอบคุณที่นำมาแบ่งปัน
แต่ก็สงสัยว่าตอนนี้ LLM ให้ความรู้สึกว่า ‘หมดความลึกลับ’ ไปแล้วจริงหรือยัง
เพราะมันยังน่าทึ่งอยู่ดีที่ผลลัพธ์แบบนี้เกิดขึ้นได้จากแค่สถิติเรียบง่ายกับพลังประมวลผลมหาศาล