В открытой лекции Института информационных технологий MIT OpenCourseWare подробно разбираются практические аспекты построения и обучения нейронных сетей с нуля с использованием библиотек TensorFlow и Keras. Слушатели знакомятся с фундаментальными концепциями тензоров, оптимизации и регуляризации на примере живых сессий в Google Colab. Основной фокус лектора направлен на решение задач бинарной классификации заболеваний сердца и распознавания многоклассовых изображений одежды из набора данных Fashion MNIST.
🔄 От градиентного спуска к мини-батчам 0:16
Процесс обучения нейронной сети концептуально не отличается от настройки других типов математических моделей. В системе есть набор параметров — веса (weights) и смещения (biases), оптимальные значения которых необходимо найти с помощью имеющихся данных. Мерой качества подбора параметров выступает функция потерь (loss function), которая рассчитывает расхождение между предсказаниями модели и истинными значениями (ground truth).
Стандартный цикл обучения выглядит следующим образом:
- Входные данные пропускаются через слои сети для получения предсказаний.
- Предсказания и истинные значения передаются в функцию потерь, генерирующую итоговую оценку (loss score).
- Оптимизатор вычисляет градиент функции потерь по отношению ко всем параметрам системы.
- Веса обновляются на основе вычисленного градиента, и процесс циклически повторяется.
При использовании классического алгоритма градиентного спуска (Gradient Descent) на каждой итерации для расчета потерь и градиентов привлекаются абсолютно все имеющиеся точки данных. По словам лектора, этот подход уступает стохастическому градиентному спуску (Stochastic Gradient Descent, SGD). В SGD вместо полного датасета случайным образом выбирается небольшое количество точек — мини-батч (или просто батч). Сеть делает предсказание, вычисляет лосс и обновляет веса только для этой подвыборки.
Разница между алгоритмами отражается на понятии эпохи (epoch) — одного полного прохода через весь объем обучающих данных. В обычном градиентном спуске одна эпоха означает один проход данных и ровно одно обновление весов (даже если выборка включает 10 миллиардов объектов). В SGD обучающие данные делятся на батчи. Обновление параметров происходит последовательно после каждого батча. Таким образом, за одну эпоху веса меняются столько раз, сколько батчей содержится в датасете.
Количество батчей в эпохе рассчитывается как размер обучающей выборки, деленный на размер батча и округленный в большую сторону. Например, для 194 пациентов при размере батча в 32 объекта получится 7 батчей. Первые шесть батчей будут содержать по 32 образца, а последний, седьмой — всего 2. Как отмечает преподаватель, батчи не обязательно должны быть строго одинакового размера.
Главное преимущество SGD заключается в том, что обновленные после первого батча веса становятся более точными, и второй батч обрабатывается уже на улучшенных коэффициентах. Это позволяет быстрее двигаться в правильном направлении, требуя меньше вычислительной мощности.
⚖️ Проблема переобучения и методы регуляризации 11:01
С ростом сложности модели (например, при добавлении в регрессию логарифмов или интерактивных членов) ошибка на обучающих данных неизбежно падает. Однако при чрезмерном усложнении возникает эффект переобучения (overfitting): модель подстраивается под индивидуальные особенности и «шум» обучающей выборки вместо выявления общих закономерностей. Обратная ситуация — недообучение (underfitting) — указывает на то, что у модели еще есть потенциал для улучшения. Задача инженера — найти баланс между ними.
Для создания качественных представлений данных нейросетям требуется много слоев. Например, языковая модель GPT-3 содержит 96 слоев. Большое количество слоев означает обилие параметров и, как следствие, высокий риск переобучения. Для борьбы с этим применяется регуляризация.
В рамках лекции рассматриваются два метода регуляризации:
- Ранняя остановка (Early Stopping): Данные делятся на обучающую и валидационную выборки. В процессе обучения фиксируется лосс на валидационном множестве. Как только ошибка на валидации прекращает падать и начинает расти, обучение останавливается. Лектор ссылается на одного из пионеров глубокого обучения Джеффа Хинтона, который образно назвал раннюю остановку «прекрасным бесплатным обедом».
- Исключение (Dropout): Крайне эффективная стратегия, детальный разбор которой отложен на следующее занятие.
В качестве базового оптимизатора преподаватель рекомендует использовать Adam — популярную и эффективную разновидность SGD, которая отлично сочетается с функцией активации ReLU в скрытых слоях. При этом валидационный набор данных никогда не участвует в расчете градиентов или обновлении весов, он служит исключительно целям независимой оценки качества, что «позволяет оставаться честными».
📐 Что такое тензор: от чисел до видеопотока 15:43
Тензор — это математический объект, представляющий собой обобщение понятий числа, вектора и матрицы для многомерных пространств. Каждый тензор обладает характеристикой, называемой рангом (rank) или количеством осей/размерностей:
- Ранг 0: Обычное число (скаляр), не имеющее размерности.
- Ранг 1: Вектор (одномерный список чисел).
- Ранг 2: Двумерная таблица (матрица), имеющая строки и столбцы. В компьютерном зрении так представляются черно-белые изображения.
- Ранг 3: Куб или набор таблиц. Пример — цветное изображение, состоящее из трех таблиц интенсивности каналов RGB (Red, Green, Blue).
- Ранг 4: Видеопоток, где первая размерность отвечает за номер кадра, а остальные три описывают сам цветной кадр.
По определению лектора, тензор ранга $N$ — это просто список тензоров ранга $N-1$. Так, список видеофайлов (каждый из которых имеет ранг 4) образует тензор ранга 5. Концепт тензоров изначально был предложен Альбертом Эйнштейном. Понимание этой структуры требует практики, так как тема может казаться ускользающей.
🛠️ Инструментарий: почему TensorFlow и Keras, а не PyTorch 22:55
Нейронная сеть работает как конвейер: тензоры поступают на вход, проходят сквозь слои и выходят с другого конца — отсюда и название библиотеки TensorFlow («поток тензоров»). TensorFlow предоставляет разработчикам ключевые преимущества:
- Автоматическое вычисление градиентов для функций потерь любой сложности (нет необходимости вручную применять правило дифференцирования сложной функции).
- Встроенный набор оптимизаторов (SGD и его вариации).
- Автоматическое распределение вычислительной нагрузки по нескольким серверам.
- Эффективная организация вычислений на параллельном оборудовании — графических процессорах (GPU) и тензорных процессорах (TPU от Google).
Фреймворк 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%. Любая спроектированная нейросеть должна показывать результат выше этого порога.
Архитектура создаваемой модели включает:
- Входной слой из 29 нейронов.
- Один скрытый полносвязный слой (
Dense) на 16 нейронов с активацией ReLU. - Выходной слой с одним нейроном и сигмоидной функцией активации (Sigmoid) для получения вероятности.
Общее число настраиваемых параметров сети составляет 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) можно увидеть даже невооруженным глазом. В цветных изображениях каждый пиксель кодируется уже тремя числами (интенсивность красного, зеленого и синего), формируя три параллельные таблицы (каналы).
Глубокое обучение позволяет решать широкий спектр задач компьютерного зрения:
- Классификация изображений (Image Classification): Определение того, какой именно объект из фиксированного списка присутствует на картинке (классический пример — «кошка против собаки»).
- Локализация (Localization): Не просто определение класса, но и нахождение координат объекта на снимке с выводом ограничивающей рамки (bounding box).
- Детекция объектов (Object Detection): Поиск, классификация и разметка рамками множества различных объектов на одном кадре. По такому принципу работают беспилотные автомобили, сканирующие окружение многократно за секунду.
- Семантическая сегментация (Semantic Segmentation): Попиксельная классификация, когда каждый пиксель изображения относится к определенной категории (дорога, трава, здания).
- Экземплярная сегментация (Instance Segmentation): Сложный тип сегментации, разделяющий не просто классы объектов, но и отдельные экземпляры одного и того же класса (например, окрашивание разных овец в кадре в индивидуальные цвета).
👕 Классификация одежды с 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 напрямую зависит от формата кодирования меток классов, предоставленного разработчиками датасета:
- Если классы закодированы через One-Hot Encoding (например,
[0, 0, 1, 0...]), применяется функцияCategoricalCrossentropy. - Если классы представлены в виде простых целых чисел от 0 до 9 (как в случае с используемым Fashion MNIST, где 0 — это футболка, а 9 — ботинок), необходима функция
SparseCategoricalCrossentropy(разреженная категориальная кросс-энтропия).
В завершение занятия лектор демонстрирует загрузку встроенного в Keras датасета Fashion MNIST, который уже разделен создателями на 60 000 обучающих и 10 000 тестовых картинок, и с помощью Matplotlib выводит на экран первые размытые силуэты обувных ботинок, на которых сети предстоит практиковаться.