Перейти к содержимому
ПереводыGoogle и DeepMind

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
Общая схема всех трёх треков курса 8
НоутбукТрекО чёмВремяК какому уроку ChinaAIВажность
8.1 Inspect Classification DataклассификацияРабочий пример: загрузить большой Africa Galore, посчитать примеры по категориям, увидеть перекос в сторону «Story», сохранить JSONL30 минПлан проекта★
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 / recall3–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.

Перевод вводного текста ноутбуков 8.2, 8.5 и 8.8 (он почти одинаков во всех треках).

В этой первой лабораторной вы загрузите, почистите и отформатируете данные для обучения модели. К этому моменту вы уже должны были выполнить предыдущие задания итогового курса, а именно:

  1. определить свою задачу;
  2. скачать или собрать набор данных;
  3. описать набор данных в карточке данных (Data Card);
  4. оценить, как ваша модель повлияет на людей.

В этой и следующей лабораторных вы превратите план проекта в работающую модель.

Как и в прошлых заданиях, в лабораторной для каждого шага есть рабочий пример. Считайте код рабочего примера шаблоном для своей реализации. Учтите, однако, что какие-то шаги могут не подойти вашему проекту, а какие-то, наоборот, придётся добавить, поэтому относитесь к шаблону как к отправной точке: смело добавляйте и удаляйте ячейки.

Чему вы научитесь: чистить и предобрабатывать текстовые данные, чтобы получить качественные входы для обучения; делить набор данных на обучающую и тестовую выборки для честной оценки и лучшего обобщения; приводить данные к формату для дообучения 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 превращает ненадёжную базовую модель в работающий классификатор.

Перевод справки «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.

  1. Сравните базовую и дообученную модель на тех же пяти примерах. Классификатор после дообучения должен отвечать одним словом-меткой вместо длинного блуждающего текста. Разметка <start_of_turn> / <end_of_turn> помогает модели понять, когда «слушать», а когда «отвечать».
  2. Получите предсказания для всех трёх выборок и сохраните в CSV (predictions_train.csv, predictions_val.csv, predictions_test.csv). Высокая точность на обучающей выборке подтверждает, что модель выучила примеры; валидация показывает обобщение и служит для настройки; тест — для финальной оценки, когда всё уже настроено.
  3. Извлеките ответ модели: текст между <start_of_turn>model и первым <end_of_turn> в поле model_output, и сравните его со столбцом output.
  4. Посчитайте метрики. Для классификации — accuracy (доля верных ответов), precision и recall (взвешенные по классам, из sklearn.metrics) и classification_report по каждому классу; сравните обучающую выборку с валидацией и тестом: большой разрыв — признак переобучения. Для суммаризации — сравнение с эталонными изложениями глазами и коэффициент сжатия длина изложения в словах/длина исходного текста в словах\text{длина изложения в словах} / \text{длина исходного текста в словах}: 0,10 значит, что изложение составляет 10% исходного текста. Похожие коэффициенты на виденных и невиденных данных говорят, что модель выучила устойчивый стиль; но сам по себе коэффициент качество не измеряет. Для диалога — см. ниже.
  5. Ищите закономерности в ошибках: какие классы угадываются хуже, всегда ли ответ — одна метка, нет ли перекоса в сторону одного класса, как модель ведёт себя на неоднозначных примерах. Запишите выводы и итерируйте: улучшайте гиперпараметры по валидации, а потом проверяйте, переносится ли улучшение на тест.

Пересказ ноутбука 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 в роли судьи