MIT Introduction to Deep Learning (2024) | 6.S191
Введение в курс по глубокому обучению
Приветствие и структура курса
- Преподаватели Александер Амини и Эва приветствуют студентов на курсе MIT SUS1 191, который будет интенсивным и быстрым.
- Курс охватывает основы быстро развивающейся области искусственного интеллекта (AI) и глубокого обучения, которая значительно изменилась за последние восемь лет.
- AI решает задачи, которые ранее считались нерешаемыми, демонстрируя производительность выше человеческой.
Изменения в преподавании
- Лекция становится все сложнее для преподавания из-за быстрого развития технологий в области AI и глубокого обучения.
- Вводная лекция раньше была более стабильной, но теперь она меняется каждый год из-за новых достижений в технологии.
Примеры использования AI
- Ранее созданное видео с использованием AI стало вирусным благодаря своей реалистичности; оно было создано за $10,000 всего за одну минуту.
- За несколько месяцев видео набрало более миллиона просмотров, что подчеркивает интерес к технологиям AI.
Современные достижения в глубоком обучении
- Сегодня технологии глубокого обучения стали доступными для широкой аудитории; они могут генерировать контент без необходимости программирования.
- Модели способны создавать уникальные изображения или даже писать код для других нейронных сетей на основе текстовых запросов.
Будущее курса и его цели
- Курс направлен на обучение основам создания различных моделей глубокого обучения от нуля до готовых решений.
Введение в глубокое обучение
Основы интеллекта и искусственного интеллекта
- Глубокое обучение — это важная концепция, которую необходимо понять в контексте других научных дисциплин.
- Интеллект можно определить как способность обрабатывать информацию для принятия будущих решений.
- Искусственный интеллект (ИИ) — это возможность компьютеров обрабатывать информацию аналогично человеку.
- Машинное обучение — подмножество ИИ, которое учит компьютеры принимать решения на основе данных, а не жестко закодированных правил.
- Глубокое обучение использует нейронные сети для обработки необработанных данных и извлечения информации из больших наборов данных.
Структура курса
- Курс состоит из технических лекций и лабораторных работ, направленных на практическое применение теории.
- Первая лекция охватывает основы нейронных сетей, начиная с перцептрона.
- В конце курса пройдет конкурс проектов, где студенты смогут представить свои работы и выиграть призы.
Лабораторные работы
- Первая лабораторная работа будет посвящена генерации музыки с использованием нейронной сети для создания новых композиций.
- Вторая лабораторная работа сосредоточится на системах распознавания лиц с использованием свёрточных нейронных сетей и устранением предвзятости в этих системах.
- Последняя лабораторная работа будет связана с крупными языковыми моделями, где студенты создадут чатбота с оценкой когнитивных способностей.
Ресурсы и поддержка
- Все ресурсы курса будут доступны онлайн; вопросы можно задавать через платформу Piaza.
Почему мы изучаем глубокое обучение?
Введение в глубокое обучение
- Обсуждение важности глубокого обучения и его актуальности в современном мире. Спикер задает вопрос о том, почему аудитория заинтересована в этом курсе.
Эволюция машинного обучения
- Ранее машинное обучение основывалось на ручном определении признаков, что делало модели хрупкими и зависимыми от человеческого вмешательства.
- Ключевая идея заключается в переходе от ручной инженерии признаков к обучению моделей непосредственно на сырых данных.
Применение глубокого обучения
- Пример обнаружения лиц: компьютеры ищут определенные паттерны (глаза, носы, уши), чтобы идентифицировать лица.
- Глубокое обучение позволяет выделять основные элементы из данных для принятия решений.
Причины популярности глубокого обучения сегодня
- Доступность больших объемов данных: современные модели требуют много данных для эффективного обучения.
- Увеличение вычислительных мощностей благодаря GPU, которые идеально подходят для параллельной обработки информации.
- Развитие открытых программных инструментов упрощает создание и развертывание моделей глубокого обучения.
Что такое перцептрон?
Основные компоненты нейронной сети
- Перцептрон — это базовый строительный блок нейронной сети; каждая нейронная сеть состоит из множества перцептронов.
Процесс передачи информации через нейрон
- Нейроны принимают несколько входных значений (X1, X2,... XM), каждое из которых умножается на соответствующий вес (W1,... WM).
Вычисление выходного значения
- После умножения входных значений на веса они суммируются и проходят через нелинейную активационную функцию для получения окончательного выхода (Y).
Влияние смещения на активацию нейрона
Как работают нейронные сети?
Входные данные и веса
- Входные данные обозначаются вектором X, который включает все входы от X1 до XM. Веса обозначаются вектором W, состоящим из W1 до WM.
- Для получения выходного значения используется скалярное произведение векторов X и W, что подразумевает поэлементное умножение и последующее суммирование.
Нелинейность и активационные функции
- К результату добавляется смещение (bias), обозначаемое как w0, после чего применяется нелинейная функция активации, обозначенная как Z или G.
- Одной из распространенных активационных функций является сигмоидальная функция, которая преобразует любое действительное число в диапазон от 0 до 1.
- Сигмоидальная функция часто используется для вероятностных распределений, позволяя нейронам обучаться на вероятностях.
Разнообразие активационных функций
- Существуют различные типы нелинейных активационных функций. На слайде представлены три наиболее популярных: сигмоидальная функция слева, ReLU (Rectified Linear Unit) справа.
- Функция ReLU линейна во всех точках за исключением x = 0, где происходит разрыв. Это делает её быстрой для вычислений и сохраняет необходимую нелинейность.
Зачем нужна нелинейность?
- Нелинейные функции позволяют нейронным сетям обрабатывать нелинейные данные. Реальные наборы данных часто имеют сложную структуру.
- Пример: чтобы разделить точки разных классов (зеленые и красные), требуется использование нелинейной функции; линейная модель не справится с этой задачей.
Применение обученной нейронной сети
- Обученная нейронная сеть имеет заданные веса. Например, если смещение w0 равно 1, а веса W составляют 3 и 2.
- Для получения выхода сети необходимо выполнить те же шаги: скалярное произведение входов с весами, добавить смещение и применить нелинейность.
Как работает нейрон?
Визуализация нейрона и его функции
- Нейрон можно представить в двумерном пространстве, где линия определяет его поведение. Если новая точка данных (X1 = -1, X2 = 2) попадает с одной стороны линии, это влияет на результат.
- Подставляя значения -1 и 2 в уравнение нейрона, получаем значение -6. Применяя нелинейную функцию G к этому значению, итоговый выход составляет 0.2.
- Сигмоидная функция делит пространство на две части: все значения меньше 0.5 и больше 0.5, что зависит от положения точки относительно линии.
- Если входное значение меньше нуля, выход будет менее 0.5; если больше — выход будет более 0.5.
Простота нейрона и сложность сетей
- Обсуждается простота одного нейрона по сравнению с многими параметрами современных нейросетей, которые могут иметь миллионы или даже миллиарды весов.
- В реальных нейросетях количество параметров значительно увеличивается, что делает визуализацию их работы более сложной задачей.
Основы перцептрона
- Ключевым моментом лекции является понимание работы перцептрона: произведение скалярных величин с входами, добавление смещения и применение нелинейности.
- Упрощая диаграмму перцептрона, можно заметить связь между линиями и весами; каждая линия имеет свой вес.
Многофункциональные выходы
- При наличии нескольких выходов можно использовать несколько нейронов в сети; каждый из них предсказывает свой собственный ответ независимо друг от друга.
- Каждый нейрон имеет свои веса и может взаимодействовать с другими слоями сети для передачи информации.
Программирование нейросети
- Для создания простой нейросети необходимо определить процесс передачи информации через сеть: умножение матриц входных данных на веса и добавление смещения перед применением нелинейности.
Пример создания плотного слоя
Инициализация плотного слоя
- Пример инициализации плотного слоя с двумя нейронами, который принимает произвольный набор входных данных. Код на TensorFlow упрощает этот процесс до одной строки, что делает его удобным для использования.
Однослойная нейронная сеть
Структура сети
- Обсуждение однослойной нейронной сети, где один скрытый слой находится между входами и выходами. Это увеличивает сложность сети и добавляет больше возможностей для обучения.
Скрытые слои
- Скрытый слой не наблюдается напрямую, но он важен для увеличения емкости сети. Наличие функции преобразования от входов к скрытым слоям и от скрытых слоев к выходам создает двухслойную нейронную сеть.
Матрицы весов в нейронной сети
Веса и нелинейности
- Введение второй матрицы весов (W2), которая отвечает за преобразование из скрытого слоя в выходной слой. Каждый скрытый слой имеет свою нелинейность, что предотвращает превращение всей сети в линейную функцию.
Анализ единицы в скрытом слое
Вычисление ответа нейрона
- Рассмотрение второго нейрона (Z2) в первом слое: его ответ вычисляется через скалярное произведение весов с входами, добавление смещения и применение нелинейности.
Полностью связанный слой
Связь между входами и выходами
- Переход к полностью связанному слою, где каждый элемент входа соединен с каждым элементом выхода. Процесс остается прежним: скалярное произведение, смещение и нелинейность.
Глубокие нейронные сети
Создание глубокой модели
- Обсуждение концепции глубоких нейронных сетей: создание многоуровневых моделей путем последовательного наложения слоев друг на друга для более сложных вычислений.
Применение нейросетей для решения реальных задач
Проблема предсказания успеха в учебе
Как нейронные сети помогают предсказать успех в учебе?
Введение в задачу
- Нейронная сеть может помочь определить вероятность успешной сдачи курса на основе двух входных данных: количества посещенных лекций и часов, потраченных на финальный проект.
- Прогнозируемая вероятность успешной сдачи курса составляет 10%, что является неблагоприятным результатом, несмотря на то, что фактическая вероятность равна 100%.
Проблемы с обучением нейронной сети
- Нейронная сеть не была обучена, поэтому она не может правильно интерпретировать данные. Это похоже на младенца, который ничего не знает до тех пор, пока ему не покажут информацию.
- Для обучения нейронной сети необходимо сообщить ей о неправильных решениях, чтобы она могла учиться и улучшаться.
Обучение и оценка ошибок
- Важно информировать нейронную сеть о том, когда ее ответы неверны. Это позволяет ей корректировать свои прогнозы.
- Мы вычисляем "потерю" (loss), которая показывает разницу между предсказанным значением и истинным значением. Чем ближе эти значения друг к другу, тем меньше потеря.
Использование данных для обучения
- Обучение происходит не только на одном студенте; важно учитывать данные многих студентов для более точного обучения модели.
- Цель состоит в том, чтобы минимизировать эмпирическую потерю между предсказаниями и истинными значениями по всем данным.
Функции потерь и их применение
- Для бинарной классификации можно использовать функцию softmax или кросс-энтропию для оценки правильности ответов нейронной сети.
- Если мы хотим предсказать реальное значение (например, оценку), используем среднеквадратичную ошибку как функцию потерь.
Оптимизация весов нейронной сети
- Задача заключается в нахождении оптимальных весов (вектора W), которые минимизируют потерю по всем данным.
- Вектор W представляет собой набор чисел для каждого слоя и каждого нейрона в нейронной сети. Его нужно вычислить на основе имеющихся данных.
Визуализация функции потерь
Понимание градиентного спуска
Основы градиентного спуска
- Для любых весов W1 и W2 необходимо определить функцию потерь, чтобы найти минимальное значение потерь. Чем меньше потери, тем лучше.
- Начинаем с произвольной точки в пространстве весов и вычисляем градиент функции потерь в этой точке, что дает представление о том, куда двигаться для уменьшения потерь.
- Двигаемся в противоположном направлении от градиента, чтобы уменьшить значения функции потерь. Этот процесс повторяется до тех пор, пока не достигнем локального минимума.
- Алгоритм называется градиентным спуском: начинаем с случайной инициализации весов, вычисляем градиенты и продолжаем итерации до сходимости.
- Важно понимать шаги алгоритма: инициализация весов, вычисление градиента и движение в сторону уменьшения функции потерь.
Кодирование процесса
- При обучении нейронной сети веса всегда инициализируются случайно. Затем начинается цикл для вычисления потерь и обновления весов на основе градиентов.
- Градиент показывает направление увеличения функции потерь; его отрицательное значение указывает на направление движения для уменьшения этих потерь.
Обратное распространение ошибки
- Процесс обратного распространения ошибки позволяет вычислить как изменения каждого веса влияют на функцию потерь. Начинаем с простейшей нейронной сети — одного нейрона.
- Вычисляем производную функции потерь по отношению к весу W2, используя правило цепочки для анализа влияния изменений этого веса на общие потери.
Распространение градиентов
- Для получения производной по W1 применяем то же правило цепочки, продвигаясь назад через слои нейронной сети. Это позволяет получить полное представление о влиянии всех весов на функцию потерь.
- Повторяем процесс для всех весов в сети, чтобы понять влияние каждого из них на итоговые результаты обучения.
Нейрон vs Перцептрон
Обратное распространение информации в нейронных сетях
Теория обратного распространения
- Обратное распространение (backpropagation) — это алгоритм, который позволяет изменять веса в нейронной сети для улучшения потерь. Он основан на цепном правиле и достаточно прост в теории.
- Современные библиотеки глубокого обучения автоматизируют процесс вычисления обратного распространения, что упрощает реализацию.
Практика оптимизации нейронных сетей
- Оптимизация нейронных сетей на практике значительно сложнее и требует больших вычислительных ресурсов.
- Исследования показывают, что ландшафт потерь глубокой нейронной сети может быть очень запутанным, что затрудняет нахождение глобального минимума.
Важность начальной инициализации
- Начальная инициализация весов имеет критическое значение: плохая инициализация может привести к застреванию в локальных минимумах.
- Для улучшения оптимизации необходимо разрабатывать архитектуры нейронных сетей с более "дружественными" ландшафтами потерь.
Настройка скорости обучения
- Скорость обучения — это параметр, который определяет размер шага при обновлении весов. Неправильная настройка может привести к медленной сходимости или расхождению модели.
- Идеальная скорость обучения должна быть достаточно большой для избежания локальных минимумов, но не слишком большой, чтобы избежать расхождения.
Адаптивные методы настройки скорости обучения
- Один из подходов — пробовать различные значения скорости обучения и наблюдать за результатами. Это практический метод, хотя можно использовать более умные алгоритмы.
- Возможны адаптивные скорости обучения, которые меняются в зависимости от градиентов функции потерь. Это позволяет лучше подстраиваться под особенности данных и ландшафта потерь.
Ограничения поиска по пространству весов
- Пространство весов не является замкнутым; оно бесконечно во всех направлениях. Поиск по всем возможным весам становится непрактичным даже для небольших моделей.
- В реальности количество измерений огромно (миллиарды), что делает поиск абсолютного минимума невозможным без применения эффективных методов оптимизации.
Оптимизация нейронных сетей с помощью стохастического градиентного спуска
Определение оптимизатора
- Модель определяет оптимизатор, который ранее обозначался как градиентный спуск. Здесь он называется стохастическим градиентным спуском (SGD).
- Оптимизатор может быть любым из адаптивных оптимизаторов, и важно тестировать различные методы для понимания их влияния на процесс обучения.
Пакетирование данных
- Обсуждается концепция пакетирования данных, где вместо использования всех данных одновременно применяется метод мини-пакетов.
- Градиенты вычисляются по всем данным, что является вычислительно затратной операцией. Это становится непрактичным при больших наборах данных.
Стохастический градиентный спуск (SGD)
- В SGD используется один обучающий пример для вычисления градиента, что упрощает процесс, но приводит к шуму в оценках.
- Мини-пакеты представляют собой компромисс между использованием одного примера и полным набором данных. Например, размер пакета 32 позволяет быстрее оценивать градиенты.
Преимущества мини-пакетов
- Использование мини-пакетов увеличивает точность оценки градиентов и ускоряет сходимость к решению.
- Мини-пакеты позволяют параллелить вычисления на различных ядрах GPU, что значительно увеличивает скорость обработки.
Переобучение и недообучение
- Переобучение — это проблема не только глубокого обучения; она существует во всех областях машинного обучения.
- Ключевая задача заключается в том, чтобы модель могла обобщать данные и хорошо работать на новых тестовых примерах.
Баланс между переобучением и недообучением
- Если модель показывает хорошие результаты на обучающих данных, но плохие на тестовых — это признак переобучения.
Регуляризация в нейронных сетях
Что такое регуляризация?
- Регуляризация — это техника, которая помогает предотвратить переобучение модели, ограничивая её способность учиться на нюансах обучающих данных.
- Основная цель регуляризации — улучшить обобщающую способность модели не только на обучающих данных, но и на тестовых.
Техника Dropout
- Dropout — популярная техника регуляризации, при которой во время обучения случайным образом отключаются некоторые нейроны (активации устанавливаются в ноль).
- Например, если вероятность отключения составляет 50%, то половина нейронов будет "выключена" в каждом проходе вперёд.
- Это снижает ёмкость нейронной сети и заставляет её постоянно находить новые пути для передачи информации от входа к выходу.
- Такой подход предотвращает чрезмерную зависимость от небольших частей признаков в обучающих данных.
Раннее остановка (Early Stopping)
- Вторая техника регуляризации — ранняя остановка. Она применяется ко всем моделям и основана на мониторинге производительности на тестовом наборе.
- Переобучение происходит, когда модель начинает показывать худшие результаты на тестовом наборе по сравнению с обучающим.
График потерь
- На графике потерь видно, что сначала обе метрики (обучающая и тестовая потери) снижаются. Однако затем тестовая потеря начинает расти, что указывает на переобучение.
- Важно остановить обучение до момента начала ухудшения результатов на тестовом наборе.
Ключевые моменты лекции
- Лекция охватывает основные строительные блоки нейронных сетей: от перцептрона до сложных архитектур.