Визуальное руководство по LLM, часть 1: входной pipeline

Первая часть визуального руководства по архитектуре LLM: tokenization, token IDs, token embeddings, positional embeddings и полный путь от текста к входным векторам модели.

Визуальное руководство по LLM, часть 1: входной pipeline

Оригинал опубликован Rohit Kumar Tiwari в X.

В этой серии из двух частей мы шаг за шагом разберём ключевые компоненты архитектуры больших языковых моделей (LLM), чтобы сделать их понятными даже для тех, кто только начинает знакомиться с ИИ.

План серии

Часть 1 показывает, как письменный язык разбивается на токены, а затем превращается во входные embedding-векторы, с которыми может работать модель. В ней объясняются tokenization, token embeddings и positional embeddings.

Часть 2 показывает, как эти входные embedding-векторы проходят через transformer block и превращаются в выход модели. В ней рассматриваются self-attention, multi-head attention, feedforward neural networks, выбор следующего токена и то, как обучение постепенно улучшает модель.

Сначала посмотрим на архитектуру LLM вроде Generative Pretrained Transformer (GPT) с высоты птичьего полёта.

LLM работают, предсказывая по одному слову или токену за раз. Они генерируют текст итеративно: каждый предсказанный токен добавляется к предыдущему входу и становится частью контекста для следующего предсказания.

Пример: «Every moment is a beginning»

Архитектуру LLM можно грубо разделить на три части:

  1. Input Pipeline
  2. Transformer Block
  3. Output Pipeline

В первой части глубже разберём именно input pipeline.

Фундаментальная проблема: машины не говорят на человеческом языке

Представьте, что вы пытаетесь научить ребёнка новому языку. Вы можете показывать предметы, произносить звуки и использовать жесты. Но машина не имеет глаз и ушей в человеческом смысле. Она понимает только числа. Поэтому первая большая задача любой LLM — перевести человеческий язык, предложения и абзацы, в числовой формат.

Этот перевод происходит в два основных шага: Tokenization и Embedding.

Шаг 1: Tokenization — разбиваем язык на части

Tokenization — это процесс разбиения текста на меньшие единицы, которые называются tokens. Эти tokens — базовые строительные блоки, с которыми работает LLM.

Алгоритмы tokenization можно разделить на три основные категории.

1. Word-based tokenization

Самый простой подход. Текст делится по пробелам и пунктуации.

Пример: «Every moment is a beginning»

Tokens: [“Every,”, “moment”, “is”, “a”, “beginning”]

2. Subword-based tokenization

Вместо того чтобы делить текст только по пробелам, tokenizer учит частые фрагменты слов из данных.

Пример: «Every moment is a beginning»

Tokens: [“Every,”, “mo”, “ment”, “is”, “a”, “begin”, “ning”]

3. Character-based tokenization

В character-based tokenization каждый символ становится отдельным token.

Пример: «Every moment is a beginning»

Tokens: [“E”, “v”, “e”, “r”, “y,”, “m”, “o”, …, “n”, “i”, “n”, “g”]

Почему subwords?

Subword-based методы находятся между word-based и character-based подходами. Большинство современных LLM используют именно subword-based tokenization.

Можно спросить: почему бы не использовать целые слова? Главная причина — неизвестные слова. Что, если вы введёте слово, которое LLM никогда раньше не видела? Если модель знает только целые слова, она застрянет. Subwords решают эту проблему: разбивая слова на распространённые prefixes, suffixes и roots, модель может понимать новые или сложные слова, собирая их из знакомых частей. Например, “unbelievable” может быть разбито на “un”, “believe”, “able”.

Один популярный алгоритм для subword tokenization называется Byte Pair Encoding (BPE). Он находит самые частые пары символов или subwords и объединяет их в новые, более длинные subwords, пока не будет достигнут заданный размер словаря.

Простой пример tokenization:

Input Sentence: «Every moment is a beginning»

Tokens: [“Every”, “moment”, “is”, “a”, “beginning”]

После tokenization каждому уникальному token назначается уникальный числовой ID.

Так последовательность tokens превращается в последовательность чисел:

[“Every”, “moment”, “is”, “a”, “beginning”] → [15745, 4205, 382, 261, 10526]

Если хотите попробовать tokenizer самостоятельно, можно использовать инструмент tiktokenizer.

В зависимости от LLM могут добавляться специальные tokens. В примере выше это |im_start|, |im_sep| и |im_end|. Они помогают модели понимать, где начинается сообщение, где разделяются его части и где сообщение заканчивается.

Шаг 2: Embeddings — придаём числам смысл

Теперь у нас есть список чисел, но сами по себе эти числа не несут смысла. ID “15745” для слова “Every” не говорит машине, что “Every” — это determiner, который описывает noun. Здесь помогают embeddings.

Embeddings — это числовые представления, или vectors, для tokens. Можно думать о них как о подробном «профиле» каждого token, который отражает его значение и связь с другими tokens.

Представьте простой опросник для каждого token с сотнями вопросов:

  • «Ты noun?» — Yes/No
  • «Ты обычно связан с позитивными или негативными эмоциями?» — Positive/Negative/Neutral
  • «Ты указываешь на person, place или thing?»
  • «Насколько ты formal?» — Formal/Informal

Embedding LLM для token отвечает не на несколько, а на сотни таких неявных вопросов, создавая длинный список чисел — vector, который описывает характеристики token. Например, в GPT-3 размер embedding составляет 12 288 dimensions.

Почему embeddings так сильны:

  1. Semantic similarity. Tokens с похожими значениями имеют похожие embedding vectors. “King” и “Queen” будут численно близки.
  2. Contextual relationships. Embedding может отражать отношения. Если вычесть embedding “Man” из “King” и добавить “Woman”, часто получится vector, очень близкий к embedding “Queen”.

Positional Embeddings: почему порядок tokens важен

Представьте два предложения:

  1. The dog jumps on the cat.
  2. The cat jumps on the dog.

Слова одинаковые, но смысл полностью разный, потому что позиции слов различаются. Сами по себе numerical token IDs и token embeddings ничего не говорят LLM о порядке слов.

Эту задачу решают Positional Embeddings.

Positional embeddings — это ещё один список чисел, vector, который добавляется к token embeddings. Эти числа специально устроены так, чтобы сообщать LLM абсолютную или относительную позицию каждого token во входной последовательности.

Можно представить это как уникальный «номер места» для каждого token. Поэтому “The” в начале предложения получает другой positional embedding, чем “the” в середине, даже если их token embeddings одинаковы.

Полный input pipeline

Input Sentence: «Every moment is a beginning»

Process:

  1. Tokenization: [“Every”, “moment”, “is”, “a”, “beginning”]
  2. Token IDs: {”Every”: 15745, “moment”: 4205, “is”: 382, “a”: 261, “beginning”: 10526}
  3. Token Embeddings (output dimension = 3):
“15745”: [-0.5880, 0.3486, 0.6603]
“4205”: [-0.2196, -0.3792, 0.7671]
“382”: [-1.1925, 0.6984, -1.4097]
“261”: [0.1794, 1.8951, 1.3689]
“10526”: [-1.6033, -1.3250, 0.1784]
  1. Positional Embeddings (output dimension = 3):
Position 1: [-0.9178, 0.9045, -2.0975]
Position 2: [1.1558, -1.2157, 0.1295]
Position 3: [1.0937, 0.2066, 3.1815]
Position 4: [0.0967, 1.4086, 0.1915]
Position 5: [-0.1562, 0.2446, 4.0124]
  1. Final Input Vector — сумма embeddings и positional embeddings:
“15745” (position 1): [-0.5880, 0.3486, 0.6603] + [-0.9178, 0.9045, -2.0975]
“4205” (position 2): [-0.2196, -0.3792, 0.7671] + [1.1558, -1.2157, 0.1295]
“382” (position 3): [-1.1925, 0.6984, -1.4097] + [1.0937, 0.2066, 3.1815]
“261” (position 4): [0.1794, 1.8951, 1.3689] + [0.0967, 1.4086, 0.1915]
“10526” (position 5): [-1.6033, -1.3250, 0.1784] + [-0.1562, 0.2446, 4.0124]

Каждый итоговый input vector теперь имеет уникальную числовую подпись, которая кодирует и смысл token, и его позицию в предложении.

Что дальше?

Теперь, когда мы понимаем, как LLM «проглатывает» ваши слова, можно переходить ко второй части: A Visual Guide to LLMs (Part 2): Inside the Transformer Architecture. В ней открывается transformer block и разбираются self-attention и multi-head attention — механизмы, которые позволяют LLM понимать контекст, генерировать связный текст и выполнять сложные рассуждения.

GitHub Repository

Автор также предлагает поставить звезду и склонировать репозиторий GitHub: проект по созданию ChatGPT-подобной LLM с нуля на PyTorch, с пошаговыми объяснениями.

Код: https://github.com/analyticalrohit/llms-from-scratch

Subscribe to AI Pulse

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe