แนวคิด AI ด้วย Python

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 รวมคู่ที่พบบ่อยที่สุด

โค้ดตัวอย่าง

รันโค้ด →
main.py
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 และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น

  1. เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
  2. พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
  3. แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
รันใน Python IDE →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด