Перейти к содержимому
ПереводыMIT, Berkeley, CMU

MIT 6.S191, лекции 1–3: нейросети, последовательности и зрение

Конспект первых трёх лекций MIT Introduction to Deep Learning 2026: перцептрон, функция потерь и градиентный спуск, обратное распространение и регуляризация; RNN, обратное распространение во времени и self-attention; свёртки, CNN и задачи компьютерного зрения.

Конспект трёх первых лекций интенсива MIT 6.S191 выпуска 2026 года. Карта курса и лабораторных — в путеводителе.

  • Лекция 1. Нейросеть собирается из перцептронов: взвешенная сумма входов, сдвиг (bias) и нелинейная функция активации. Обучение — это минимизация функции потерь градиентным спуском, а градиенты для всех весов даёт обратное распространение (backpropagation) — правило цепочки, применённое слой за слоем.
  • На практике обучение трудное: шаг обучения надо подбирать или брать адаптивные оптимизаторы (Adam и др.), градиент считают по мини-батчам, а от переобучения спасают dropout и ранняя остановка.
  • Лекция 2. Для последовательностей нужна модель, которая принимает входы разной длины, помнит далёкое прошлое, учитывает порядок и делит параметры между шагами. RNN делает это через скрытое состояние, но страдает от затухающих градиентов и не параллелится. Self-attention убирает рекуррентность: каждый элемент «ищет» нужные ему части входа через запросы, ключи и значения.
  • Лекция 3. Картинка для компьютера — матрица чисел. Полносвязная сеть теряет пространственную структуру; свёртка применяет один маленький фильтр ко всем участкам картинки. CNN = свёртки + ReLU + пулинг для признаков и полносвязная «голова» для классификации. Та же схема годится для детекции, сегментации и управления машиной.
ЛекцияКогда смотретьУрок ChinaAI
1. Introduction to Deep Learningперед ступенью 3 или параллельно с модулем 3.13.1.1 Нейрон и MLP, 3.1.2 Прямой и обратный проход, 1.4.1 Градиентный спуск, 1.4.2 Momentum и Adam
2. Deep Sequence Modelingперед модулем 3.4 и ступенью 43.4.3 CNN и RNN, 4.1.5 RNN/LSTM как языковая модель, 4.4.1 Интуиция внимания, 4.4.2 Self-attention
3. Deep Computer Visionперед модулем 3.53.5.1 Свёртка с нуля, 3.5.2 CNN на практике

Лекции 6.S191 — обзорные: формул мало, картинок много. Это хороший «первый проход» перед нашими уроками, где те же идеи разбираются руками в коде. Новичку можно ничего не пропускать — лекции короткие.

Лекция 1. Введение в глубокое обучение (Александр Амини)

Заголовок раздела «Лекция 1. Введение в глубокое обучение (Александр Амини)»

Лекция начинается с прогресса: от размытых сгенерированных лиц 2015 года до видео, где «говорит» созданный нейросетью двойник, и от GPT-3 (2022) к GPT-4 (2023). Отдельный слайд — про то, что открытая модель на 2,6 млрд параметров, которая помещается в телефон, по ряду бенчмарков догоняет исходную GPT-4.

Далее — три вложенных понятия: искусственный интеллект (любая техника, позволяющая компьютеру имитировать поведение человека) ⊃ машинное обучение (умение учиться без явного программирования) ⊃ глубокое обучение (извлечение закономерностей из данных нейросетями). Главная мысль курса: учить компьютер решать задачу прямо по сырым данным, без вручную придуманных признаков.

Почему нейросети, придуманные десятилетия назад, выстрелили только сейчас? Три причины: большие данные (ImageNet, Википедия), железо (GPU, массовый параллелизм) и софт (новые техники, TensorFlow, PyTorch, JAX). Хронология на слайде: стохастический градиентный спуск (1952), перцептрон (1958), обратное распространение (1986), свёрточные сети для распознавания цифр (1995).

Перцептрон — «кирпичик» нейросети. Он берёт входы x1,…,xmx_1, \dots, x_m, умножает на веса w1,…,wmw_1, \dots, w_m, складывает, прибавляет сдвиг w0w_0 и пропускает через нелинейную функцию gg:

y^=g(w0+∑i=1mxiwi)=g(w0+XTW).\hat{y} = g\Big(w_0 + \sum_{i=1}^{m} x_i w_i\Big) = g(w_0 + X^T W).

Словами: сначала линейная комбинация входов, потом «изгиб» функцией активации. Популярные функции активации — сигмоида σ(z)=1/(1+e−z)\sigma(z) = 1/(1 + e^{-z}), гиперболический тангенс и ReLU g(z)=max⁡(0,z)g(z) = \max(0, z). Зачем вообще нелинейность? Без неё сколько слоёв ни ставь, сеть остаётся линейной функцией и проводит между классами только прямую линию. Нелинейности позволяют приближать сколь угодно сложные границы.

Пример со слайда. Пусть w0=1w_0 = 1, W=(3,−2)W = (3, -2). Тогда y^=g(1+3x1−2x2)\hat{y} = g(1 + 3x_1 - 2x_2), и всё, что делает перцептрон, — смотрит, по какую сторону от прямой 1+3x1−2x2=01 + 3x_1 - 2x_2 = 0 лежит точка. Для входа X=(−1,2)X = (-1, 2): 1+3⋅(−1)−2⋅2=−61 + 3 \cdot (-1) - 2 \cdot 2 = -6, и σ(−6)≈0,0025\sigma(-6) \approx 0{,}0025 — точка далеко «по отрицательную сторону».

Если выходов несколько, каждый — свой перцептрон с общими входами; такой слой, где все входы соединены со всеми выходами, называют полносвязным (dense). Слои ставят друг за другом — получается сначала сеть с одним скрытым слоем, потом глубокая сеть. На слайдах показан полносвязный слой «с нуля» в PyTorch (nn.Parameter для весов и сдвига, torch.matmul, сигмоида) и тот же слой одной строкой — nn.Linear(in_features=m, out_features=2), а глубокая сеть — через nn.Sequential(nn.Linear(m, n), nn.ReLU(), ..., nn.Linear(nK, 2)).

Два признака: x1x_1 — сколько лекций вы посетили, x2x_2 — сколько часов потратили на проект. Необученная сеть для студента x=(4,5)x = (4, 5) выдаёт вероятность 0,1, хотя на самом деле он сдал (1). Значит, нужна мера ошибки.

  • Функция потерь L(f(x(i);W),y(i))\mathcal{L}(f(x^{(i)}; W), y^{(i)}) — штраф за неверное предсказание на одном примере.
  • Эмпирический риск — средняя потеря по всему набору: J(W)=1n∑iL(f(x(i);W),y(i))J(W) = \frac{1}{n} \sum_i \mathcal{L}(f(x^{(i)}; W), y^{(i)}) (её ещё называют целевой функцией или функцией стоимости).
  • Для вероятностей (классификация) — бинарная кросс-энтропия, для чисел (регрессия) — среднеквадратичная ошибка. На слайдах — однострочники torch.nn.functional.cross_entropy и mse_loss.

Обучение: градиентный спуск и обратное распространение

Заголовок раздела «Обучение: градиентный спуск и обратное распространение»

Ищем веса с наименьшими потерями: W∗=arg⁡min⁡WJ(W)W^* = \arg\min_W J(W). Потери — поверхность над пространством весов, и алгоритм идёт по ней «вниз»:

  1. инициализировать веса случайно, например из N(0,σ2)\mathcal{N}(0, \sigma^2);
  2. пока не сошлось: посчитать градиент ∂J/∂W\partial J / \partial W;
  3. сделать шаг против градиента: W←W−η ∂J/∂WW \leftarrow W - \eta\, \partial J / \partial W;
  4. вернуть веса.

Как посчитать градиент по весу где-то в глубине сети? Правило цепочки: для цепочки x→z1→y^→Jx \to z_1 \to \hat{y} \to J

∂J∂w1=∂J∂y^⋅∂y^∂z1⋅∂z1∂w1,\frac{\partial J}{\partial w_1} = \frac{\partial J}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1},

и так для каждого веса, переиспользуя градиенты более поздних слоёв. Это и есть обратное распространение.

  • Ландшафт потерь сложный (на слайде — знаменитая визуализация из статьи «Visualizing the loss landscape of neural nets», 2017). Маленький шаг обучения η\eta сходится медленно и застревает в плохих локальных минимумах, большой — «перелетает» и расходится. Варианты: перебрать много значений или взять адаптивный оптимизатор, который меняет шаг в зависимости от величины градиента, скорости обучения и т. п. Перечислены SGD, Adam, Adadelta, Adagrad, RMSProp — все есть в torch.optim.
  • Мини-батчи. Градиент по всему набору данных дорог, по одному примеру — слишком шумный. Компромисс — среднее по батчу из BB примеров: оценка точнее, сходимость плавнее, можно брать шаг побольше, а главное — батч параллелится на GPU.
  • Переобучение и регуляризация. Модель может недообучиться (слишком простая) или переобучиться (запомнить шум и плохо обобщать). Регуляризация — всё, что мешает модели становиться слишком сложной ради обобщения. Два приёма: dropout — на обучении случайно обнулять часть активаций (часто 50%), чтобы сеть не полагалась на отдельный нейрон (torch.nn.Dropout(p=0.5)); ранняя остановка — следить за потерями на отложенных данных и остановиться, когда они начинают расти, хотя на обучающих ещё падают.

Лекция 2. Глубокое моделирование последовательностей (Ава Амини)

Заголовок раздела «Лекция 2. Глубокое моделирование последовательностей (Ава Амини)»

Зачем отдельная модель для последовательностей

Заголовок раздела «Зачем отдельная модель для последовательностей»

Мяч на одной картинке — непонятно, куда он полетит; по нескольким кадрам — понятно. Последовательности повсюду: звук, текст, биржевые котировки, ДНК, ЭКГ, погода. Задачи бывают разной «формы»: один-к-одному (обычная классификация), многие-к-одному (тональность твита), один-ко-многим (подпись к картинке), многие-ко-многим (машинный перевод).

Если обрабатывать каждый шаг отдельно, y^t=f(xt)\hat{y}_t = f(x_t), модель ничего не знает о прошлом. Идея RNN — передавать от шага к шагу скрытое состояние («память»):

ht=fW(xt,ht−1),ht=tanh⁡(WhhTht−1+WxhTxt),y^t=WhyTht.h_t = f_W(x_t, h_{t-1}), \qquad h_t = \tanh(W_{hh}^T h_{t-1} + W_{xh}^T x_t), \qquad \hat{y}_t = W_{hy}^T h_t.

Словами: новое состояние — нелинейная смесь старого состояния и текущего входа, а выход читается из состояния. Ключевой момент: одни и те же веса Wxh,Whh,WhyW_{xh}, W_{hh}, W_{hy} используются на каждом шаге. Развернув RNN во времени, получаем обычный вычислительный граф, и общая потеря — сумма потерь по шагам.

В PyTorch это torch.nn.RNN(input_size, rnn_units); на слайдах есть и реализация ячейки «с нуля».

Четыре требования к модели последовательностей

Заголовок раздела «Четыре требования к модели последовательностей»

Модель должна (1) принимать последовательности разной длины, (2) улавливать дальние зависимости, (3) учитывать порядок и (4) делить параметры между шагами. Примеры: «Еда была отличной» против длинной фразы; «Я вырос во Франции… и свободно говорю по-___» — нужное слово зависит от начала текста; «еда хорошая, совсем не плохая» и «еда плохая, совсем не хорошая» — одни и те же слова в разном порядке.

Нейросети понимают числа, а не слова. Три шага: словарь (какие слова вообще есть) → индексы (слово → номер) → эмбеддинг (номер → вектор фиксированной длины). Эмбеддинг бывает one-hot (единица на месте номера) или обучаемый — тогда похожие по смыслу слова оказываются рядом. Это ровно тема нашего урока 4.3.1 «Векторы слов».

Обратное распространение во времени и затухающие градиенты

Заголовок раздела «Обратное распространение во времени и затухающие градиенты»

Обучают RNN обратным распространением во времени (BPTT): градиент идёт от потерь назад по развёрнутому графу. Чтобы дойти до h0h_0, приходится много раз умножать на WhhW_{hh}. Если «множители» больше 1 — градиенты взрываются (лечится обрезкой градиента, gradient clipping); если меньше 1 — затухают, и сеть «помнит» только ближайшие шаги. От затухания помогают выбор функции активации, инициализация весов и архитектура — ячейки с вентилями (gated cells): LSTM, GRU. Вентиль — сигмоида плюс поэлементное умножение, который решает, какую информацию пропустить, добавить или стереть.

Числовой пример (наш): если на каждом шаге градиент умножается на 0,9, то через 50 шагов от него остаётся 0,950≈0,0050{,}9^{50} \approx 0{,}005; при множителе 1,1 он вырастает в 1,150≈1171{,}1^{50} \approx 117 раз.

У RNN три слабости: всё прошлое сжимается в один вектор состояния (узкое горлышко), шаги идут строго по очереди (нет параллелизма) и память всё равно короткая. Хочется обрабатывать поток целиком, параллельно и с длинной памятью. Наивная идея «склеить всё в один вектор и подать в полносвязную сеть» не масштабируется, теряет порядок и не даёт памяти. Правильная идея — находить и «замечать» важное (attention).

Внимание как поиск. Вы ищете на YouTube видео о глубоком обучении. Ваш запрос (query) сравнивается с ключами (keys) — названиями видео; самое похожее видео выигрывает, и вы получаете его значение (value) — само видео. Self-attention делает то же самое внутри последовательности:

  1. к эмбеддингам добавить позиционную информацию (вход подаётся целиком, порядок иначе теряется);
  2. тремя линейными слоями получить Q, K, V;
  3. посчитать веса внимания — попарную похожесть запросов и ключей: softmax⁡(QKT/scaling)\operatorname{softmax}(QK^T / \text{scaling}) (на слайде скалярное произведение названо мерой, близкой к косинусному сходству);
  4. взвесить значения: A(Q,K,V)=softmax⁡(QKT/scaling)⋅VA(Q, K, V) = \operatorname{softmax}(QK^T/\text{scaling}) \cdot V.

Такой блок — голова внимания; несколько голов смотрят на разные части входа. Внимание — основной кирпич трансформера, а на нём построены BERT и GPT, модели структуры белков и Vision Transformer.

Лекция 3. Глубокое компьютерное зрение (Александр Амини)

Заголовок раздела «Лекция 3. Глубокое компьютерное зрение (Александр Амини)»

Применения: роботы, доступность (приложение, которое ведёт слабовидящего бегуна по разметке), медицина (рак груди по маммограммам, COVID-19 по снимкам, рак кожи), беспилотные машины. Но для компьютера картинка — просто матрица чисел от 0 до 255: чёрно-белая — H×WH \times W, цветная — H×W×3H \times W \times 3 (например, 1080×1080×31080 \times 1080 \times 3). Задачи: регрессия (число на выходе) и классификация (вероятности классов — например, чей это портрет).

Классический путь — эксперт придумывает признаки (нос, глаза, рот для лица; колёса и фары для машины). Но объекты меняют ракурс, масштаб, форму, освещение, бывают частично закрыты и сливаются с фоном, а внутри одного класса сильно различаются. Лучше учить иерархию признаков из данных: на нижних слоях — края и пятна, выше — глаза и носы, ещё выше — структура лица.

Полносвязная сеть для картинки — плохая идея: двумерная картинка превращается в вектор, пространственная структура теряется, а параметров становится огромное количество. Идея: соединить с нейроном скрытого слоя только небольшой участок входа (patch) и сдвигать это окно по картинке.

Фильтр — маленькая матрица весов (например, 4×44 \times 4 = 16 весов), которая одинакова для всех участков картинки и сдвигается с шагом (stride). Три принципа: фильтр извлекает локальные признаки; много фильтров — много разных признаков; веса фильтра общие для всех позиций.

Пример со слайдов. Картинка 5×55 \times 5 и фильтр 3×33 \times 3:

(1110001110001110011001100)⊗(101010101)=(434243234).\begin{pmatrix} 1&1&1&0&0 \\ 0&1&1&1&0 \\ 0&0&1&1&1 \\ 0&0&1&1&0 \\ 0&1&1&0&0 \end{pmatrix} \otimes \begin{pmatrix} 1&0&1 \\ 0&1&0 \\ 1&0&1 \end{pmatrix} = \begin{pmatrix} 4&3&4 \\ 2&4&3 \\ 2&3&4 \end{pmatrix}.

Как считать: кладём фильтр на левый верхний угол, перемножаем поэлементно и складываем: 1+0+1+0+1+0+0+0+1=41+0+1+0+1+0+0+0+1 = 4. Сдвигаем на клетку вправо — 3, ещё — 4, и так далее. Разные фильтры дают разные карты признаков: повышение резкости, выделение краёв, «сильные» края. Отдельный пример со слайдов: распознать «X», даже если он сдвинут или искажён, — фильтры ловят его диагонали и центр.

CNN для классификации — три операции, повторённые несколько раз, и голова:

  1. свёртка — фильтры дают карты признаков (torch.nn.Conv2d);
  2. нелинейность — обычно ReLU, заменяющая отрицательные значения нулями (torch.nn.ReLU);
  3. пулинг — уменьшение карты, например max pooling 2×22 \times 2 с шагом 2 берёт максимум из каждого квадрата (torch.nn.MaxPool2d); это снижает размерность и даёт устойчивость к сдвигам;
  4. классификация — выпрямить (flatten), полносвязные слои и softmax, который превращает выходы в вероятности.

Выход свёрточного слоя — объём h×w×dh \times w \times d, где dd — число фильтров; ещё важны шаг (stride) и рецептивное поле — какой участок входа «видит» нейрон. На слайде — готовая модель в PyTorch: две пары Conv2d + ReLU + MaxPool2d, затем Flatten, Linear(64*6*6, 1024), ReLU, Linear(1024, 10).

Часть «извлечение признаков» общая, меняется только голова:

  • классификация — пример: система для маммограмм на уровне экспертов-радиологов (McKinney и др., Nature 2020);
  • детекция объектов — найти рамки (x,y,w,h)(x, y, w, h) и классы всех объектов. Наивно — перебрать все окна (слишком много), R-CNN — около 2000 предложенных областей (медленно и хрупко), Faster R-CNN — сеть сама учится предлагать области, и картинка проходит через свёртки один раз;
  • семантическая сегментация — класс для каждого пикселя: полностью свёрточная сеть с понижением и повышением разрешения (torch.nn.ConvTranspose2d);
  • управление — сеть по камере и грубой карте (GPS) выдаёт распределение возможных команд руля и учится целиком, без ручной разметки (работа самих авторов, ICRA 2019).
  1. Лабораторная 1, часть 1 — основы PyTorch: тензоры, вычислительный граф, свой полносвязный слой, nn.Sequential, автоматическое дифференцирование. Перевод условия — на странице «Лабораторная 1».
  2. Лабораторная 1, часть 2 — RNN (LSTM) генерирует ирландские мелодии в нотации ABC.
  3. Лабораторная 2 — CNN для MNIST и детектор лиц с поиском и исправлением смещений (debiasing): перевод условия.
  4. Свёртку из примера выше посчитайте вручную, а потом проверьте в NumPy — как в уроке 3.5.1.
ENRU
perceptron, biasперцептрон, сдвиг (смещение)
activation function, non-linearityфункция активации, нелинейность
dense (fully connected) layerполносвязный слой
loss function, empirical riskфункция потерь, эмпирический риск
binary cross-entropy, mean squared errorбинарная кросс-энтропия, среднеквадратичная ошибка
gradient descent, learning rateградиентный спуск, шаг (скорость) обучения
backpropagationобратное распространение ошибки
mini-batch, stochastic gradient descentмини-батч, стохастический градиентный спуск
overfitting, regularization, dropout, early stoppingпереобучение, регуляризация, dropout, ранняя остановка
recurrent neural network, hidden stateрекуррентная сеть, скрытое состояние
backpropagation through time (BPTT)обратное распространение во времени
vanishing / exploding gradients, gradient clippingзатухающие / взрывающиеся градиенты, обрезка градиента
gated cell (LSTM, GRU)ячейка с вентилями
embedding, one-hot encodingэмбеддинг, one-hot кодирование
self-attention, query / key / value, attention headсамовнимание, запрос / ключ / значение, голова внимания
positional encodingпозиционное кодирование
convolution, filter (kernel), feature mapсвёртка, фильтр (ядро), карта признаков
stride, receptive field, poolingшаг, рецептивное поле, пулинг (субдискретизация)
object detection, semantic segmentationдетекция объектов, семантическая сегментация