Построение нейросетей с нуля: лекция MIT по TensorFlow, Keras и компьютерному зрению

MIT OpenCourseWare 35,3 тыс. 1 ч 17 мин 10 мин 07.01.2026
Главное

В открытой лекции Института информационных технологий MIT OpenCourseWare подробно разбираются практические аспекты построения и обучения нейронных сетей с нуля с использованием библиотек TensorFlow и Keras. Слушатели знакомятся с фундаментальными концепциями тензоров, оптимизации и регуляризации на примере живых сессий в Google Colab. Основной фокус лектора направлен на решение задач бинарной классификации заболеваний сердца и распознавания многоклассовых изображений одежды из набора данных Fashion MNIST.

🔄 От градиентного спуска к мини-батчам 0:16

Процесс обучения нейронной сети концептуально не отличается от настройки других типов математических моделей. В системе есть набор параметров — веса (weights) и смещения (biases), оптимальные значения которых необходимо найти с помощью имеющихся данных. Мерой качества подбора параметров выступает функция потерь (loss function), которая рассчитывает расхождение между предсказаниями модели и истинными значениями (ground truth).

Стандартный цикл обучения выглядит следующим образом:

  1. Входные данные пропускаются через слои сети для получения предсказаний.
  2. Предсказания и истинные значения передаются в функцию потерь, генерирующую итоговую оценку (loss score).
  3. Оптимизатор вычисляет градиент функции потерь по отношению ко всем параметрам системы.
  4. Веса обновляются на основе вычисленного градиента, и процесс циклически повторяется.

При использовании классического алгоритма градиентного спуска (Gradient Descent) на каждой итерации для расчета потерь и градиентов привлекаются абсолютно все имеющиеся точки данных. По словам лектора, этот подход уступает стохастическому градиентному спуску (Stochastic Gradient Descent, SGD). В SGD вместо полного датасета случайным образом выбирается небольшое количество точек — мини-батч (или просто батч). Сеть делает предсказание, вычисляет лосс и обновляет веса только для этой подвыборки.

Разница между алгоритмами отражается на понятии эпохи (epoch) — одного полного прохода через весь объем обучающих данных. В обычном градиентном спуске одна эпоха означает один проход данных и ровно одно обновление весов (даже если выборка включает 10 миллиардов объектов). В SGD обучающие данные делятся на батчи. Обновление параметров происходит последовательно после каждого батча. Таким образом, за одну эпоху веса меняются столько раз, сколько батчей содержится в датасете.

Количество батчей в эпохе рассчитывается как размер обучающей выборки, деленный на размер батча и округленный в большую сторону. Например, для 194 пациентов при размере батча в 32 объекта получится 7 батчей. Первые шесть батчей будут содержать по 32 образца, а последний, седьмой — всего 2. Как отмечает преподаватель, батчи не обязательно должны быть строго одинакового размера.

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

⚖️ Проблема переобучения и методы регуляризации 11:01

С ростом сложности модели (например, при добавлении в регрессию логарифмов или интерактивных членов) ошибка на обучающих данных неизбежно падает. Однако при чрезмерном усложнении возникает эффект переобучения (overfitting): модель подстраивается под индивидуальные особенности и «шум» обучающей выборки вместо выявления общих закономерностей. Обратная ситуация — недообучение (underfitting) — указывает на то, что у модели еще есть потенциал для улучшения. Задача инженера — найти баланс между ними.

Для создания качественных представлений данных нейросетям требуется много слоев. Например, языковая модель GPT-3 содержит 96 слоев. Большое количество слоев означает обилие параметров и, как следствие, высокий риск переобучения. Для борьбы с этим применяется регуляризация.

В рамках лекции рассматриваются два метода регуляризации:

В качестве базового оптимизатора преподаватель рекомендует использовать Adam — популярную и эффективную разновидность SGD, которая отлично сочетается с функцией активации ReLU в скрытых слоях. При этом валидационный набор данных никогда не участвует в расчете градиентов или обновлении весов, он служит исключительно целям независимой оценки качества, что «позволяет оставаться честными».

📐 Что такое тензор: от чисел до видеопотока 15:43

Тензор — это математический объект, представляющий собой обобщение понятий числа, вектора и матрицы для многомерных пространств. Каждый тензор обладает характеристикой, называемой рангом (rank) или количеством осей/размерностей:

По определению лектора, тензор ранга $N$ — это просто список тензоров ранга $N-1$. Так, список видеофайлов (каждый из которых имеет ранг 4) образует тензор ранга 5. Концепт тензоров изначально был предложен Альбертом Эйнштейном. Понимание этой структуры требует практики, так как тема может казаться ускользающей.

🛠️ Инструментарий: почему TensorFlow и Keras, а не PyTorch 22:55

Нейронная сеть работает как конвейер: тензоры поступают на вход, проходят сквозь слои и выходят с другого конца — отсюда и название библиотеки TensorFlow («поток тензоров»). TensorFlow предоставляет разработчикам ключевые преимущества:

Фреймворк Keras функционирует как высокоуровневая надстройка над TensorFlow, предлагая удобные инструменты: абстракции слоев (например, keras.dense), функции активации, встроенные метрики, средства предобработки данных и библиотеку предобученных моделей.

Отвечая на вопрос о сравнении с PyTorch, лектор подчеркивает, что PyTorch — отличный инструмент, но он более требователен к инженерной подготовке и глубокому знанию объектно-ориентированного программирования. TensorFlow и Keras были выбраны для учебного курса MIT, чтобы сделать его доступным для студентов без обширного бэкграунда в Computer Science. В Keras существуют три типа API (Sequential, Functional, Subclassing); в рамках курса используется преимущественно Functional API, напоминающий гибкий конструктор Lego для создания сложных топологий.

🏥 Практикум: предсказание болезней сердца в Colab 27:02

В первой практической сессии строится модель классификации для датасета из 303 пациентов. Целевая переменная — бинарный признак наличия сердечного заболевания (0 или 1). Датасет содержит дисбаланс классов: 72,6% пациентов здоровы, 27,4% имеют заболевание. Из этого факта выводится простейший базовый прогноз (baseline): если просто предсказывать всем ноль, точность (accuracy) составит 72,6%. Любая спроектированная нейросеть должна показывать результат выше этого порога.

Архитектура создаваемой модели включает:

Общее число настраиваемых параметров сети составляет 497. Лектор демонстрирует формулу ручного расчета:

$$29 \text{ (входы)} \times 16 \text{ (нейроны)} + 16 \text{ (смещения)} + 16 \times 1 \text{ (связи с выходом)} + 1 \text{ (смещение выхода)} = 497$$

Для бинарной классификации выбирается функция потерь Binary Cross Entropy (бинарная кросс-энтропия) и оптимизатор Adam. При компиляции модели (model.compile) Keras оптимизирует ее структуру под параллельные вычисления.

Перед обучением проводится обязательная предобработка данных вне Keras с помощью библиотек NumPy и Pandas. Категориальные переменные переводятся в числовой вид методом One-Hot Encoding (прямое кодирование через pd.get_dummies), поскольку нейросети не умеют работать с текстом напрямую. Численные признаки стандартизируются: из них вычитается среднее значение и результат делится на стандартное отклонение.

Важное правило: разбиение на обучающую (80%) и тестовую (20%) выборки должно происходить до стандартизации. Если рассчитать среднее по всему датасету до разделения, информация из тестового набора «просочится» в процесс обучения, что нарушит чистоту эксперимента. После удаления целевого признака обучающий набор приобретает размерность 242 строки на 29 колонок. Для контроля переобучения внутри метода model.fit задается параметр validation_split=0.2, отсекающий еще 20% данных от обучающей выборки на нужды валидации.

Модель намеренно обучается в течение 300 эпох с размером батча 32. Графики, построенные с помощью Matplotlib, показывают, что лосс на обучении стабильно падает, тогда как валидационный лосс после 50-й эпохи стабилизируется и начинает медленно расти — это признак начавшегося переобучения. Однако график точности на валидации в конце обучения ведет себя иначе и совершает небольшой рывок вверх.

Лектор объясняет это тем, что функция потерь (кросс-энтропия) — это непрерывный математический прокси-показатель, а точность — дискретная величина. Изменение предсказанной вероятности с 0,49 до 0,51 минимально скажется на лоссе, но радикально изменит класс и метрику точности. На финальном тесте (model.evaluate) на отложенной выборке сеть показывает точность 83,6%, успешно преодолевая базовый уровень в 72,6%.

👁️ Компьютерное зрение: как устроены цифровые изображения 58:17

В цифровой среде полутоновое (черно-белое) изображение — это двумерная таблица, где каждый пиксель отражает интенсивность света. Значения кодируются в диапазоне от 0 (полное отсутствие света, черный цвет) до 255 (ослепительно белый цвет). Если убрать цвета и посмотреть на матрицу цифр, очертания объектов (например, цифры 5) можно увидеть даже невооруженным глазом. В цветных изображениях каждый пиксель кодируется уже тремя числами (интенсивность красного, зеленого и синего), формируя три параллельные таблицы (каналы).

Глубокое обучение позволяет решать широкий спектр задач компьютерного зрения:

👕 Классификация одежды с Fashion MNIST и магия Softmax 1:04:27

Для демонстрации многоклассовой классификации взят сбалансированный датасет Fashion MNIST: 70 000 черно-белых изображений элементов одежды (размером 28 на 28 пикселей) по 10 категориям (футболки, брюки, ботинки и т.д.). Поскольку выборка распределена поровну (по 10% на каждый тип одежды), случайное угадывание дает базовую точность всего в 10%. Простая нейросеть способна поднять этот показатель почти до 90%.

Поскольку изображение размером 28 на 28 является тензором ранга 2, а классические полносвязные слои принимают на вход векторы, данные необходимо преобразовать. Процесс разворачивания матрицы в один длинный упорядоченный список называется «выравниванием» (flattening). Строки последовательно поворачиваются и стыкуются друг с другом, превращая квадрат 28 на 28 в вектор длиной 784 признака. Выравнивание меняет лишь организацию данных, но не их суть. Далее вектор направляется в скрытый слой из 256 нейронов с функцией активации ReLU.

На выходе из сети требуется получить 10 чисел. Однако использовать 10 независимых сигмоид нельзя: нам нужно определить один корректный класс, а значит, финальные вероятности для всех 10 категорий в сумме должны строго давать единицу (100%). Эту задачу решает функция Softmax (софтмакс). Алгоритм берет 10 линейных выходов сети, возводит константу $e$ (экспоненту) в степень каждого из этих чисел (что гарантирует получение положительных значений) и делит каждое значение на общую сумму получившихся экспонент. На выходе формируется корректное распределение вероятностей.

Принцип Softmax имеет колоссальное значение в современной индустрии искусственного интеллекта. Лектор приводит в пример работу большой языковой модели GPT-4: при генерации текста каждый раз, когда модель выдает следующее слово (токен), она фактически просчитывает Softmax огромного масштаба — на 52 000 возможных вариантов слов, выбирая наиболее вероятное из них.

Выбор функции потерь в Keras напрямую зависит от формата кодирования меток классов, предоставленного разработчиками датасета:

В завершение занятия лектор демонстрирует загрузку встроенного в Keras датасета Fashion MNIST, который уже разделен создателями на 60 000 обучающих и 10 000 тестовых картинок, и с помощью Matplotlib выводит на экран первые размытые силуэты обувных ботинок, на которых сети предстоит практиковаться.

💬 Цитаты

«Ранняя остановка — это прекрасный бесплатный обед.»

Джефф Хинтон (в пересказе лектора) 13:20

«Если вы перепечатываете код вручную, вместо того чтобы копировать и вставлять, поверьте мне, вы узнаете гораздо больше.»

👥 Спикер
📚 Упомянутые книги
🔗 Упомянутые сайты и проекты
📖 Термины
Тензор
Математический объект, расширяющий понятия векторов и матриц на пространства любой размерности.
Батч (Мини-батч)
Случайная подвыборка данных, на основе которой оптимизатор рассчитывает градиент и обновляет веса в SGD.
Выравнивание (Flattening)
Операция преобразования многомерного тензора (например, матрицы изображения) в одномерный вектор без изменения данных.
Softmax
Математическая функция, превращающая вектор произвольных чисел в вектор вероятностей, сумма которых равна единице.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект TensorFlow Keras Softmax Fashion MNIST Регуляризация