แปลงข้อมูลจาก Text ไปเป็น Vector ด้วย Sentence Embedding

Mr.P L
mmp-li
Published in
2 min readFeb 2, 2024

ใดๆบนโลก ล้วนแก้ได้ด้วย embedding

ในปี 2023 หลายๆคนคงรู้จักกับ keyword พวกนี้ในฝั่ง NLP เช่น LLM (large language model), RAG (retrieve augmented generation), GPT (Generative Pre-trained Transformer), and Transformer. คำเหล่านี้ถูกใช้เป็นอย่างมาในช่วง 2022 ซึ่งเป็นเพราะการมาถึงข้อ “ChatGPT” ผู้คนทั้งหลายหันไปทดสอบ ลองเล่น กับโมเดล generative เป็นจำนวนมาก อีกทั้งยังมี “ChatGPT Clone” เกิดขึ้นมาเป็นจำนวนมากในปี 2022–23 เช่น OpenThaiGPT, WangChanGLM, หรือ Typhoon แต่ทว่าในกระแสเหล่านี้ กลับมีงานอีกประเภทหนึ่งที่อยู่เบื้องหลังงานเหล่านี้ แต่คนกลับลืมไปแล้ว (ไม่ได้ลืมหรอก แค่รู้สึกว่าไม่ได้น่าตื่นเต้นแบบ GPT) แต่ก็มักจะต้องใช้งานเสมอ ของเหล่านั้นคือ “Text Embedding”

The overview of representation in NLP

ปกติแล้วคอมพิวเตอร์ของเราเนี่ย ไม่สามารถรับ Text ที่เป็นตัวหนังสือเข้าไปตรงๆในโมเดลได้ เราต้องแปลงตัวหนังสือ หรือ ตัวอักษร เป็นตัวเลขอะไรสักอย่าง แล้วค่อยให้คอมพิวเตอร์ทำการแปลงข้อมูลเหล่านั้นเป็นการเข้ารหัสอะไรสักอย่าง (encoding) ที่เราสามารถเอามาตีความได้ เช่น การแปลงคำเป็น vector (word embedding)

ในบทความนี้เราไม่ได้มาสอนวิธีการเทรนโมเดลแต่อย่างใด แต่มาสอนวิธีการแปลงข้อความเป็น Text embedding เพื่อเอาไปใช้กับ LLM (search หาข้อมูลสำหรับ In-context learning) หรือ RAG (“R” = retrieval ซึ่งต้องใช้ embedding) โดยปัจจุบันการแปลงข้อความมีอยู่สองแบบหลักๆ

  1. Bag-of-Word: เอาข้อความมา map ใน hash table (อ่านบทความในอดีตของผมได้)

2. การทำ Embedding: แทนที่จะ map ตรงๆ เราก็เอาคอมพิวเตอร์มาเข้ารหัสข้อมูลแทน

แบบแรกปัญหามันชัดเจนมาก ถ้าคำไม่ได้อยู่ใน hash table ก็ไม่สามารถ encode ได้ ส่วนแบบสองคือต้องใช้ computational (CPU or GPU) ตั้งแต่การเทรนยันการใช้งาน แต่อย่างที่บอก วันนี้ไม่ได้จะมานำเสนอวิธีการเทรน (แต่ก็มีบอกใบ้) แต่จะมาเสนอวิธีการใช้งานของที่มีอยู่แล้ว

ในปี 2021–22 ผมสร้าง Repo ใน github ที่ชื่อว่า Thai sentence vector benchmark ขึ้นมา

จุดประสงค์คือเราอยากจะสร้าง benchmark ที่ใช้สำหรับ Train + Test text embedding ภาษาไทย!

ภายใน Repo ประกอบไปด้วย

  1. วิธีการเทรนโมเดล text embedding ในแบบฉบับไม่พึ่ง supervised data (https://github.com/mrpeerat/Thai-Sentence-Vector-Benchmark?tab=readme-ov-file#how-do-we-train-unsupervised-sentence-representation)

ถ้าคุณอยากเทรนโมเดลเป็นของตัวเอง สามารถกด train ได้เลย โดยความเท่คือเราสามารถเทรนบน colab ได้ภายในไม่กี่ชั่วโมง (บนดาต้า 1 ล้านข้อความ) แถมไม่ต้องใช้ label ดาต้า ขอแค่คุณมี raw text ที่ทำความสะอาดมาแล้ว ก็สามารถใช้ได้เลย

2. วิธีการทดสอบ text embedding ใน task ต่างๆเช่น Text embedding, Text pair classification, และ retrieval (https://github.com/mrpeerat/Thai-Sentence-Vector-Benchmark?tab=readme-ov-file#thai-semantic-textual-similarity-benchmark)

อย่าลืมว่าคุณต้องมี benchmark หรือว่าชุด test set ที่จะมาทดสอบโมเดลคุณด้วย ถ้าคุณทำโมเดลขึ้นมาแล้วไม่มีการทดสอบ คุณก็ไม่สามารถบอกได้ว่าโมเดลของคุณมันดีกว่าของคนอื่นอย่างไร

สรุปผลการทดลองแล้วเปรียบเทียบโมเดล

ใน repro เราทดลองกับ 3 models ได้แก่

  1. โมเดลที่คนอื่นเทรนมาแล้วแบบ multilingual ใช้ดาต้าจำนวนมหาศาล
  2. โมเดลที่เราเทรนเอง ใช้ดาต้าแค่ 1 ล้านบน raw text ไม่มี label อะไรเลย
  3. API จาก Cohere (เสียเงิน)

สิ่งที่เราพบได้แก่

  1. โมเดลที่ชาวบ้านเขาปล่อยให้ใช้ (https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2) มีคุณภาพที่ดีเลย แต่ต้องแลกมากับ parameters จำนวนมาก (ใช้ GPU’s ram เยอะในการรัน) แต่ข้อถัดไปจะทำให้เราคิดว่าโมเดลนี้ไม่ได้ดีอะไรเลย
  2. โมเดลที่เราเทรนเอง ดีกว่าโมเดลชาวบ้าน ทั้งในแง่ของ 1) speed 2) price 3) performance ถ้าคุณบรรลุทั้งสามข้อนี้เวลานำเสนอโมเดลให้กับหัวหน้าทีมของคุณ หัวของคุณก็ไม่มีทางปฏิเสธแน่นอน
  3. อย่าใช้ API! เรื่องตลกที่เราเจอคือ API ที่ให้เราได้ทดลองใช้อย่าง multilingual Cohere-V2 มี performance ที่ไม่ค่อยดีบนทุก task ยกเว้น “Retrieval” ซึ่งเหตุผลมันคือ “task retrieval มี training data ซึ่งอาจจะถูกใส่ใน API model เรียบร้อยแล้ว” แต่โมเดลของเราไม่ได้ใส่ เลยแพ้ API ไป

โดยภาพรวมจะพบว่าต่อให้เราเทรนโมเดลแบบไม่มีดาต้ามหาศาล, ไม่มีโมเดลใหญ่, ไม่มีคอมแรงๆก็สามารถสร้าง embedding ให้ดีเทียบเท่ากับโมเดลเหล่านั้นได้ ในอนาคตกำลังจะมีแผนคิดว่าจะ extend benchmark ของเราให้ใหญ่กว่าเดิม (ซึ่งมีคนทำแบบเราในเวอร์ชั่น Indo เรียบร้อยแล้ว: https://github.com/LazarusNLP/indonesian-sentence-embeddings)

สรุป

ถ้าคุณกำลังมองหา text embedding ทั้งโมเดล, training code, และ benchmark ขอเรียนเชิญที่ Thai sentence vector benchmark ครับ

By

Mr.Peerat Limkonchotiwat, Ph.D. student, VISTEC, Thailand

Web: https://mrpeerat.github.io/

--

--

Mr.P L
mmp-li
Editor for

Lifestyle of Programmer & IoT (Node-RED|Blynk) & Data Science (ML,DL,NLP) and Whatever I want to do | cat can coding too | Ph.D. -> VISTEC -> IST