Концепции ИИ на Python

Токенизация: словарь, 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 объединяет самую частую пару.

Пример кода

Запустить код →
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.

Практические задания

Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.

  1. Измените входные данные или веса и предскажите результат до запуска.
  2. Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
  3. Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Запустить в Python IDE →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи