- Embedding คือโครงกระดูกเชิงความหมายของ LLM โดยแปลงข้อความให้เป็น เวกเตอร์เชิงตัวเลข เพื่อให้โมเดลสามารถเข้าใจได้
- วิวัฒนาการของ embedding ผ่านการเปลี่ยนแปลงหลากหลายรูปแบบ ตั้งแต่เทคนิคเชิงสถิติอย่าง count-based, TF-IDF ไปจนถึงวิธีสมัยใหม่อย่าง Word2Vec, BERT และตระกูล GPT
- embedding ที่ดีต้องสร้างสมดุลระหว่าง การคงไว้ซึ่งความคล้ายคลึงเชิงความหมายของคำ และ การปรับจำนวนมิติ โดยใน LLM จะถูกฝึกร่วมกันให้เหมาะกับข้อมูลและงานที่ใช้
- อธิบายวิธี embedding ยอดนิยมอย่าง TF-IDF, Word2Vec, BERT ด้วยตัวอย่างและภาพประกอบ โดยเฉพาะ embedding ของ LLM ที่แปลงโทเค็นอินพุตเป็นเวกเตอร์มิติสูงก่อน แล้วจึงอัปเดตแบบเป็นลำดับชั้นตามบริบท
- แนะนำให้เข้าใจหลักการทำงานจริงของ embedding อย่างเป็นภาพและเข้าใจได้ง่าย ผ่าน โค้ดฝึกปฏิบัติ เช่น Torch embedding layer และการวิเคราะห์กราฟ embedding vector รวมถึงสื่อภาพประกอบ
Embedding คืออะไร
- Embedding คือเทคนิคที่แปลงข้อมูลอย่างข้อความ รูปภาพ เสียง ฯลฯ ให้เป็นเวกเตอร์มิติสูง
- โดยเฉพาะใน NLP นี่คือกระบวนการแปลงคำหรือโทเค็นให้เป็นเวกเตอร์ในรูปแบบที่คอมพิวเตอร์เข้าใจได้
- แม้ embedding จะใช้ได้กับข้อมูลหลายประเภท แต่บทความนี้จะอธิบายโดยเน้นที่ text embedding เป็นหลัก
พัฒนาการและประเภทของ embedding
- เทคนิค embedding ยุคแรก ส่วนใหญ่เป็นแนวทางเชิงสถิติ เช่น count vector, TF-IDF และ Co-Occurrence Matrix
- หลังจากนั้นมี embedding แบบโครงข่ายประสาทเทียมอย่าง Word2Vec, GloVe, FastText เกิดขึ้น และเริ่มสะท้อน ความคล้ายคลึงเชิงความหมาย ลงในปริภูมิเวกเตอร์
- ใน โมเดลที่ใช้ Transformer อย่าง BERT และ GPT embedding ของแต่ละโทเค็นจะถูกอัปเดตแบบเป็นลำดับชั้นหลังรับอินพุต เพื่อสะท้อนข้อมูลตามบริบท (dynamic/contextualized embedding)
เงื่อนไขของ embedding ที่ดี
การแทนความหมาย (semantic representation)
- คำที่มีความหมายคล้ายกันควรอยู่ใกล้กันในปริภูมิเวกเตอร์ด้วย
ตัวอย่าง: cat และ dog ควรถูกแมปให้คล้ายกันมากกว่า dog และ strawberry
ขนาดของมิติ (dimensionality)
- หากมิติของ embedding เล็กเกินไป ความสามารถในการแทนข้อมูลจะไม่พอ แต่ถ้าใหญ่เกินไปก็สิ้นเปลืองหน่วยความจำและเสี่ยงต่อ overfitting
ตัวอย่าง: GPT-2 มีมิติของ embedding ขั้นต่ำที่ 768
เทคนิค embedding แบบดั้งเดิม: TF-IDF
- TF-IDF คำนวณความสำคัญของคำจากผลคูณของความถี่ของคำและความหายากของคำนั้น (inverse document frequency)
- TF: คำนั้นปรากฏบ่อยแค่ไหนในเอกสารหนึ่งฉบับ
- IDF: คำนั้นหายากเพียงใดเมื่อเทียบกับเอกสารทั้งหมด
- ค่าผลลัพธ์ของ TF-IDF เหมาะกับงานง่าย ๆ เช่นการค้นคืนข้อมูลหรือการสกัดคีย์เวิร์ด แต่สะท้อนความคล้ายคลึงเชิงความหมายได้ไม่ดีนัก
- เมื่อนำมาแสดงผลด้วยภาพ คำส่วนใหญ่มักกระจุกอยู่ในคลัสเตอร์เดียว ทำให้การแยกเชิงความหมายต่ำ
Word2Vec
- Word2Vec เป็น embedding แบบโครงข่ายประสาทเทียมที่สะท้อนความสัมพันธ์เชิงความหมายลงในปริภูมิเวกเตอร์ได้อย่างมีประสิทธิภาพ
- มีวิธีอย่าง CBOW (ใช้คำรอบข้างทำนายคำศูนย์กลาง) และ Skipgram (ใช้คำศูนย์กลางทำนายคำรอบข้าง)
- เมื่อฝึกเสร็จ เมทริกซ์ embedding ในชั้นซ่อนจะถูกนำมาใช้เป็นเวกเตอร์เชิงความหมายของคำ
- ใช้เทคนิคเพิ่มประสิทธิภาพอย่าง negative sampling จึงฝึกกับข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ
- หากนำไปแสดงผลด้วยเครื่องมืออย่าง TensorFlow Embedding Projector จะเห็นว่า คำที่มีความหมายใกล้กันจะถูกจัดกลุ่มเป็นคลัสเตอร์
BERT และ embedding แบบ Transformer
- BERT เป็นโมเดล Transformer แบบ Encoder-only ซึ่งยิ่งผ่านแต่ละชั้นก็ยิ่งสะท้อนข้อมูลตามบริบทแบบไดนามิกมากขึ้น
- ขั้นตอนอินพุต: ใช้ tokenizer แยกข้อความเป็นโทเค็น → แปลงเป็น token embedding vector → รวมกับ positional embedding
- จากนั้นเมื่อผ่าน Transformer หลายชั้น embedding จะเปลี่ยนไปแบบไดนามิกเพื่อสะท้อนข้อมูลตามบริบท
- มีการใช้ special token อย่าง
[CLS], [SEP] เพื่อจัดการข้อมูลทั้งประโยคหรือข้อมูลการแบ่งส่วนด้วย
- หลังจาก BERT เป็นต้นมา LLM จำนวนมากก็หันมาใช้แนวทาง dynamic (contextualized) embedding
โครงสร้างและการเรียนรู้ของ LLM embedding
- LLM embedding ถูกทำเป็นชั้นแรก (lookup table) ที่แปลงโทเค็นอินพุตให้เป็นเวกเตอร์มิติสูง
- มีโครงสร้างเป็นตารางแบบ รับ token ID แล้วคืนค่า embedding vector ของแต่ละตัว เช่น
torch.nn.Embedding
- ระหว่างการฝึก LLM จะ ปรับแต่งน้ำหนักของ embedding layer ไปพร้อมกันด้วย ทำให้ embedding ละเอียดขึ้นตามข้อมูลและเป้าหมายที่โมเดลต้องประมวลผล
- ตัวอย่าง: โมเดล DeepSeek-R1-Distill-Qwen-1.5B ใช้ embedding vector ขนาด 1536 มิติ
การแสดงภาพและการวิเคราะห์กราฟของ embedding
- สามารถวิเคราะห์ปริภูมิ embedding ในรูปแบบกราฟ โดยอิงจากความคล้ายคลึงระหว่าง embedding vector (เช่น cosine similarity)
- ตัวอย่าง: สามารถ tokenize ประโยค
AI agents will be the most hot topic... แล้วเชื่อมโทเค็นที่มีความคล้ายกันสูงจาก embedding ของแต่ละโทเค็นเพื่อสร้างภาพได้
- แม้แต่รูปแบบย่อยต่าง ๆ ของคำเดียวกัน (เช่น
list, _list, List) ก็มักมี embedding ที่คล้ายกัน
บทสรุป
- Embedding เป็นองค์ประกอบแกนหลักของ LLM และ NLP โดยเปลี่ยนข้อมูลอินพุตให้เป็นเวกเตอร์เชิงตัวเลข เพื่อให้โมเดลจัดการโครงสร้างเชิงความหมายและข้อมูลตามบริบทได้
- แม้จะอยู่ในยุคของ LLM แต่หลักการพื้นฐานและโครงสร้างของ embedding ก็ไม่ได้เปลี่ยนไปมาก และยังคงมีบทบาทสำคัญอย่างยิ่งต่อประสิทธิภาพและการตีความของโมเดล
- ด้วยตัวอย่างโค้ดและสื่อภาพที่เข้าใจง่าย ผู้อ่านสามารถเข้าใจหลักการทำงานจริงของ embedding ได้ไม่ยาก
2 ความคิดเห็น
king - man + woman = queen
ความคิดเห็นบน Hacker News
น่าแปลกมากที่ embedding เป็นหนึ่งในส่วนของสแตก LLM ที่แทบไม่ค่อยถูกพูดถึง ทั้งที่ในเชิงสัญชาตญาณมันดูเป็นส่วนที่ส่งผลมหาศาลต่อความสามารถของเครือข่ายในการอนุมานความเชื่อมโยงเชิงความหมาย แต่คนกลับไม่ค่อยพูดถึงมัน
ปัญหาของ embedding คือแทบจะถอดความไม่ได้เลยนอกจากโดยตัวโมเดลเอง แม้ embedding จะเข้ารหัสความหมายของลำดับอินพุตไว้อย่างชัดเจน แต่ในระหว่างการฝึก ข้อมูลนั้นถูกบีบอัดมากเกินไปจนมีเพียง decoder head ของโมเดลที่ถอดมันออกได้ Anthropic มีงานวิจัยที่ทำให้ฟีเจอร์ภายในของ Sonnet 3 อยู่ในรูปแบบที่ตีความได้ แต่ก็มีต้นทุนสูง เพราะต้องฝึกเครือข่ายแยกอีกตัวแบบขนานเพื่อพยายามตีความ activation ของเลเยอร์ภายใน
สิ่งแปลกของปริภูมิหลายมิติคือ ค่าส่วนใหญ่จะตั้งฉากกันและอยู่ห่างกันมาก แต่ก็น่าทึ่งที่เทคนิคการลดมิติยังสามารถจัดกลุ่มแนวคิดได้แม้ใน 50,000 มิติ
ตอนที่เริ่มเรียนรู้เรื่อง embedding อย่างจริงจังครั้งแรก ผมคิดว่า “อย่างน้อยหนึ่งในสามของความมหัศจรรย์ใน LLMs มาจาก embedding” การที่คำต่าง ๆ ถูกจัดวางไว้แล้วอย่างมีประโยชน์เชิงความหมาย ทำให้ความลึกลับของ LLMs ลดลงไปนิดหน่อย มันยังน่าทึ่งอยู่ แต่เหมือนได้เห็นหลังม่านเพิ่มขึ้นเล็กน้อย
Embedding ทำหน้าที่เหมือน “Rosetta Stone” ที่ช่วยให้คอมพิวเตอร์วัดปริมาณภาษามนุษย์ได้ ผมคิดว่านี่ควรเป็นประเด็นสำคัญมาก แต่ก็เข้าใจได้ว่าการพยายามทำความเข้าใจปริภูมิเวกเตอร์ 1,000 มิตินั้นค่อนข้างหนักอยู่เหมือนกัน
ผมไม่ค่อยเข้าใจความเห็นที่บอกว่ามีการพูดถึง embedding น้อยเกินไป โดยเฉพาะเวลาเล่าตัวอย่างการใช้งาน RAG หรือพูดถึง vector DB มันมักเป็นหัวข้อหลักอยู่เสมอ
บทเรียนนี้ดีมาก — ความแตกต่างระหว่าง contextual embedding กับ static embedding สำคัญมาก หลายคนคุ้นกับ word2vec (static embedding) แต่ contextual embedding มักทรงพลังกว่ามาก (อนึ่ง แค่เลื่อนหน้าเว็บก็มี browser history hijacking หนักมาก เพราะมีประวัติถูกเพิ่มเข้าไปเต็มไปหมด)
จุดที่ผมคิดว่าน่าจะต้องมีคำอธิบายระดับสูงเพิ่มคือ ความต่างระหว่าง Encoder-Decoder transformer (BERT) กับโมเดลสร้างข้อความแบบ decoder-only เมื่อมองจากมุม embedding
ขอแก้นิดหนึ่ง: BERT เป็น encoder (ไม่ใช่ Encoder-Decoder), ChatGPT เป็น decoder, โมเดล encoder (BERT) สามารถมองทั้งประโยคได้ครบ จึงเหมาะกับการแทนความหมายมากกว่า เช่นในประโยค “The bank was steep and muddy” มันสามารถตัดสินความหมายของ
bankได้ว่าเป็นตลิ่งแม่น้ำหรือสถาบันการเงินโดยดูจากทั้งประโยค ขณะที่พวก GPT (decoder model) มองได้แค่จากซ้ายไปขวา จึงทำนายโดยไม่เห็นข้อมูลช่วงท้ายประโยค อ่านเพิ่มได้จากโพสต์ modernBERT ของ huggingface และบทความ neoBERTก็น่าสนใจเช่นกันขอเสริมคำอธิบายของ dust42: BERT คือ encoder, GPT คือ decoder, T5 คือ encoder-decoder ปัจจุบัน encoder-decoder ได้รับความนิยมน้อยลง โมเดล encoder มักใช้กับการจัดหมวดหมู่ การดึงข้อมูล และการค้นคืนข้อมูล ส่วน decoder เหมาะกับการสร้างข้อความ การสรุป และการแปล งานวิจัยล่าสุด(บทความ Ettin)ก็ยืนยันเรื่องนี้ ทั้งคู่เป็น transformer จึงสามารถเปลี่ยน encoder ให้เป็น decoder ได้ และกลับกัน ความต่างด้านการออกแบบอยู่ที่ bidirectional attention (ทุกโทเค็นมองเห็นทุกโทเค็น) กับ autoregressive attention (มองเห็นได้เฉพาะโทเค็นก่อนหน้า)
ถ้าใช้ embedding projector ก็ไม่เพียงดูคำได้เกิน 50 คำ แต่ยังช่วยสร้างสัญชาตญาณเรื่องการแสดงผลข้อมูลแบบ 3D ได้ด้วย ดูได้ที่ Tensorflow Embedding Projector
เป็น visual guide ที่ยอดเยี่ยมมาก! ผมเองก็ทำบทเรียน LLM embedding แบบ visual+audio+quiz ในคอนเซปต์คล้ายกันเพื่อช่วยให้เข้าใจ deep learning ลึกขึ้นบน app.vidyaarthi.ai, ลิงก์ลองใช้, ตั้งใจทำให้แนวคิดเชิงนามธรรมเข้าใจง่ายและโต้ตอบได้มากขึ้นด้วยแนวทาง “เรียนรู้ด้วยการลงมือทำ” ยินดีรับฟีดแบ็ก (ไม่ใช่การโปรโมตตัวเอง เป็นเครื่องมือที่ผมทำด้วยความตั้งใจจริง ๆ)
ดูเหมือนจะเข้าใช้งานไม่ค่อยได้ มีข้อความ error ในคอนโซลเต็มไปหมด เช่น “Content-Security-Policy: The page’s settings blocked an inline style…”
ผมคิดว่าการแสดงผลแบบ word cloud หรือแสดงผลลัพธ์ top-k ของ query อาจเข้าใจง่ายกว่า แนะนำให้ลอง Tensorflow's Embedding Projector แล้วพิมพ์คำ จากนั้นเลือก UMAP projection
คำอธิบายที่เน้นการใช้งานมากขึ้นก็มีในบทความอธิบาย embedding ของ sgnt.ai ผมเขียนเอง
ขอบคุณสำหรับเนื้อหาดี ๆ! จากที่ผมเข้าใจ LLM มีปัญหาใหญ่สามอย่าง:
แนวทางของคุณเข้าใจง่ายกว่ามาก ผมสงสัยว่าทำไมถึงไม่ยกตัวอย่าง embedding ของคุณลักษณะแบบ categorical/scalar
เป็นบทความที่ให้ความรู้มากและวางโครงสร้างได้ดีมาก ขอบคุณผู้เขียน
embedding ของ LLM มักเป็นส่วนหนึ่งของเลเยอร์อินพุต และต่างจากโมเดลที่พรีเทรนมาก่อนอย่าง Word2Vec ตรงที่มันถูกอัปเดตระหว่างการฝึก
อีกข้อที่ผมสงสัยคือ ในช่วง inference embedding เป็น lookup table แบบ “token ID -> vector”
ถ้ามองในทางคณิตศาสตร์ มันคือการเข้ารหัส token ID เป็น one-hot vector ยาว ๆ แล้วส่งผ่าน linear layer เพื่อให้ได้ embedding vector
ผมสงสัยว่าโครงสร้างนี้ใช้กับการฝึก embedding ด้วยเหมือนกันหรือไม่ กล่าวคือมอง embedding เป็น linear layer แล้วฝึกด้วย backpropagation ใช่ไหม
embedding ก็รวมอยู่ในกระบวนการ backpropagation ตามปกติ เพียงแต่ด้วยเหตุผลด้านประสิทธิภาพจึงไม่ได้ใช้ one-hot encoding จริง ๆ
มีการทำให้การ indexing ดิฟฯ ได้เพื่อให้ gradient ไหลไปเฉพาะเวกเตอร์ที่ถูกเลือก
ถ้าอยากดูตัวอย่างแบบเป็นรูปธรรม โค้ดไลบรารี deep learning ขนาดเล็กที่ผมทำชื่อ SmallPebble source น่าจะช่วยได้
ขอขยายจากคอมเมนต์อีกอันเล็กน้อย
การ indexing กับการคูณ one-hot vector นั้นเทียบเท่ากันในเชิงคณิตศาสตร์
เช่น ถ้ามี vocab จำนวน N คำ และความยาวซีเควนซ์ L ก็จะต้องเอา sparse matrix ขนาด NxL ไปคูณกับ embedding matrix
แต่ในทางปฏิบัติ เรารู้แค่อินเด็กซ์หนึ่งตัวต่อหนึ่งคอลัมน์ก็พอ จึงแทนภายในด้วยตัวเลขตัวเดียว (index)
ด้วยวิธีนี้ ทั้ง forward pass และ backpropagation จึงถูกเขียนแยกต่างหากโดยอิงตามการ indexing
เพื่อให้ gradient ไหลไปยัง embedding vector ที่ถูกเลือกได้