Курс

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

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

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

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

    Версия материала: 5
  2. Детерминированное построение таблицы слияний BPE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Версия материала: 7
  11. Начальные веса: воспроизводимые значения и обоснованный масштаб

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Версия материала: 5
  25. Сформируйте распределение следующего токена, затем выберите один токен случайным образом

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

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

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

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

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

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