Курс

От текста к небольшой языковой модели

В каждой переведённой главе общая реализация на Rust дополняется одной проверенной идеей.

  1. Карта устройства современной LLM

    Посмотрите, как токенизация, эмбеддинги, блоки декодера, внимание, ветви прямого распространения, обучение, выбор токена и KV-кэш соединяются в LLM только с декодером.

    Версия материала: 5
  2. Единицы текста и идентификаторы токенов

    Сопоставьте байты UTF-8, скалярные значения Unicode и ID учебного словаря; в следующих главах вместо этого словаря будет построен BPE-токенизатор на уровне байтов.

    Версия материала: 6
  3. Документы корпуса и фиксированное разбиение на выборки

    Распределите целые исходные документы между тремя непересекающимися выборками — обучающей, валидационной и тестовой — прежде чем эти документы будут использованы для обучения токенизатора или модели.

    Версия материала: 9
  4. От подсчёта переходов к биграммной модели

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

    Версия материала: 5
  5. От координат тензора к одному плоскому буферу

    Разместите матрицы языковой модели и тензоры внимания в одном плоском векторе на Rust, вычисляя построчные шаги с проверкой переполнения и однозначно сопоставляя координатам смещения.

    Версия материала: 5
  6. Представления общего хранилища и явное копирование тензоров

    Проследите путь от признаков слов в фиксированном контексте к тензорам Q/K/V и разделению внимания на головы, а затем сравните представления общего хранилища с явным копированием в реализации курса.

    Версия материала: 6
  7. Умножьте строки на столбцы и используйте одну матрицу весов в нескольких пакетах

    Выполните матричное умножение двумерных и пакетных тензоров скалярными циклами на Rust с проверкой внутренних размеров, согласованием форм по осям пакета и флагами транспонирования.

    Версия материала: 5
  8. Проверяйте градиенты, прежде чем доверять обратному распространению

    Сверяйте выбранные производные для обучения LLM по фактически представимым точкам: учитывайте требование локальной гладкости и погрешность с учётом масштаба, а координаты тензора выбирайте детерминированно в Rust.

    Версия материала: 6
  9. Накопление градиентов в скалярном графе

    Постройте на Rust скалярное автоматическое дифференцирование в обратном режиме, сложите градиенты повторных вхождений операндов и проверьте результат для обучения LLM.

    Версия материала: 6
  10. Обратный проход по тензорному графу с локальными VJP

    Постройте на Rust ленту автоматического дифференцирования тензоров. Реализуйте для каждого ребра локальное произведение вектора на якобиан (VJP), корректно проводите обратный проход через преобразования формы, согласование форм и редукции и проверяйте градиенты, необходимые для обучения LLM.

    Версия материала: 9
  11. Выполните обратный проход по операциям, преобразующим ID токенов в значение функции потерь

    Реализуйте VJP для матричных произведений, выбора строк эмбеддингов по повторяющимся ID, SiLU, log-softmax и средней функции потерь по токенам. Затем сравните каждое новое локальное правило с производными, оценёнными методом центральных разностей в выбранных координатах.

    Версия материала: 7
  12. Воспроизводимо инициализируйте обучаемые веса

    Воспроизводимо инициализируйте матрицы весов с учётом ширины, сравните нулевую инициализацию, равномерную выборку с удвоенной границей и масштаб по схеме Ксавье, а затем проследите ожидаемую дисперсию по глубине.

    Версия материала: 4
  13. Сопоставьте ID токенов с обучаемыми векторами

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

    Версия материала: 7
  14. Считайте только токены, действительно вошедшие в мини-пакет

    Перемешайте полные каузальные окна и объедините их в мини-пакеты из строк фиксированной длины. Сохраните неполный последний мини-пакет и усредните функцию потерь и градиенты по фактически вошедшим в него целевым токенам.

    Версия материала: 3
  15. Не включайте затухание весов в моменты градиента

    Соберите AdamW на основе градиентов именованных параметров и моментов с поправкой на смещение, примените затухание весов отдельной ветвью, а затем атомарно зафиксируйте все проверенные обновления.

    Версия материала: 7
  16. Обучите нейронную языковую модель с фиксированным контекстом

    Объедините эмбеддинги, скрытый слой SwiGLU, функцию потерь следующего токена с выбором по индексу, мини-пакеты и AdamW в детерминированной нейронной n-граммной модели со снижением валидационных потерь.

    Версия материала: 4
  17. Для каждого обучаемого обновления сохраняйте тождественный путь

    Проследите остаточное сложение при точном совпадении форм, тождественный путь градиента и путь через обучаемую ветвь, обучение ветви с нулевыми весами и повторные преобразования с остаточными связями и без них.

    Версия материала: 3
  18. Нормализуйте масштаб, не вычитая среднее

    Реализуйте RMSNorm по последней оси, проследите градиенты по входу и коэффициенту масштаба и отделите идеальную инвариантность от поведения вблизи нуля, где преобладает эпсилон.

    Версия материала: 5
  19. Вычислите одну голову самовнимания без маски

    Разберите, как одна голова самовнимания Transformer без маски сопоставляет запросы с ключами, нормирует каждую строку и смешивает значения на основе проверяемого примера на Rust.

    Версия материала: 2
  20. Закройте доступ к будущим ключам каузальной маской

    Разберите, как нижнетреугольная каузальная маска с разрешённой диагональю закрывает доступ к будущим ключам Transformer, делает их вероятности внимания строго нулевыми и сохраняет выходы предыдущих позиций.

    Версия материала: 2
  21. Поворачивайте пары координат запросов и ключей с помощью RoPE

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

    Версия материала: 3
  22. Вычислите каузальное внимание в нескольких головах, затем смешайте их выходы

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

    Версия материала: 2
  23. Выполните все шаги обучения и выберите модель по валидации

    Разберитесь, как цикл обучения декодера упорядочивает обратное распространение, ограничение нормы градиента, шаги AdamW по расписанию, валидацию без записи графа и выбор состояния без обращения к тестовым данным.

    Версия материала: 10
  24. Передайте тестовую выборку одному локальному оценщику и сохраните отчёт

    Разберитесь, как в пределах одного запуска зафиксировать решения, принятые по валидации, проверить и сохранить упорядоченные пары входных и целевых токенов, а затем отделить корректное сравнение на намеренно выбранном фиксированном примере от независимой оценки способности модели обобщать и от доказательства общего превосходства архитектуры.

    Версия материала: 7
  25. Сохраните состояние декодера и точно повторите одно заданное обновление

    Разберитесь, как контрольная точка с версией формата сохраняет токенизатор, декодер, состояние AdamW из того же снимка цикла обучения и отдельный генератор для выбора токенов, отклоняет повреждённые байты и даёт одинаковый результат одного обновления, если вызывающий код передаёт обеим ветвям одинаковые входы, цели и скорость обучения.

    Версия материала: 5
  26. Сформируйте набор вариантов, затем сделайте один случайный выбор

    Разберитесь, как положительная температура, фильтрация top-k с однозначным порядком и восстановленное состояние генератора псевдослучайных чисел превращают логиты декодера в управляемую и воспроизводимую генерацию LLM без кэша.

    Версия материала: 5
  27. Один раз заполните кэши, затем декодируйте по одному токену

    Разберитесь, как отдельный KV-кэш (кэш ключей и значений) для каждого блока и один проверенный сеанс для модели и кэша позволяют один раз обработать промпт, затем согласованно декодировать по одному токену, а затем сравнить логиты последней позиции и решения при генерации с эталонными расчётами по полному префиксу.

    Версия материала: 6
  28. Запустите небольшую LLM целиком

    Проследите полный цикл небольшой декодерной языковой модели на Rust: обучение с выбором по валидации, сравнение по целевым позициям перекрывающихся окон, точное восстановление и генерацию с KV-кэшем. Отдельное правило оценивало бы каждый из 442 переходов внутри документов один раз, использовало бы максимально доступный каузальный префикс не длиннее четырёх токенов и только распределение в последней позиции; числовые значения среднего NLL и перплексии по этому правилу не приводятся.

    Версия материала: 9