AI Research Foundations, курс 8: путеводитель по итоговому проекту
Путеводитель по девяти ноутбукам итогового курса Google DeepMind «Develop Your Model for Real-World Impact»: три трека (классификация, суммаризация, диалог), этапы «данные → дообучение Gemma с LoRA → оценка» и перевод ключевых указаний.
Курс 8 — «Capstone: Develop Your Model for Real-World Impact» («Итоговый проект: модель, полезная в реальном мире») — завершает программу AI Research Foundations. Новой теории в нём нет: вы берёте всё, что сделали в курсах 1–7, и строите свою модель для реальной задачи. На платформе Google Skills курс начинается со статей и заданий: выбрать задачу, собрать или найти данные, описать их в карточке данных (Data Card) и оценить, на кого повлияет ваша модель. В репозитории лежат девять ноутбуков второй половины — техническая реализация: подготовка данных, дообучение Gemma с LoRA и оценка.
Что это и для кого
Заголовок раздела «Что это и для кого»Курс для того, кто прошёл курсы 1–5 и 7 (или ступени 3–7 ChinaAI) и хочет довести одну модель от сырых данных до измеренного результата. Технически всё сводится к одному рецепту, который вы уже делали в лабораторной 5.6: данные в формате «промпт — ответ» с разметкой реплик Gemma → Gemma3-1B с LoRA → оценка. Отличие — в том, что данные и задача ваши, а значит, все решения (какие классы, как чистить, как делить, какой ранг и learning rate, как мерить качество) принимаете вы.
На выбор три трека. В каждом три ноутбука: рабочий пример с данными, подготовка данных, обучение и оценка.
flowchart LR subgraph S1["Этап 1: данные (на платформе)"] A["Задача, данные, Data Card, оценка влияния"] end subgraph S2["Этап 2: подготовка данных"] B["Загрузить, почистить, сбалансировать"] --> C["Разделить: обучение / валидация / тест"] --> D["Формат input → output, JSONL"] end subgraph S3["Этап 3: обучение и оценка"] E["Разметка реплик Gemma"] --> F["Базовая модель: проверка"] --> G["LoRA-дообучение"] --> H["Оценка: глазами и метриками"] end S1 --> S2 --> S3
Карта содержимого
Заголовок раздела «Карта содержимого»| Ноутбук | Трек | О чём | Время | К какому уроку ChinaAI | Важность |
|---|---|---|---|---|---|
| 8.1 Inspect Classification Data | классификация | Рабочий пример: загрузить большой Africa Galore, посчитать примеры по категориям, увидеть перекос в сторону «Story», сохранить JSONL | 30 мин | План проекта | ★ |
| 8.2 Prepare your Data… Classification | классификация | Отбор и балансировка классов, чистка HTML и Юникода, стратифицированное разбиение, формат input/output с инструкцией | 2–4 ч | Обобщение и переобучение, SFT | ★★★ |
| 8.3 Train and Evaluate… Classification | классификация | Разметка реплик, проверка базовой модели, LoRA (ранг 6, lr 5e-5, 3 эпохи), предсказания на всех трёх выборках, accuracy / precision / recall | 3–4 ч + 1–3 ч обучения | LoRA-практика, Бенчмарки | ★★★ |
| 8.4 Inspect Summarization Data | суммаризация | Рабочий пример: набор на основе Africa Galore с полями expanded (полный текст) и summary (краткое изложение) | 30 мин | План проекта | ★ |
| 8.5 Prepare your Data… Summarization | суммаризация | Статистика длин в словах, распределения полей, поиск дубликатов, разбиение, формат «Summarize: …» | 2–4 ч | Данные для претрейна (чистка и дедупликация) | ★★★ |
| 8.6 Train and Evaluate… Summarization | суммаризация | LoRA (ранг 16, lr 1e-4, 2 эпохи, длина 530), сравнение с эталонными изложениями, коэффициент сжатия | 3–4 ч + 1–3 ч | Свои эвалы и LLM-as-judge | ★★★ |
| 8.7 Data Generation for Conversational Model | диалог | Рабочий пример: синтетические пары «вопрос — ответ» о еде из абзацев Africa Galore по шаблонам и регионам ООН | 1 ч | SFT | ★★ |
| 8.8 Prepare your Data… Conversational | диалог | Чистка ответов, удаление пустых, разбиение, формат | 2–4 ч | SFT | ★★ |
| 8.9 Train and Evaluate… Conversational | диалог | LoRA (ранг 6, lr 5e-5, 3 эпохи), обзор способов оценки диалоговых моделей | 3–4 ч + 1–3 ч | Свои эвалы и LLM-as-judge | ★★★ |
Гиперпараметры в таблице — значения из рабочих примеров; везде модель gemma3_1b, batch_size = 1.
Переведённые ключевые части
Заголовок раздела «Переведённые ключевые части»Как устроены ноутбуки этапов 2 и 3
Заголовок раздела «Как устроены ноутбуки этапов 2 и 3»Перевод вводного текста ноутбуков 8.2, 8.5 и 8.8 (он почти одинаков во всех треках).
В этой первой лабораторной вы загрузите, почистите и отформатируете данные для обучения модели. К этому моменту вы уже должны были выполнить предыдущие задания итогового курса, а именно:
- определить свою задачу;
- скачать или собрать набор данных;
- описать набор данных в карточке данных (Data Card);
- оценить, как ваша модель повлияет на людей.
В этой и следующей лабораторных вы превратите план проекта в работающую модель.
Как и в прошлых заданиях, в лабораторной для каждого шага есть рабочий пример. Считайте код рабочего примера шаблоном для своей реализации. Учтите, однако, что какие-то шаги могут не подойти вашему проекту, а какие-то, наоборот, придётся добавить, поэтому относитесь к шаблону как к отправной точке: смело добавляйте и удаляйте ячейки.
Чему вы научитесь: чистить и предобрабатывать текстовые данные, чтобы получить качественные входы для обучения; делить набор данных на обучающую и тестовую выборки для честной оценки и лучшего обобщения; приводить данные к формату для дообучения LLM, следующей инструкциям.
Что вам понадобится из прошлых курсов: общие знания о LLM и трансформерах (курсы 1, 3, 4), приёмы подготовки данных (курс 2), формат данных для дообучения (курс 5), разбиение данных (курс 3).
Трек «Классификация»: отбор и балансировка
Заголовок раздела «Трек «Классификация»: отбор и балансировка»Перевод из ноутбука 8.2, задание 1.
В рабочем примере из тысяч записей Africa Galore оставляют только четыре чётко определённые категории — Drink (напитки), Food (еда), Music (музыка) и Textile (ткани) — и ограничивают каждую сотней примеров.
Ключевой код рабочего примера (с нашими комментариями):
# Оставляем только нужные категории.selected_categories = ["Drink", "Food", "Music", "Textile"]df = df[df["category"].isin(selected_categories)].copy()
# Не больше 100 строк на категорию.df = ( df.sort_index() # группируем по категории .groupby("category", group_keys=False) .head(100))
# Перемешиваем, чтобы модель не выучила ложные закономерности порядка данных.# random_state — для воспроизводимости.df = df.sample(frac=1, random_state=42).reset_index(drop=True)Разбиение: обучение, валидация, тест
Заголовок раздела «Разбиение: обучение, валидация, тест»Перевод справок из ноутбука 8.2, задание 3.
from sklearn.model_selection import train_test_split
# 80% — обучение, 20% — поровну на валидацию и тест, с сохранением долей классов.df_train, df_val_test = train_test_split( df, test_size=0.2, random_state=42, stratify=df["category"])df_val, df_test = train_test_split( df_val_test, test_size=0.5, random_state=42, stratify=df_val_test["category"])В рабочем примере поступают иначе: в обучение ушли первые 100 примеров каждой категории, поэтому валидацию и тест набирают из остальных, ни разу не виденных примеров — по 40 на категорию, затем делят пополам. Оригинал предупреждает: если обучающий набор маленький, Gemma3-1B может плохо справляться с совсем незнакомыми примерами; для маленьких наборов лучше отдать больше данных в обучение и сделать тест поменьше, а оценочные данные должны отражать ваш реальный сценарий.
Формат данных: инструкция → ответ
Заголовок раздела «Формат данных: инструкция → ответ»Перевод из ноутбуков 8.2 (задание 4) и 8.3 (задание 2).
Каждая строка обучающего файла — отдельный JSON-объект с двумя полями: input — текст, который модель прочитает
(с инструкцией), и output — правильный ответ (для классификации — метка). При обучении модель учится переводить
input в правильный output.
def to_instruction_record(row) -> dict[str, str]: """Превращает строку набора в пару «инструкция → ответ».""" instruction = ( "Classify the following text into one of the categories 'Drink'," " 'Food', 'Music', or 'Textile'.\n\n" ) return {"input": instruction + row["description"], "output": row["category"]}Для суммаризации инструкция — "Summarize: " плюс полный текст из поля expanded, ответ — поле summary.
Затем пары оборачиваются в разметку реплик Gemma. Важная деталь из ноутбука 8.3: у Gemma только две роли — user и model, а роли system нет. Поэтому любые общие указания (тон, стиль, ограничения), которые у других моделей кладут в системное сообщение, здесь нужно включать прямо в промпт пользователя в каждом обучающем примере.
SOT = "<start_of_turn>" # начало репликиEOT = "<end_of_turn>" # конец реплики
def format_io_as_turns(input_text: str, label_text: str, sot: str = SOT, eot: str = EOT): """Оборачивает пару «вход — ответ» в разметку реплик Gemma для обучения с LoRA.""" formatted_q = f"{sot}user\n{input_text}{eot}\n" formatted_a = f"{sot}model\n{label_text}{eot}" return formatted_q, formatted_a
# Модели Gemma3 в Keras ждут словарь с ключами "prompts" и "responses".inputs, targets = zip(*(format_io_as_turns(ex["input"], ex["output"]) for ex in train_data))data = {"prompts": list(inputs), "responses": list(targets)}Если нужно предсказывать сразу несколько признаков (многозадачная классификация), ответ делают JSON-строкой,
например {"category": "Food", "region": "West Africa"}, а инструкция просит оба поля.
Практические советы оригинала: пишите метки одинаково во всех записях (регистр и написание); держите классы примерно поровну; часто полезно перечислить все допустимые классы прямо в промпте — так задача становится явной.
Почему базовая модель сначала отвечает плохо
Заголовок раздела «Почему базовая модель сначала отвечает плохо»Перевод блока «Understanding base model limitations» из ноутбука 8.3.
Скорее всего, вы заметите, что базовая Gemma3-1B на просьбу классифицировать отвечает непоследовательно или неверно. Это ожидаемо.
Базовые модели и модели, дообученные следовать инструкциям. Gemma3-1B здесь — базовая (предобученная) модель,
а не вариант, дообученный на инструкциях. Базовую модель учили только предсказывать следующий токен. Модели,
дообученные следовать инструкциям (например, gemma3_instruct_1b), дополнительно обучали на парах «инструкция — ответ».
Попросите базовую модель «классифицировать» — и она может просто продолжить текст правдоподобным образом, вместо того
чтобы дать структурированный ответ.
Почему маленьким моделям труднее. У модели с миллиардом параметров мало «ёмкости», чтобы по одному контексту понять неявно заданную задачу. Большие модели иногда угадывают задачу по формулировке промпта, а маленькие базовые чаще уходят от темы, выдают правдоподобную, но неверную информацию (галлюцинации) или даже бессмыслицу.
Почему для дообучения всё же берут базовую модель. Её не подгоняли под конкретный формат инструкций, поэтому она — более нейтральная отправная точка: LoRA-дообучение легче направляет её поведение к вашей задаче, не борясь с привычками, выученными при инструктивном дообучении. Сравнив ответы до и после дообучения, вы наглядно увидите, как LoRA превращает ненадёжную базовую модель в работающий классификатор.
Гиперпараметры LoRA
Заголовок раздела «Гиперпараметры LoRA»Перевод справки «Understanding LoRA hyperparameters» из ноутбука 8.3.
| Параметр | Что значит | Совет оригинала |
|---|---|---|
lora_rank (4, 8, 16) | Ранг низкоранговых матриц, добавленных в слои внимания | Выше ранг — сложнее закономерности, но больше памяти и времени. Для маленьких наборов и простой классификации часто хватает 4; для больших наборов и тонких задач — 8 и выше |
learning_rate (1e-5, 5e-5) | Насколько сильно меняются веса на каждом шаге | Начните с 2e-5 или 5e-5. Модель не учится (потери высокие) — немного увеличьте; обучение неустойчиво (потери скачут) — уменьшите |
num_epochs (2, 5, 10) | Число полных проходов по обучающей выборке | Слишком много эпох — переобучение (запоминание вместо обобщения). Начните с 2–3 для маленьких наборов и добавляйте, пока качество на валидации растёт. Диалоговым моделям обычно нужно больше эпох, чем классификаторам |
batch_size (1, 4, 8) | Сколько примеров обрабатывается до обновления весов | Больше батч — устойчивее градиент, но больше памяти. На T4 для Gemma часто нужен 1 |
sequence_length (256, 450, 512) | Максимум токенов на пример | Должно вмещать весь промпт и ответ. Посмотрите на свои данные и возьмите чуть больше самой длинной пары |
Во время обучения следите за loss и sparse_categorical_accuracy (доля верно угаданных следующих токенов), остановитесь,
если модель начала переобучаться, и при неудовлетворительных результатах меняйте гиперпараметры, число эпох и ранг.
На наборе из рабочего примера дообучение на T4 занимает около 15 минут.
Пересказ задания 4 ноутбуков 8.3, 8.6 и 8.9.
- Сравните базовую и дообученную модель на тех же пяти примерах. Классификатор после дообучения должен отвечать
одним словом-меткой вместо длинного блуждающего текста. Разметка
<start_of_turn>/<end_of_turn>помогает модели понять, когда «слушать», а когда «отвечать». - Получите предсказания для всех трёх выборок и сохраните в CSV (
predictions_train.csv,predictions_val.csv,predictions_test.csv). Высокая точность на обучающей выборке подтверждает, что модель выучила примеры; валидация показывает обобщение и служит для настройки; тест — для финальной оценки, когда всё уже настроено. - Извлеките ответ модели: текст между
<start_of_turn>modelи первым<end_of_turn>в полеmodel_output, и сравните его со столбцомoutput. - Посчитайте метрики. Для классификации — accuracy (доля верных ответов), precision и recall (взвешенные по классам,
из
sklearn.metrics) иclassification_reportпо каждому классу; сравните обучающую выборку с валидацией и тестом: большой разрыв — признак переобучения. Для суммаризации — сравнение с эталонными изложениями глазами и коэффициент сжатия : 0,10 значит, что изложение составляет 10% исходного текста. Похожие коэффициенты на виденных и невиденных данных говорят, что модель выучила устойчивый стиль; но сам по себе коэффициент качество не измеряет. Для диалога — см. ниже. - Ищите закономерности в ошибках: какие классы угадываются хуже, всегда ли ответ — одна метка, нет ли перекоса в сторону одного класса, как модель ведёт себя на неоднозначных примерах. Запишите выводы и итерируйте: улучшайте гиперпараметры по валидации, а потом проверяйте, переносится ли улучшение на тест.
Трек «Диалог»: синтетические данные
Заголовок раздела «Трек «Диалог»: синтетические данные»Пересказ ноутбука 8.7.
В наборе Africa Galore нет диалогов — только абзацы-описания. Ноутбук 8.7 показывает, как программно превратить такие
абзацы в пары «вопрос — ответ». Для каждой записи категории «Food» функция assign_region ищет в названии и описании
страну и приписывает ей регион Африки по методологии ООН (M49). build_prompt выбирает случайный шаблон вопроса,
например «What is one popular dish from {location}?» («Какое популярное блюдо есть в {location}?») или «Recommend
a well-known local dish from {location}.», generate_response собирает ответ из подходящих записей, а
generate_dataset формирует сбалансированный набор и печатает отчёт о распределении по темам, регионам и странам.
Чтобы приспособить код к своему проекту, оригинал советует: расширить список тем (TOPICS = ["food"]), добавить свои
шаблоны вопросов в build_prompt, улучшить сопоставление стран регулярными выражениями с границами слов
(r'\b' + re.escape(country.lower()) + r'\b' вместо простого вхождения подстроки) и настроить размер набора и длину
ответов.
Как запускать на своей машине
Заголовок раздела «Как запускать на своей машине»Все ноутбуки этапа 3 рассчитаны на одну T4 и Gemma3-1B; на RTX 4080 с 32 ГБ они пойдут быстрее и с запасом памяти.
- Замените
drive.mount('/content/drive')и пути/content/drive/MyDrive/...на локальную папку — см. обзор программы. - Ключ Kaggle положите в
~/.kaggle/kaggle.jsonвместо секретов Colab. - В ноутбуках этапа 3 модель загружается как
keras_nlp.models.Gemma3CausalLM— это старое имя пакетаkeras_hub; еслиkeras_nlpне установлен, замените наkeras_hub.models.Gemma3CausalLM. - С запасом памяти можно поднять
batch_sizeдо 4–8 (учтите, что learning rate, возможно, придётся подобрать заново) или взятьgemma3_4b_textсdtype="bfloat16"— как в лабораторной 7.5. - Генерация предсказаний по всем выборкам идёт по одному примеру — это самая долгая часть оценки. Если ваш проект на PyTorch, тот же конвейер на Transformers + PEFT + vLLM разобран в уроках «Практика — LoRA-дообучение Qwen» и «vLLM, SGLang и непрерывный батчинг».
Что читать дальше
Заголовок раздела «Что читать дальше»- Урок «План выпускного проекта» — шаблон проекта ChinaAI; курс 8 можно взять за готовую основу (особенно трек классификации — он самый быстрый).
- Урок «Отчёт и защита» — как оформить результаты.
- Tuning Playbook — как организовать подбор гиперпараметров по-научному, а не наугад.
- Урок «Свои эвалы и LLM-as-judge» — как построить оценку для открытых задач вроде суммаризации и диалога.
Словарик
Заголовок раздела «Словарик»| English | Русский |
|---|---|
| capstone project | итоговый (выпускной) проект |
| worked example / your implementation | рабочий пример / ваша реализация |
| Data Card | карточка данных |
| class imbalance bias | смещение из-за несбалансированных классов |
| mutually exclusive classes | взаимоисключающие классы |
| training / validation / test set | обучающая / валидационная / тестовая выборка |
| stratified split | стратифицированное разбиение |
| instruction-based format | формат «инструкция → ответ» |
| multi-task classification | многозадачная классификация |
| system role | системная роль |
| spot-checking | выборочная проверка глазами |
| accuracy, precision, recall | точность (доля верных), точность (precision), полнота (recall) |
| compression (length) ratio | коэффициент сжатия |
| synthetic data | синтетические данные |
| human evaluation, LLM as a judge | оценка людьми, LLM в роли судьи |