Understanding Deep Learning: путеводитель по книге
Путеводитель по учебнику Саймона Принса «Understanding Deep Learning» (MIT Press, 2023): карта всех 21 главы с уроками курса, конспекты ключевых глав — кусочно-линейные сети, инициализация, остаточные сети, трансформеры, диффузия, RL, «почему глубокое обучение работает» — и 68 ноутбуков к ним.
Что это и для кого
Заголовок раздела «Что это и для кого»«Understanding Deep Learning» (UDL) — учебник Саймона Принса, вышедший в MIT Press в 2023 году; полный PDF бесплатно лежит на сайте книги. В предисловии автор объясняет название: это книга об идеях, на которых держится глубокое обучение, а не о коде. И отчасти шутка: по-настоящему глубокое обучение пока не понимает никто. Себя Принс видит «духовным наследником» классического «Deep Learning» Гудфеллоу и др. (2016), который не покрывает новые темы.
Сильные стороны книги:
- схемы — около 300 пронумерованных рисунков, в основном авторских; Принс старался объяснять известные идеи по-новому, а не пересказывать статьи;
- единая нотация (её стоит посмотреть в приложении A до чтения);
- после каждой главы — заметки с историей и литературой, задачи (ответы на часть — в «Answer Booklet» для студентов) и ноутбуки Python, на которые есть ссылки на полях.
Для кого: первые главы (2–13) требуют начальной линейной алгебры, анализа и вероятностей — уровня нашей ступени 1. Главы о порождающих моделях и RL (14–19) требуют больше вероятностей и анализа. Наш ученик может читать UDL параллельно ступеням 3–4 как «вторую точку зрения» на темы уроков, а главы 15–19 — к ступеням 6 и 9.
Как читать вместе с курсом
Заголовок раздела «Как читать вместе с курсом»- Ступень 3. Главы 3–4 (поверхностные и глубокие сети) — вместе с уроком 3.1.1; главы 5–7 (потери, оптимизация, backprop, инициализация) — вместе с 3.1.2, модулем 3.2 и уроком 3.4.1; главы 8–9 (обобщение, регуляризация) — как повторение ступени 2; главы 10–11 (CNN, остаточные сети) — к урокам 3.5 и 3.4.2.
- Ступень 4. Глава 12 (трансформеры) — к модулям 4.4 и 4.5.
- Ступень 6. Глава 19 (RL) — к модулю 6.0, вместе со Spinning Up и Саттоном–Барто.
- Ступень 9. Главы 14–18 (порождающие модели) — к модулю 9.1, глава 21 (этика) — к уроку 9.3.5.
- В любой момент после ступени 3 — глава 20 «Почему глубокое обучение работает?»: лучшая обзорная глава книги.
Решайте задачи в конце глав хотя бы выборочно и обязательно запускайте ноутбуки: они короткие, работают на CPU и написаны в стиле «допишите пропущенный кусок кода».
Карта книги
Заголовок раздела «Карта книги»| Глава | О чём | Ноутбуки | Урок курса | Важность для нас |
|---|---|---|---|---|
| 1. Введение | обучение с учителем, без учителя, с подкреплением; этика; как читать книгу | 1.1 — повторение математики | 2.1.1 | ★ |
| 2. Обучение с учителем | модель, потери, обучение на примере линейной регрессии | 2.1 | 2.2.1 | ★ |
| 3. Поверхностные сети | один скрытый слой, ReLU, кусочно-линейные области, теорема об универсальной аппроксимации | 3.1–3.4 | 3.1.1 | ★★★ |
| 4. Глубокие сети | композиция сетей как «складывание» пространства, матричная запись, глубина против ширины | 4.1–4.3 | 3.1.1 | ★★★ |
| 5. Функции потерь | максимум правдоподобия как рецепт построения потерь; регрессия, бинарная и многоклассовая классификация; кросс-энтропия | 5.1–5.3 | 1.3.2 | ★★★ |
| 6. Обучение моделей | градиентный спуск, SGD, momentum, Adam, гиперпараметры | 6.1–6.5 | 1.4.1, 1.4.2 | ★★ |
| 7. Градиенты и инициализация | backprop на игрушечной модели и в общем виде, инициализация He, пример кода на PyTorch | 7.1–7.3 | 3.1.2, 3.2.2, 3.4.1 | ★★★ |
| 8. Измерение качества | источники ошибки: шум, смещение, дисперсия; двойной спуск; выбор гиперпараметров | 8.1–8.4 | 2.1.2 | ★★ |
| 9. Регуляризация | явная (L2) и неявная регуляризация, ранняя остановка, ансамбли, dropout, аугментация, байесовский подход | 9.1–9.5 | 2.1.2, 3.4.2 | ★★ |
| 10. Свёрточные сети | инвариантность и эквивариантность, 1D и 2D свёртки, понижение и повышение разрешения, приложения | 10.1–10.5 | 3.5.1, 3.5.2 | ★★ |
| 11. Остаточные сети | остаточные связи и блоки, взрыв дисперсии, batch norm, ResNet, U-Net | 11.1–11.3 | 3.4.1, 3.4.2 | ★★★ |
| 12. Трансформеры | скалярное самовнимание, многоголовость, слой трансформера, BERT, GPT-3, перевод, длинные последовательности, ViT | 12.1–12.4 | 4.4.2, 4.5.1, 4.5.4 | ★★★ |
| 13. Графовые сети | представление графов, графовые свёртки, классификация графов и вершин, графовое внимание | 13.1–13.4 | нет в курсе | ☆ |
| 14. Обучение без учителя | таксономия порождающих моделей, что такое хорошая порождающая модель, метрики | — | 9.1.3 | ★ |
| 15. GAN | дискриминатор как сигнал, устойчивость (Вассерштейн), условная генерация, StyleGAN | 15.1–15.2 | 9.1.3 | ★ |
| 16. Нормализующие потоки | обратимые слои, якобианы, многомасштабные потоки | 16.1–16.3 | 9.1.4 | ★ |
| 17. VAE | модели со скрытой переменной, ELBO, трюк репараметризации | 17.1–17.3 | 9.1.3 | ★★ |
| 18. Диффузионные модели | прямой и обратный процессы, обучение через ELBO, предсказание шума, ускорение и условная генерация | 18.1–18.4 | 9.1.2 | ★★★ |
| 19. Обучение с подкреплением | MDP, отдача, табличные методы, Q-learning, градиент политики, actor-critic, офлайн-RL | 19.1–19.5 | 6.0.1–6.0.3 | ★★ |
| 20. Почему глубокое обучение работает? | почему сети легко обучаются и хорошо обобщают, ландшафт потерь, нужны ли столько параметров и глубина | 20.1–20.4 | 2.1.2, 5.1.1 | ★★★ |
| 21. Этика | выравнивание ценностей, злоупотребления, ответственность исследователя | 21.1–21.2 | 9.3.5 | ★★ |
| Приложения A–C | нотация, математика, вероятности | — | ступень 1 | ★ |
Звёзды — наша оценка важности для курса: ★★★ — читать обязательно, ☆ — можно пропустить.
Конспекты ключевых глав
Заголовок раздела «Конспекты ключевых глав»Ниже — пересказ своими словами. Нумерация глав и разделов — как в книге, чтобы легко было найти место в PDF.
Главы 3–4. Нейросеть как кусочно-линейная функция
Заголовок раздела «Главы 3–4. Нейросеть как кусочно-линейная функция»Главная «фирменная» идея книги. Поверхностная сеть с ReLU (ReLUReLU (выпрямитель)EN rectified linear unit (ReLU)ReLU(z) = max(0, z). Дешёвая, не насыщается при z > 0; минус — «мёртвые» нейроны, у которых z < 0 на всех примерах.) делает три вещи: считает несколько линейных функций входа, пропускает каждую через ReLU и складывает результаты с весами. Каждый скрытый нейрон добавляет к графику один «излом» — точку, где ReLU переходит из нуля в прямую. Итог — непрерывная кусочно-линейная функция: вход разбит на линейные области, на каждой выход — линейная функция. С достаточным числом нейронов такая сеть приблизит любую непрерывную функцию (теорема об универсальной аппроксимациитеорема об универсальной аппроксимацииEN universal approximation theoremСеть с одним скрытым слоем и неполиномиальной активацией приближает любую непрерывную функцию на ограниченной области. Ничего не говорит о числе нейронов, обучении и обобщении.).
Глава 4 объясняет, зачем глубина. Если подать выход одной поверхностной сети на вход другой, первая сеть как бы складывает пространство входов (несколько точек входа дают одно значение), а вторая применяет свою кусочно-линейную функцию — и её эффект повторяется на каждом сгибе. Поэтому у глубокой сети гораздо больше линейных областей на один параметр. Вывод главы (пять пунктов): обе сети универсальны; у глубоких больше областей на параметр; некоторые функции глубокая сеть приближает гораздо экономнее; большие структурированные входы (картинки) удобнее обрабатывать по стадиям; на практике лучшие результаты дают глубокие сети. Ноутбук 3.3 считает число областей, 4.1 показывает «складывание».
Глава 7. Градиенты и инициализация
Заголовок раздела «Глава 7. Градиенты и инициализация»Первая половина — обратное распространение: сначала на игрушечной модели вручную (ноутбук 7.1), затем в матричной форме для глубокой сети (7.2). Наш курс проходит то же в модуле 3.2.
Вторая половина — инициализация. Если веса слоя взяты с дисперсией , а смещения — нули, то от слоя к слою
дисперсия предактиваций умножается примерно на : множитель даёт сумма по входам, а
— ReLU, который обнуляет половину значений. Чтобы дисперсия не таяла и не взрывалась, нужно
— инициализация He (инициализация Kaimingинициализация Kaiming (He)EN Kaiming / He initializationVar(w) = 2 / n_in (He и соавт., MSRA, 2015). Двойка компенсирует то, что ReLU обнуляет половину входов. В PyTorch — nn.init.kaiming_normal_.). Тот же вывод для обратного прохода даёт
(размер следующего слоя); если размеры разные, берут компромисс — среднее. Без этого значения на глубоких
слоях выходят за пределы чисел с плавающей точкой — это затухающие и взрывающиеся градиенты
(затухание градиентовзатухание градиентовEN vanishing gradientsГрадиент первых слоёв — произведение множителей всех слоёв выше; если они меньше 1, он экспоненциально уменьшается с глубиной (0.9⁵⁰ ≈ 0.005), и нижние слои перестают учиться.). Глава заканчивается полным примером обучения на PyTorch (nn.Sequential,
kaiming_normal_, SGD, StepLR) — его стоит набрать руками после урока 3.3.2.
Глава 11. Остаточные сети
Заголовок раздела «Глава 11. Остаточные сети»Если просто наращивать глубину, ошибка на обучении и на тесте у классификаторов изображений растёт. Принс объясняет это так: градиент по параметрам ранних слоёв меняется быстро и непредсказуемо по сравнению с размером шага («раздробленные градиенты», ноутбук 11.1). Остаточная связь (остаточная связьостаточная связьEN residual connection) прибавляет результат блока к его входу: каждый слой влияет на выход и напрямую, и через последующие слои, поэтому градиенту не обязательно проходить через все слои, а поверхность потерь становится глаже. Взамен появляется другая беда: дисперсия активаций при прямом проходе растёт экспоненциально по числу блоков. Её лечат batch norm (пакетная нормализацияпакетная нормализация (BatchNorm)EN batch normalizationНормирует каждый признак по примерам батча, хранит скользящие статистики для инференса (Ioffe, Szegedy, 2015). Стандарт CNN; в LLM не используется.), которая нормирует по батчу и затем сдвигает и масштабирует обучаемыми параметрами; к тому же шум статистик батча работает как регуляризация. Дальше — ResNet, DenseNet, U-Net и «песочные часы» для оценки позы. В трансформерах (глава 12) та же схема, только нормализация — LayerNorm.
Глава 12. Трансформеры
Заголовок раздела «Глава 12. Трансформеры»Принс выводит самовнимание из двух требований к модели текста: (1) общие параметры, чтобы работать с текстами разной длины; (2) связи между словами, зависящие от самих слов. Его запись отличается от нашей: входы — векторы- столбцы , а выход для позиции — взвешенная сумма значений , где веса неотрицательны и в сумме дают 1. Удобный образ из книги — самовнимание как маршрутизация: каждое выходное место по-своему смешивает одни и те же «значения». Отсюда видно, почему число весов внимания растёт как по длине, но не зависит от размера вектора , а вычисление значений — линейно по с общими весами.
Дальше в главе: веса через скалярные произведения запросов и ключей и softmax, масштабирование на , позиционное кодирование, многоголовое внимание, слой трансформера (внимание + MLP, остаточные связи, LayerNorm); три вида моделей на примерах — кодировщик BERT, декодер GPT-3, кодировщик-декодер для перевода; длинные последовательности (разреженные матрицы внимания) и трансформеры для изображений (ViT). Ноутбуки 12.1–12.2 реализуют самовнимание и многоголовое внимание на NumPy, 12.3 — токенизацию, 12.4 — стратегии декодирования. Эта глава хорошо дополняет уроки 4.4.2 и 4.5.1: переведите формулы Принса в нашу «строчную» запись — отличное упражнение.
Глава 18. Диффузионные модели
Заголовок раздела «Глава 18. Диффузионные модели»Диффузионная модель (диффузионная модельдиффузионная модельEN diffusion model) переводит пример данных через цепочку скрытых переменных, многократно подмешивая шум; после достаточного числа шагов от картинки остаётся белый шум. Поскольку каждый шаг маленький, обратный шаг «убрать немного шума» можно приблизить нормальным распределением, а его параметры — предсказать нейросетью. Потеря выводится из нижней границы правдоподобия (ELBO, как у VAE в главе 17) и в итоге сводится к простой квадратичной ошибке предсказания шума. Для изображений каждый шаг — это U-Net, поэтому генерация медленная; её ускоряют детерминированной формулировкой, где хватает меньшего числа шагов. Глава заканчивается условной генерацией — по классу, картинке и тексту, из чего и вырастают модели «текст → изображение». Ноутбуки 18.1–18.4 делают одномерную диффузию от начала до конца — идеальная практика к уроку 9.1.2.
Глава 19. Обучение с подкреплением
Заголовок раздела «Глава 19. Обучение с подкреплением»Автор честно предупреждает, что RL заслуживает отдельной книги, и даёт вводный обзор: MDP, отдача и политика; табличные методы — динамическое программирование (модель среды известна), Монте-Карло (обновление после эпизодов) и TD-методы (обновление по ходу эпизода); глубокий Q-learning (уровень человека в играх Atari 2600); градиент политики, стохастические политики (важны при частичной наблюдаемости) и борьба с дисперсией; actor-critic; офлайн-RL и Decision Transformer. Глава хороша как короткая карта перед модулем 6.0; глубже — Spinning Up и конспект обзора Венг о градиенте политики. Ноутбуки 19.1–19.5 — MDP, динамическое программирование, Монте-Карло, TD-методы и контрольные переменные (тот самый baseline для уменьшения дисперсии).
Глава 20. Почему глубокое обучение работает?
Заголовок раздела «Глава 20. Почему глубокое обучение работает?»Самая «исследовательская» глава. Принс сначала убеждает, что успех глубокого обучения удивителен: функции потерь огромной размерности должны быть трудны для оптимизации, а сети с параметрами больше, чем примеров, должны переобучаться. Затем разбирает, что известно:
- Обучение. Два главных фактора, делающих оптимизацию посильной, — избыточная параметризация и выбор функции активации. Сети легко подгоняют даже случайные метки (ноутбук 20.1). По ходу обучения параметры движутся в подпространстве малой размерности к одному из семейства связанных глобальных минимумов; плохих локальных минимумов на практике не видно.
- Обобщение. Тоже улучшается с ростом числа параметров (двойной спуск из главы 8); важны плоскость минимума и индуктивное смещение архитектуры.
- Нужно ли столько параметров? Гипотеза «лотерейного билета» (ноутбук 20.3): внутри большой сети есть маленькая подсеть, которая обучается не хуже.
- Нужна ли глубина? Похоже, хорошему обобщению нужны и много параметров, и много слоёв, но почему — неизвестно.
Итог главы: предсказательной теории, которая говорила бы заранее, когда обучение и обобщение удадутся, пока нет; глубокое обучение движется эмпирическими демонстрациями, а понимание отстаёт.
Что сделать руками
Заголовок раздела «Что сделать руками»Проверьте вывод главы 7 сами — 50 слоёв ReLU шириной 100 и три варианта дисперсии весов:
import numpy as nprng = np.random.default_rng(0)D, layers = 100, 50 # ширина слоя и число слоёвx = rng.normal(size=(D, 1000)) # 1000 случайных входов-столбцов (как у Принса: векторы-столбцы)
for name, var in [("σ² = 1/D", 1 / D), ("σ² = 2/D (He)", 2 / D), ("σ² = 4/D", 4 / D)]: h = x for k in range(layers): omega = rng.normal(0, np.sqrt(var), size=(D, D)) # веса слоя, смещения нулевые f = omega @ h # предактивации f = Ω h h = np.maximum(f, 0) # ReLU print(f"{name:14}: дисперсия предактиваций после {layers} слоёв = {f.var():.3g}")Ожидаемый вывод:
σ² = 1/D : дисперсия предактиваций после 50 слоёв = 1.39e-15σ² = 2/D (He) : дисперсия предактиваций после 50 слоёв = 0.618σ² = 4/D : дисперсия предактиваций после 50 слоёв = 3.1e+14При каждый слой умножает дисперсию примерно на , и за 50 слоёв она падает до ; при — умножает на 2 и взрывается до . Инициализация He держит её порядка единицы (отклонение от 1 — случайный разброс конечной ширины).
Минимальный набор ноутбуков, если времени мало: 3.3 (линейные области), 4.1 (композиция сетей), 5.3 (многоклассовая кросс-энтропия), 6.4–6.5 (momentum и Adam), 7.2–7.3 (backprop и инициализация), 8.3 (двойной спуск), 11.2 (остаточные сети), 12.1–12.2 (самовнимание), 18.2 (одномерная диффузия), 19.4 (TD-методы).
Что ещё есть у книги
Заголовок раздела «Что ещё есть у книги»- Errata — список опечаток; PDF на сайте регулярно обновляется.
- Ответы на задачи для студентов.
- Слайды и материалы для преподавателей — в папках
SlidesиCM20315репозитория. - Блоги автора на RBC Borealis о нейронном касательном ядре, гауссовых процессах и ОДУ в машинном обучении — ссылки на сайте книги. Это продвинутое чтение после главы 20.
Что читать дальше. Сам Принс рекомендует: для кода — «Dive into Deep Learning» (у неё есть китайская версия d2l-zh, «Погружение в глубокое обучение»); для шире о машинном обучении — «Probabilistic Machine Learning» Мёрфи; для RL — Саттона и Барто; для математики — «Mathematics for Machine Learning».
Словарик
Заголовок раздела «Словарик»| EN | RU |
|---|---|
| shallow / deep neural network | поверхностная (один скрытый слой) / глубокая сеть |
| piecewise linear region, joint | кусочно-линейная область, излом |
| universal approximation theorem | теорема об универсальной аппроксимации |
| folding the input space | складывание пространства входов |
| maximum likelihood recipe | рецепт потерь через максимум правдоподобия |
| He initialization | инициализация He (Kaiming) |
| shattered gradients | раздробленные градиенты |
| residual connection, batch normalization | остаточная связь, нормализация по батчу |
| self-attention as routing | самовнимание как маршрутизация |
| forward (diffusion) / reverse (denoising) process | прямой (зашумление) / обратный (очистка от шума) процесс |
| evidence lower bound (ELBO) | нижняя граница правдоподобия (ELBO) |
| overparameterization | избыточная параметризация |
| double descent, lottery ticket | двойной спуск, «лотерейный билет» |
| inductive bias | индуктивное смещение |