Tokenization: คลังคำ, one-hot และ byte pair encoding ใน Python
โครงข่ายประสาทเทียมเข้าใจแต่ตัวเลข ข้อความจึงถูกตัดเป็น token ก่อน และแต่ละ token จะได้ id โมเดลภาษาอย่าง GPT ใช้ byte pair encoding ซึ่งสร้าง token จากชิ้นส่วนของคำที่พบบ่อย
แนวคิดแบบเข้าใจง่าย
โครงข่ายประสาทเทียมเข้าใจแต่ตัวเลข ข้อความจึงถูกตัดเป็น token ก่อน และแต่ละ token จะได้ id โมเดลภาษาอย่าง GPT ใช้ byte pair encoding ซึ่งสร้าง token จากชิ้นส่วนของคำที่พบบ่อย
แปลงข้อความเป็นตัวเลขแบบที่โมเดลภาษาทำ: สร้างคลังคำ เข้ารหัสคำแบบ one-hot และเรียนรู้ token ย่อยด้วย BPE
ประเด็นสำคัญ
- token คือหน่วยของข้อความ เช่น คำ ส่วนของคำ หรือตัวอักษร
- เวกเตอร์ one-hot เข้าใจง่าย แต่จะยาวมากเมื่อคลังคำใหญ่
- BPE รับมือกับคำหายากและคำใหม่โดยแยกเป็นชิ้นส่วนที่รู้จัก
- จากนั้นโมเดลจะแปลง id ของแต่ละ token เป็นเวกเตอร์ที่เรียนรู้มา เรียกว่า embedding
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
พิมพ์ประโยคของคุณเองเพื่อสร้างคลังคำ แล้วกด ทีละขั้น เพื่อดู byte pair encoding รวมคู่ที่พบบ่อยที่สุด
โค้ดตัวอย่าง
from collections import Counter
text = "the cat sat on the mat"
# 1. Build a vocabulary: every distinct word gets an id.
words = text.split()
vocab = {word: i for i, word in enumerate(sorted(set(words)))}
print("vocab:", vocab)
print("ids:", [vocab[w] for w in words])
# 2. One-hot encoding: a vector with a single 1 at the word's id.
def one_hot(word):
return [1 if vocab[word] == i else 0 for i in range(len(vocab))]
print("one-hot 'cat':", one_hot("cat"))
# 3. Byte pair encoding: repeatedly merge the most frequent pair of symbols.
tokens = list("banana")
for _ in range(2):
pairs = Counter(zip(tokens, tokens[1:]))
best = max(pairs, key=pairs.get)
merged, i = [], 0
while i < len(tokens):
if i + 1 < len(tokens) and (tokens[i], tokens[i + 1]) == best:
merged.append(tokens[i] + tokens[i + 1])
i += 2
else:
merged.append(tokens[i])
i += 1
tokens = merged
print("merge", best, "->", tokens)
ผลลัพธ์ที่คาดหวัง
vocab: {'cat': 0, 'mat': 1, 'on': 2, 'sat': 3, 'the': 4}
ids: [4, 0, 3, 2, 4, 1]
one-hot 'cat': [1, 0, 0, 0, 0]
merge ('a', 'n') -> ['b', 'an', 'an', 'a']
merge ('b', 'an') -> ['ban', 'an', 'a']
หลักการทำงาน
คลังคำจับคู่คำที่ไม่ซ้ำกันแต่ละคำกับ id แล้วประโยคก็กลายเป็นรายการ id เวกเตอร์ one-hot มีเลข 1 เฉพาะตำแหน่ง id ของคำ ส่วน BPE นับคู่สัญลักษณ์ที่อยู่ติดกันแล้วรวมคู่ที่พบบ่อยที่สุด เริ่มจาก ('a', 'n') แล้วตามด้วย ('b', 'an')
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- ตัวตัดคำและคลังคำศัพท์ แยกข้อความเป็นคำตัวพิมพ์เล็กและสร้างคลังคำศัพท์ที่เรียงตามความถี่ ซึ่งเป็นขั้นแรกของโมเดลภาษาทุกตัว ง่าย
- การเข้ารหัสแบบ one-hot แปลงหมวดหมู่เป็นเวกเตอร์ที่มีเลข 1 เพียงตัวเดียว ซึ่งเป็นรูปแบบอินพุตของตัวจำแนกและ embedding ง่าย
- การรวมแบบ Byte Pair Encoding (BPE) เรียนรู้การรวม subword แบบเดียวกับ tokenizer ของ GPT: รวมคู่สัญลักษณ์ข้างเคียงที่พบบ่อยที่สุดซ้ำ ๆ ปานกลาง