Токенизация: словарь, one-hot и byte pair encoding на Python
Нейросети понимают только числа, поэтому текст сначала делят на токены, и каждый токен получает id. Языковые модели вроде GPT используют byte pair encoding, который строит токены из частых кусочков слов.
Суть простыми словами
Нейросети понимают только числа, поэтому текст сначала делят на токены, и каждый токен получает id. Языковые модели вроде GPT используют byte pair encoding, который строит токены из частых кусочков слов.
Превратите текст в числа, как это делают языковые модели: постройте словарь, закодируйте слова в one-hot и выучите подслова с помощью BPE.
Главные идеи
- Токен - это единица текста, например слово, часть слова или символ.
- One-hot векторы просты, но становятся очень длинными при большом словаре.
- BPE справляется с редкими и новыми словами, разбивая их на известные части.
- Затем модели переводят каждый id токена в обученный вектор, который называется эмбеддингом.
Когда это использовать?
- Понять, что происходит внутри нейронных сетей и библиотек ИИ.
- Разобраться в идее до того, как реализовать её в соответствующих задачах.
- Подготовиться к курсам по машинному обучению, собеседованиям и проектам.
Посмотрите в действии
Введите своё предложение, чтобы построить словарь, а затем нажмите Шаг и посмотрите, как 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.
Практические задания
Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.
- Измените входные данные или веса и предскажите результат до запуска.
- Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
- Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Токенизатор слов и словарь Разбейте текст на слова в нижнем регистре и постройте словарь, отсортированный по частоте, — первый шаг любой языковой модели. Легко
- One-hot кодирование Превратите категории в векторы с единственной 1 — формат входных данных для классификаторов и эмбеддингов. Легко
- Слияния Byte Pair Encoding (BPE) Выучите слияния подслов, как токенизаторы GPT: многократно объединяйте самую частую пару соседних символов. Средне