1. Tokenizing

Токенізація

Токенізація — це процес розбиття даних, таких як текст, на менші, керовані частини, звані токенами. Кожному токену присвоюється унікальний числовий ідентифікатор (ID). Це основний крок у підготовці тексту для обробки моделями машинного навчання, особливо в обробці природної мови (NLP).

Мета цього початкового етапу дуже проста: Розділіть вхідні дані на токени (id) таким чином, щоб це мало сенс.

Як працює токенізація

  1. Розбиття тексту:

  • Базовий токенізатор: Простий токенізатор може розбити текст на окремі слова та знаки пунктуації, видаляючи пробіли.

  • Приклад: Текст: "Привіт, світе!" Токени: ["Привіт", ",", "світе", "!"]

  1. Створення словника:

  • Щоб перетворити токени на числові ID, створюється словник. Цей словник містить усі унікальні токени (слова та символи) і присвоює кожному конкретний ID.

  • Спеціальні токени: Це спеціальні символи, додані до словника для обробки різних сценаріїв:

  • [BOS] (Початок послідовності): Вказує на початок тексту.

  • [EOS] (Кінець послідовності): Вказує на кінець тексту.

  • [PAD] (Доповнення): Використовується для того, щоб усі послідовності в партії мали однакову довжину.

  • [UNK] (Невідомий): Представляє токени, які не входять до словника.

  • Приклад: Якщо "Привіт" отримує ID 64, ","455, "світе"78, а "!"467, тоді: "Привіт, світе!"[64, 455, 78, 467]

  • Обробка невідомих слів: Якщо слово, наприклад, "Бувай", не входить до словника, його замінюють на [UNK]. "Бувай, світе!"["[UNK]", ",", "світе", "!"][987, 455, 78, 467] &#xNAN;(Припускаючи, що [UNK] має ID 987)

Розширені методи токенізації

Хоча базовий токенізатор добре працює для простих текстів, він має обмеження, особливо з великими словниками та обробкою нових або рідкісних слів. Розширені методи токенізації вирішують ці проблеми, розбиваючи текст на менші підодиниці або оптимізуючи процес токенізації.

  1. Кодування пар байтів (BPE):

  • Мета: Зменшує розмір словника та обробляє рідкісні або невідомі слова, розбиваючи їх на часто вживані пари байтів.

  • Як це працює:

  • Починає з окремих символів як токенів.

  • Ітеративно об'єднує найбільш часті пари токенів в один токен.

  • Продовжує, поки не залишиться жодної частої пари, яку можна об'єднати.

  • Переваги:

  • Вилучає необхідність у токені [UNK], оскільки всі слова можуть бути представлені шляхом об'єднання існуючих підсловникових токенів.

  • Більш ефективний і гнучкий словник.

  • Приклад: "граючи" може бути токенізовано як ["грати", "ючи"], якщо "грати" та "ючи" є частими підсловами.

  1. WordPiece:

  • Використовується: Моделями, такими як BERT.

  • Мета: Подібно до BPE, розбиває слова на підсловникові одиниці для обробки невідомих слів і зменшення розміру словника.

  • Як це працює:

  • Починає з базового словника окремих символів.

  • Ітеративно додає найбільш часте підслово, яке максимізує ймовірність навчальних даних.

  • Використовує ймовірнісну модель для визначення, які підслова об'єднувати.

  • Переваги:

  • Балансує між наявністю керованого розміру словника та ефективним представленням слів.

  • Ефективно обробляє рідкісні та складні слова.

  • Приклад: "незадоволеність" може бути токенізовано як ["незадоволення", "ість"] або ["незадоволення", "н", "ість"] залежно від словника.

  1. Модель мови Unigram:

  • Використовується: Моделями, такими як SentencePiece.

  • Мета: Використовує ймовірнісну модель для визначення найбільш ймовірного набору підсловникових токенів.

  • Як це працює:

  • Починає з великого набору потенційних токенів.

  • Ітеративно видаляє токени, які найменше покращують ймовірність моделі навчальних даних.

  • Завершує словник, де кожне слово представлено найбільш ймовірними підсловниковими одиницями.

  • Переваги:

  • Гнучка і може моделювати мову більш природно.

  • Часто призводить до більш ефективних і компактних токенізацій.

  • Приклад: "міжнародна діяльність" може бути токенізовано на менші, значущі підслова, такі як ["міжнародна", "діяльність"].

Приклад коду

Давайте зрозуміємо це краще з прикладу коду з https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb:

# Download a text to pre-train the model
import urllib.request
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
file_path = "the-verdict.txt"
urllib.request.urlretrieve(url, file_path)

with open("the-verdict.txt", "r", encoding="utf-8") as f:
raw_text = f.read()

# Tokenize the code using GPT2 tokenizer version
import tiktoken
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"

# Print first 50 tokens
print(token_ids[:50])
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]

References

Last updated