Transformers documentation

Thuật toán phân tách token

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Thuật toán phân tách token

Transformers hỗ trợ ba thuật toán phân tách từ con (subword tokenization): Byte pair encoding (BPE), Unigram và WordPiece. Chúng chia văn bản thành các đơn vị nằm giữa từ và ký tự, giúp giữ từ điển gọn gàng trong khi vẫn nắm bắt được các phần có ý nghĩa. Các từ phổ biến được giữ nguyên vẹn dưới dạng một token duy nhất, còn các từ hiếm hoặc không xác định sẽ được phân rã thành các từ con.

Ví dụ, annoyingly có thể được tách thành ["annoying", "ly"] hoặc ["annoy", "ing", "ly"] tùy thuộc vào từ vựng. Việc tách subword cho phép mô hình biểu diễn các từ chưa từng gặp từ các subword đã biết.

Phân tách token con (subword tokenization) đặc biệt hữu ích cho các ngôn ngữ như tiếng Thổ Nhĩ Kỳ, nơi bạn có thể tạo ra những từ dài và phức tạp bằng cách ghép các subword lại với nhau.

Mã hóa cặp byte (BPE)

Mã hóa cặp byte (BPE) là thuật toán phân tách token phổ biến nhất trong Transformers, được sử dụng bởi các mô hình như Llama, Gemma, Qwen2 và nhiều mô hình khác.

  1. Pre-tokenizer chia nhỏ văn bản theo khoảng trắng hoặc các quy tắc khác, tạo ra một tập hợp các từ duy nhất cùng tần suất xuất hiện của chúng.
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
  1. Thuật toán BPE tạo ra một từ vựng cơ bản, ["b", "g", "h", "n", "p", "s", "u"], từ tất cả các ký tự.
("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5)
  1. BPE bắt đầu với các ký tự riêng lẻ và lặp lại việc gộp cặp kề nhau xuất hiện thường xuyên nhất. "u" và "g" xuất hiện cùng nhau nhiều nhất trong "hug", "pug" và "hugs", do đó BPE gộp chúng thành "ug" và thêm vào từ vựng.
("h" "ug", 10), ("p" "ug", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "ug" "s", 5)
  1. Cặp phổ biến tiếp theo là "u" và "n", xuất hiện trong "pun" và "bun", do đó chúng được gộp thành "un".
("h" "ug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("h" "ug" "s", 5)
  1. Từ vựng hiện là ["b", "g", "h", "n", "p", "s", "u", "ug", "un"]. BPE tiếp tục học các quy tắc gộp cho đến khi đạt kích thước từ vựng mục tiêu, bằng kích thước từ vựng cơ sở cộng với số lần gộp. GPT sử dụng BPE với kích thước từ vựng là 40.478 (478 token cơ sở + 40.000 lần gộp).

Bất kỳ ký tự nào không có trong bảng từ vựng cơ bản sẽ được ánh xạ đến một token không xác định như "<unk>". Trên thực tế, bảng từ vựng cơ bản bao phủ tất cả các ký tự đã được quan sát trong quá trình huấn luyện, do đó các token không xác định rất hiếm gặp.

BPE ở cấp độ byte

Việc bao gồm tất cả các ký tự Unicode sẽ khiến bảng từ vựng cơ bản trở nên cực kỳ lớn. Byte-level BPE sử dụng 256 giá trị byte làm bảng từ vựng cơ bản thay thế, đảm bảo mọi từ đều có thể được tách token mà không cần token "<unk>". GPT-2 sử dụng byte-level BPE với kích thước bảng từ vựng là 50,257 (256 token byte + 50,000 lần gộp + token đặc biệt end-of-text).

Unigram

Unigram là thuật toán phân tách token phổ biến thứ hai trong Transformers, được sử dụng bởi các mô hình như T5, BigBird, Pegasus và nhiều mô hình khác.

  1. Unigram bắt đầu với một tập hợp lớn các từ con ứng viên, và mỗi ứng viên được gán một điểm xác suất dựa trên tần suất xuất hiện của nó.
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
["b", "g", "h", "n", "p", "s", "u", "hu", "ug", "un", "pu", "bu", "gs", "hug", "pug", "pun", "bun", "ugs", "hugs"]
  1. Unigram đánh giá mức độ hiệu quả của việc từ điển hiện tại phân tách dữ liệu huấn luyện ở mỗi bước.

  2. Với mỗi token, Unigram đo lường mức độ mà việc loại bỏ token đó sẽ làm tăng tổng tổn thất. Ví dụ, việc loại bỏ "pu" hầu như không ảnh hưởng đến tổn thất vì "pug" và "pun" vẫn có thể được tách token thành ["p", "ug"] và ["p", "un"].

    Nhưng việc xóa "ug" sẽ làm tăng đáng kể độ mất mát vì "hug", "pug" và "hugs" đều phụ thuộc vào nó.

  3. Unigram loại bỏ các token có mức tăng loss thấp nhất, thường là 10-20% dưới cùng. Các ký tự cơ bản luôn được giữ lại để bất kỳ từ nào cũng có thể được tách token. Các token như "bu", "pu", "gs", "pug" và "bun" bị loại bỏ vì chúng đóng góp ít nhất cho khả năng tổng thể.

["b", "g", "h", "n", "p", "s", "u", "hu", "ug", "un", "hug", "pun", "ugs", "hugs"]
  1. Các bước 2-4 được lặp lại cho đến khi bảng từ vựng đạt đến kích thước mục tiêu.

Trong quá trình suy luận, Unigram có thể tách một từ thành nhiều cách khác nhau. "hugs" có thể trở thành ["hug", "s"], ["h", "ug", "s"], hoặc ["h", "u", "g", "s"]. Unigram chọn cách tách token có xác suất cao nhất. Khác với BPE, vốn mang tính tất định và dựa trên các quy tắc gộp, Unigram mang tính xác suất và có thể lấy mẫu các cách tách token khác nhau trong quá trình huấn luyện.

SentencePiece

SentencePiece là thư viện phân tách token áp dụng BPE hoặc Unigram trực tiếp lên văn bản thô. BPE và Unigram chuẩn giả định rằng khoảng trắng phân tách các từ, điều này không hoạt động với các ngôn ngữ như tiếng Trung và tiếng Nhật vốn không sử dụng khoảng trắng.

  1. SentencePiece coi văn bản đầu vào như một luồng byte hoặc ký tự thô và bao gồm ký tự khoảng trắng, được biểu diễn dưới dạng "▁", trong từ vựng.
("▁hug", 10), ("▁pug", 5), ("▁pun", 12), ("▁bun", 4), ("▁hugs", 5)
  1. Sau đó, SentencePiece áp dụng BPE hoặc Unigram lên văn bản.

Khi giải mã, SentencePiece nối tất cả các token lại với nhau và thay thế "▁" bằng một khoảng trắng.

WordPiece

WordPiece là thuật toán phân tách token cho các mô hình thuộc họ BERT như DistilBERT và Electra.

Tương tự như BPE và gộp các cặp từ dưới lên theo từng bước lặp, nhưng khác ở cách chọn các cặp.

("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5)

WordPiece gộp các cặp làm tối đa hóa khả năng xảy ra của dữ liệu huấn luyện.

score("u", "g") = frequency("ug") / (frequency("u") × frequency("g"))
cặpfrequencyscore
"u" + "g"2020 / (36 × 20) = 0.028
"u" + "n"1616 / (36 × 16) = 0.028
"h" + "u"1515 / (15 × 36) = 0.028
"g" + "s"55 / (20 × 5) = 0.050

Điểm số ưu tiên việc gộp "g" và "s" khi token kết hợp xuất hiện thường xuyên hơn so với dự đoán từ tần suất của từng token riêng lẻ. BPE đơn giản là gộp cặp xuất hiện nhiều nhất. WordPiece đo lường mức độ thông tin của mỗi lần gộp. Hai token xuất hiện cùng nhau thường xuyên hơn nhiều so với dự đoán ngẫu nhiên sẽ được gộp trước.

Phân tách token theo từ

Token hóa theo từ chia văn bản thành các token dựa trên khoảng trắng, dấu câu hoặc các quy tắc đặc thù của ngôn ngữ.

["Do", "n't", "you", "love", "🤗", "Transformers", "?", "We", "sure", "do", "."]

Kích thước từ vựng trở nên cực kỳ lớn vì mỗi từ duy nhất đều cần một token riêng, bao gồm tất cả các biến thể ("love", "loving", "loved", "lovingly"). Ma trận nhúng (embedding) kết quả là khổng lồ, làm tăng bộ nhớ và sức mạnh tính toán. Các từ không có trong từ vựng sẽ được ánh xạ đến token "<unk>", do đó mô hình không thể xử lý các từ mới.

Phân tách token theo ký tự

Phân tách token theo ký tự chia văn bản thành các ký tự riêng lẻ.

["D", "o", "n", "'", "t", "y", "o", "u", "l", "o", "v", "e"]

Bộ từ vựng nhỏ và mọi từ đều có thể được biểu diễn, nên không có vấn đề "<unk>". Nhưng các chuỗi trở nên dài hơn nhiều. Một ký tự như "l" mang ít ý nghĩa hơn nhiều so với "love", nên hiệu suất bị giảm.

Tài nguyên

  • Chương 6 của khóa học LLM hướng dẫn bạn cách huấn luyện một tokenizer từ đầu và giải thích sự khác biệt giữa các thuật toán BPE, Unigram và WordPiece.
Update on GitHub