Эта книга построена как «карта». Мы сознательно оставляли некоторые детали за рамками, чтобы не превращать повествование в бесконечный справочник. Но пытливый читатель (такой как вы) неизбежно задает вопросы, которые выходят за пределы основного текста.
Это приложение - для вас. Здесь мы собрали самые частые «глубинные» вопросы по каждой главе и дали на них короткие, но точные ответы. Никакой воды, только суть.
Как читать:
нашли вопрос, который вас заинтересовал, - прочитали ответ. Не нашли - значит, вопрос действительно глубокий, и вам предстоит собственное исследование. Именно это мы и обещали в предисловии.
Вопрос: Почему LSTM называется «долгая краткосрочная память»? Это же оксюморон.
Название отражает суть архитектуры. LSTM - это всё ещё краткосрочная память в том смысле, что она работает в пределах одного предложения или абзаца. Но по сравнению с простой RNN (которая помнит 5–10 слов) LSTM может протащить информацию через сотни шагов - для рекуррентной сети это долго. Оксюморон подчеркивает: это краткосрочная память, но «долгая» относительно своего класса.
Вопрос: Чем отличается скрытое состояние (hidden state) от состояния ячейки (cell state) в LSTM?
Скрытое состояние - это то, что модель выдает наружу на каждом шаге. Оно участвует в предсказании следующего слова.
Состояние ячейки - это внутренняя «лента конвейера», которая течет через всю сеть, почти не меняясь. Она хранит долгосрочную информацию. В отличие от hidden state, cell state проходит только через линейные операции (сложение, умножение), поэтому градиенты при обратном распространении не затухают. Три вентиля (забывания, входной, выходной) решают, что добавить в эту ленту, что удалить и что прочитать в hidden state.
Метафора:
hidden state - это то, что вы говорите вслух. Cell state - это ваша долговременная память, которую вы не озвучиваете, но носите с собой.
Вопрос: Почему трансформеры называют «трансформерами»?
Название отсылает к идее «трансформации» одной последовательности в другую. Оригинальная статья 2017 года («Attention Is All You Need») была посвящена машинному переводу: модель «трансформировала» предложение на одном языке в предложение на другом. Позже выяснилось, что архитектура хороша и для генерации (decoder-only), и для понимания (encoder-only), но название осталось.
Вопрос: Что такое «градиент» и почему он «затухает»?
Градиент - это вектор частных производных, показывающий, в каком направлении нужно изменить веса модели, чтобы уменьшить ошибку. Если провести аналогию с ландшафтом: градиент показывает направление самого крутого спуска.
При обратном распространении ошибки градиенты многократно умножаются на веса слоев. Если веса меньше 1, градиент экспоненциально затухает (становится близким к нулю). К тому моменту, как ошибка «доходит» до первых слоев, градиент настолько мал, что веса практически не меняются. Модель перестает учиться дальним зависимостям.
Если веса больше 1 - градиент взрывается (становится огромным), и обучение становится нестабильным.
Вопрос: Что такое PPO (Proximal Policy Optimization) и почему он используется в RLHF?
PPO - алгоритм из семейства обучения с подкреплением. Он обновляет модель маленькими шагами, не делая резких изменений. Это критически важно для RLHF, потому что если обновить модель слишком сильно, она «забудет» всё, чему научилась на этапе SFT.
Технически:
PPO ограничивает изменение политики (policy) модели, добавляя штраф за слишком большие отклонения от предыдущей версии. Это делает обучение стабильным, но сложным в настройке.
Альтернатива - DPO (Direct Preference Optimization), который проще и не требует отдельной модели вознаграждения. Но на масштабах OpenAI и Anthropic RLHF с PPO всё ещё считается золотым стандартом.
Вопрос: Что такое «градиент» и почему он «затухает»? - см. ответ в разделе 6.2.
Вопрос: Что такое PPO? - см. ответ в разделе 6.2.
Вопрос: Как физически организован KV Cache? Это просто память на GPU?
Да, KV Cache хранится в HBM (High Bandwidth Memory) GPU. Для каждого токена сохраняются матрицы K и V размерностью [num_heads, head_dim].
Проблема:
при генерации длинных текстов KV Cache может занимать десятки гигабайт. Если хранить его как один непрерывный блок, возникает фрагментация памяти - модель не может выделить большой кусок, даже если свободной памяти достаточно.
Решение:
vLLM использует PagedAttention - аналог виртуальной памяти в операционных системах. KV Cache разбивается на страницы фиксированного размера. Страницы могут быть расположены непоследовательно в памяти.
Это позволяет:
Избежать фрагментации.
Эффективно использовать память.
Делить KV Cache между запросами (для batch processing).
Именно PagedAttention дает vLLM прирост скорости в 10–20 раз по сравнению с transformers из коробки.
Вопрос: Почему GQA (Grouped Query Attention) работает почти так же хорошо, как MHA (Multi-Head Attention), но требует меньше памяти?
Исследования показали, что ключи (K) и значения (V) несут меньше разнообразной информации, чем запросы (Q). В MHA каждая голова имеет свои K и V - это требует много памяти. В GQA головы группируются, и внутри группы они используют общие K и V.
Почему качество не падает? Потому что разнообразие информации для K и V избыточно. Разделение K и V между 4–8 головами (а не 32) сохраняет достаточно информации для качественной работы. Это эмпирический факт, подтвержденный на LLaMA 2/3 и Mistral.
Вопрос: Что такое квантизация и как она влияет на качество?
Квантизация - это снижение точности весов модели. Вместо FP16 (2 байта на параметр) используются INT8 (1 байт) или INT4 (0.5 байта). Это уменьшает потребление памяти в 2–4 раза.
Как это влияет на качество:
INT8: потеря качества 1–3% для инференса. Практически незаметна на большинстве задач.
INT4: потеря качества 3–8%. Может быть заметна на сложных рассуждениях или математике.
Современные методы (GPTQ, AWQ, GGUF) минимизируют потери, подбирая оптимальные масштабы для каждого слоя.
Важно:
квантизация применяется только для инференса. Для обучения (fine-tuning) нужна FP16 или BF16, иначе градиенты не сойдутся.
Вопрос: Почему в таблице сравнения моделей нет столбца с ценами?
Потому что цены меняются быстрее, чем архитектуры. То, что сегодня стоит $10 за миллион токенов, завтра может стоить $5 или $20. Вендоры постоянно корректируют цены, появляются новые модели, старые дешевеют.
Мы сознательно не включили цены в таблицу, чтобы не создавать ложного ощущения «актуальности». Вместо этого мы дали:
Формулы для расчета TCO (раздел 5.3).
Чек-лист, как считать бюджет под свой сценарий.
Принципы выбора модели (матрица выбора), которые остаются актуальными независимо от цен.
Совет:
перед принятием решения заходите на сайты вендоров и проверяйте актуальные цены. Таблицу в книге воспринимайте как «карту местности», а не как прейскурант.
Вопрос: Как технически реализовать NL 2 SQL , упомянутый в главе 6?
NL2SQL (Natural Language to SQL) - преобразование запроса на естественном языке в SQL-код.
Варианты реализации:
Промт к LLM с описанием схемы.
Самый простой способ: в промт передаете схему базы данных (CREATE TABLE statements) и просите модель сгенерировать SQL. Для GPT-4 точность на простых запросах - 80–90%, на сложных (JOIN, подзапросы) - 60–70%.
Fine - tuned модель.
Обучаете модель на датасете вроде Spider (10k+ примеров). Это повышает точность на 10–15%, но требует ресурсов.
Семантический парсер.
Специализированные модели вроде TAPAS или T5 для NL2SQL. Менее гибкие, но более предсказуемые.
Важно:
всегда валидируйте сгенерированный SQL перед выполнением. Даже лучшие модели могут сгенерировать DROP TABLE или DELETE * FROM users. Используйте:
Парсер SQL для проверки синтаксиса.
Белый список разрешенных операций (только SELECT).
Выполнение в изолированной базе (read-only).
Вопрос: Как строить ROC -кривую для роутера?
ROC-кривая (Receiver Operating Characteristic) показывает, как меняется баланс между True Positive Rate (TPR) и False Positive Rate (FPR) при изменении порога классификатора.
Для роутера:
TPR (True Positive Rate) = доля сложных запросов, отправленных на тяжелую модель.
FPR (False Positive Rate) = доля простых запросов, ошибочно отправленных на тяжелую модель.
Как построить:
Соберите 1000 реальных запросов.
Разметьте их на «простые» и «сложные» (по вашей задаче).
Прогоните через классификатор (fastText, miniLM), получите вероятности.
Для каждого возможного порога (0, 0.01, 0.02, ..., 1) вычислите TPR и FPR.
Нанесите точки на график (FPR по X, TPR по Y).
Соедините точки - это ROC-кривая.
Как выбирать порог:
Чем ближе кривая к левому верхнему углу (0,1), тем лучше.
Оптимальный порог - точка, ближайшая к этому углу.
Если вы готовы жертвовать качеством ради бюджета - двигайте порог влево (больше запросов на легкую модель, но выше риск ошибки).
Если качество критично - двигайте порог вправо (меньше ошибок, но выше стоимость).
Вопрос: Что такое NL2SQL? - см. ответ в разделе 6.5.
Вопрос: Как технически обучить «модель стиля» на моей переписке?
Это классическая задача fine-tuning для имитации стиля.
Шаги:
Соберите данные.
Экспортируйте ваши сообщения из Telegram, WhatsApp, email. 500–2000 сообщений - достаточно. Формат: диалоги (вопрос-ответ) или монологи (ваши сообщения).
Выберите базовую модель.
Используйте небольшую LLM - Llama-3-8B, Mistral-7B, Qwen-2.5-7B. Она должна быть достаточно умной, чтобы улавливать стиль, но не слишком тяжелой для дообучения.
Используйте LoRA .
Low-Rank Adaptation позволяет дообучать модель с минимальными затратами памяти (8–16 GB GPU). Библиотеки: HuggingFace PEFT, Unsloth, Axolotl.
Формат обучения.
Тренируйте модель на задаче «продолжи диалог в моем стиле». Промт: [Ваше сообщение] → [Ответ модели, который имитирует ваш стиль].
Оценка.
После обучения прогоните 10–20 тестовых примеров и сравните с вашим реальным стилем. Если ответы кажутся «чужими» - добавьте данных или увеличьте эпохи.
Время:
на одной A100 обучение LoRA на 1000 примеров занимает 1–2 часа.
Вопрос: Как построить «векторную базу ценностей»?
Это RAG (Retrieval-Augmented Generation) на ваших личных данных.
Шаги:
Соберите утверждения.
Напишите 100–200 фраз, которые отражают ваши ценности, предпочтения, убеждения. Например: «Я предпочитаю краткие ответы», «Меня раздражает хамство», «Для меня важна экология».
Сгенерируйте эмбеддинги.
Прогоните каждое утверждение через эмбеддер. Рекомендации:
text-embedding-3-small (OpenAI) - качественно, но платно.
intfloat/multilingual-e5-large (HuggingFace) - бесплатно, хорошо для русского.
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 - быстро, компактно.
Сохраните в векторную БД.
Популярные варианты:
Qdrant - open-source, легко запустить локально.
Pinecone - облачная, простой API, но платная.
Milvus - мощная, но сложная в настройке.
Chroma - самая простая для прототипов.
При запросе к двойнику. Получите эмбеддинг запроса, найдите ближайшие 3–5 утверждений из базы, добавьте их в промт как «ваши ценности».
Пример промта:
Ты - цифровой двойник. Твои ценности:
- Я предпочитаю краткие ответы.
- Меня раздражает хамство.
- Для меня важна экология.
Пользователь: {запрос}
Ответ:
Резюме
LSTM названа оксюмороном, потому что это «долгая» память относительно RNN, но всё еще краткосрочная.
Градиент - направление спуска в пространстве весов. Затухает при многократном умножении на числа < 1.
PPO - алгоритм RLHF, который обновляет модель маленькими шагами, чтобы не забыть SFT.
KV Cache физически хранится в HBM; vLLM использует PagedAttention для эффективного управления.
GQA работает почти как MHA, потому что K и V несут меньше разнообразной информации, чем Q.
Квантизация (INT8, INT4) снижает память в 2–4 раза с потерей качества 1–8%.
Цены на модели не включены в таблицу, потому что они меняются быстрее, чем архитектуры.
NL2SQL реализуется через промт с описанием схемы или fine-tuned модель; всегда валидируйте SQL.
ROC-кривая для роутера строится по паре (TPR - True Positive Rate, FPR - False Positive Rate) для разных порогов; помогает найти баланс качества и бюджета.
Модель стиля дообучается через LoRA на 500–2000 ваших сообщений.
Векторная база ценностей строится через эмбеддинги и векторную БД (Qdrant, Pinecone).