Курс “Deep learning на пальцах - 2019” от sim0nsays
Хорошие обзорные теоретические курсы по нейросетям. У них есть недостаток: отсутствие таймкодов.
Этот пост по сути список таймкодов.
На данный момент я посмотрел 10 лекций.
1. Введение
8:00 - определение ИИ. Часто под ИИ подразумеваются задачи, которые человечество только недавно научились решать. Например OCR. Ключевая задача - распознавание: картинок, звука, текста.
15:52 - прогресс распознавания картинок и речи с 2011 года. Про разные домены: машинный перевод, поиск, NLP.
28:35 - опрелеление ML.
32:35 - как работает ML-алгоритм на распознавании рукописных чисел на датасете MNIST.
37:44 - описание Deep Learning.
46:28 - Computer vision features - SIFT.
50:55 - об AlexNet.
57:18 - краткое содержание курса и прохождение заданий для студентов.
1:01:27 - другие онлайн-курсы, книги, сообщества.
2. Элементы машинного обучения
4:15 - supervised learning (обучение с учителем), способ обучения, когда данные размечаются и после этого скармливаются в алгоритм, который выдаст модель - кусок кода, который может делать prediction для подобных новых (не размеченных) данных.
6:25 - как распознавать цифры номеров домов из датасета Street View House Numbers.
10:05 - метод ближайших соседей Nearest neighbor.
12:21 - nearest neighbor выдаст точность предсказаний на тренировочных данных 100%, но это не значит, что модель хорошо будет работать на новых данных.
15:25 - это исправляет метод k-ближайших соседей K-nearest neighbors.
19:58 - K - это гиперпараметр, то есть подбирается не во время тренировки, а перед этим.
20:43 - переобучение и недообучение, overfitting vs underfitting.
24:58 - про разделение датасета на train, val и test.
28:11 - кросс-валидация, cross-validation, когда весь датасет используется для тренировки, а val-данные каждый раз выбираются разные.
36:32 - бинарная классификация, binary classification, когда классов всего 2.
37:25 - о несбалансированных датасетов, когда класс A в датасете 99%, а класс B 1%, тогда модель, которая всегда называет класс A даёт точность 99%, борьба дальше идёт за доли процента.
39:35 - про precision и recall. Отражает процент false positive и false negative.
45:34 - многоклассовая классификация, multi-class classification.
51:10 - как определять недообучение и переобучение. Если ошибка на train большая - недообучение. Если ошибка на val большая - переобучение. Ошибка на test показывает реальную точность.
3. Нейронные сети
2:44 - откуда взялась идея нейросетей, как они в общем работают.
9:41 - линейный классификатор, linear classifier, система перемножения матриц, эквивалентна простой нейросети.
14:55 - разделяющие плоскости в n-мерном пространстве.
16:11 - цель всех вычислений: найти лучшие w и b, которые будут лучше всего приближать данные, лучшим образом разделять плоскостями разные классы.
21:12 - метод градиентного спуска, gradient descent. Градиент - многомерная производная, которая говорит, в каком направлении надо двигаться, чтобы оптимальнее всего уменьшить или увеличить функцию. В итоге вычислений скатываемся в локальный минимум.
28:02 - softmax - функция оптимизации, которая приводит все числа весов (от минус бесконечности до бесконечности) к числам от 0 до 1, которые будут отражать вероятность.
35:11 - принцип максимального правдоподобия, maximum likelihood: у модели должны быть такие w и b, которые определяют максимальную сумму вероятностей (чтобы все классы определялись).
38:51 - функция Cross-Entropy loss - функция оптимизации, которая отражает, насколько мала ошибка.
41:39 - регуляризация, regularization. Техника, которая усложняет задачу оптимизации, но при этом сковывают её.
46:17 - как посчитать градиентный спуск (теория).
53:52 - стохастический (случайный) градиентный спуск, stochastic gradiend descent (SGD). Это когда вместо всего датасета на каждый шаг выбирают случайное кол-во данных и расчёт идёт только по ним.
Batch size - размер выборки данных для одного прохода, чтобы не перемножать весь датасет (обычно это невозможно).
1:03:41 - слои нейронных сетей.
1:04:36 - функция акцивации, non-linear function. ReLu - дефолтный выбор функции активации.
1:10:03 - как посчитать градиентный спуск (практика). Обратное распространение ошибки, backpropogation.
1:23:00 - общая схема вычисления градиента.
4. PyTorch и подробности
8:23 - вычисление градиента с матрицами.
23:13 - интерфейс слоя, layer interface в PyTorch.
25:27 - общая схема тренировки.
27:56 - пример решения многоклассовой классификации, multi-class classification.
29:06 - multi-class labeling, когда на картинке может быть более одного объекта, softmax не подходит, используется другая функция вероятности sigmoid и loss-функция binary cross-entropy loss.
33:02 - regression, нахождение носов, носов и глаз.
37:48 - библиотеки для глубокого обучения, описание возможностей, пример на PyTorch.
51:45 - подготовка данных, data preprocessing.
55:47 - выбор функции активации. rectifier linear unit (ReLU).
1:02:56 - инициализация весов, weight initialization. Xavier initialization. He initialization.
1:10:06 - обновление параметров, update rules. Модификации SGD: Momentum, Adagrad, Adadelta, Rmsprop. Adam - дефолтный выбор градиентного спуска.
5. Нейросети на практике
8:49 - сравнение процессора и GPU по TFlops
18:00 - последствия ошибок на train, validate, test
TensorBoard - визуальное отображение loss & accuracy.
Annealing - гиперпараметр про уменьшение learning rate с течением эпох. В PyTorch это torch.optim.lr_scheduler
. Применяется при недообучении (underfitting).
27:55 - про переобучение. Лечится регуляризацией.
L2 regularization - самое простое.
Dropout - рандомное убирание частей данных во время или после тренировки. Обычно вставляют в конце сети.
Batch normalization - слой после весов, делает поток предсказуемого масштаба: среднее 0, std 1 (стандартное отклонение). Убирает выбросы в датасете. Чаще ставят после слоя активации (ReLu). Обычно ставят после каждого слоя весов.
Если собрать ансамбль моделей, предсказывать всеми и выдавать среднее, то результаты должны быть чуть лучше.
Learning rate можно подбирать либо линейно, потом смотреть лучший, либо пилой (больше-меньше), это даёт возможность скатившейся в локальный минимум точке выпрыгнуть оттуда и скатиться в более оптимальный минимум. Из разных минимумов можно собрать ансамбль.
1:17:27 - про инженерный подбор гиперпараметров.
ONNX - стандарт экспорта моделей.
6. Convolutional Neural Networks
14:47 - паттерны (или фильтры) свёртки для обработки изображений
31:15 - padding и stride. Padding - заполнение (обычно нулями) частей, которые выходят за пределы матрицы. Stride - шаг, с которым скачем по матрице.
35:25 - pooling layer - слой, меняющий разрешение по формуле Max pool (берёт максимум из объединяемых пикселей). При обратном проходе градиент отдаётся максимальному пикселю, остальным отдаёт ноль. Ставится после слоя активации.
Архитектура CNN с Max pooling хорошо работает со сдвигами изображений.
45:30 - рецептивное поле (receptive field) - то, какого размера поле в исходном изображении влияет на конкретный нейрон.
50:15 - примеры архитектур CNN.
LeNet’98 - сеть для распознавания цифр в почтовых индексах.
ImageNet - датасет из 1М картин, размечено 1000 классов.
AlexNet’12 - 15.4% ошибок, 16М параметров.
VGG’14 - 6.8% ошибок, 140М параметров.
ResNet’15 - 3.57% ошибок, решение проблемы тренировки сети с большим кол-вом слоёв (> 50). Чтобы один из слоёв не ломал все вычисления, стали передавать вход сразу на выход, а слой может только подправить, f(x)+x
. Вход передаётся на выход через 2 слоя + ReLu.
1:07:55 - transfer learning, переобучение чужой сети. Если у нас всего 10-100 картинок, то замораживаются все слои сети, кроме последнего (не тренируются), в последнем меняем классы.
Если картинок около 1000, то можно заморозить не все слои, а часть, оставшиеся тренировать с разным learning rate, чем глубже, тем медленнее.
1:17:40 - аугментация - создание картинок из картинок. Например, можно отразить картинку и увеличить датасет в 2 раза. Потом можно делать смещения, изменения цвета, повороты, наклоны и т.д. Аугментацию вставляют после выбора минибатча. Есть готовая либа Albumentations. Встроенные либы тоже есть. Эффект как у ансамбля моделей.
7. Segmentation и Object Detection (Владимир Игловиков)
Сегментация - это попиксельная классификация, когда на выходе получается картинка того же разрешения, но у каждого пикселя есть инфа, к какому классу он относится.
FCN (fully convolutional network) - сеть без dense слоёв, только из convolution слоёв.
Dense слои - fully connected слои.
U-Net - сеть, условно состоящая из 2 частей: encoder (распознаёт картинку, уменьшая разрешение) и decoder (разворачивает распознанную картинку в первоначальное разрешение).
42:25 - FPN (feature pyramid network). Решает проблему масштаба. Делается несколько параллельных слоёв, которые работают с разными размерами картинок.
44:50 - U-Net + FPN. Разные слои (уровни пирамиды) работают с картинками разного разрешения, потом верхние слои с большим разрешением подаются на вход нижнего слоя и на вход следующего слоя.
49:55 - Segmentation loss function. Тут ничего не понял…
56:00 - вторая часть.
Детекция - определение габаритов объектов: координаты, класс, аттрибуты.
Делятся на One-shot и Two-shot, вторые точнее, но дольше.
One-shot детекторы: YOLO (You only look once) (делит картинку на квадраты, боксы рисует по контурам квадратов, менее точно, но быстрее).
One-shot detector + FPN = SSD.
Как я понял, из two-shot надо брать Faster-RCNN.
8. Metric Learning, Autoencoders, GANs
Embedding - внутреннее представление картинки нейросетью перед классификацией (на предпоследнем слое). Набор внеторов, отражающих все знания сети о картинке.
По векторам можно сравнивать картинки и находить похожие по заданному признаку, это может быть как поза любого человека, так и один и тот же человек в разных позах.
Тренируется такая модель через triplet loss. Каждый элемент в батче - 3 фото, 2 похожих, 3-я непохожая. Нужно найти такой loss, чтобы вектора похожих были ближе друг к другу, чем непохожая.
29:30 - Unsupervised learning (обучение без учителя) - обучение на неразмеченных данных.
Вместо предсказывания алгоритм находит общее:
- выявление схожих характеристик (clustering)
- выявление аномалий (outlier detection)
- выучить фичу, которая пригодится в другой модели (learning features)
- создание нового (generation)
Чтобы обучить сеть созданию, нужно на выходе генерировать такую же картинку, как на входе. Надо построить её так, чтобы в середине сети было недостаточно ёмкости, чтобы сохранить всю информацию о пикселях. Для этого сети нужно будет понять высокоуровневые параметры картинки. Сеть делится на encoder и decoder (который делает upsampling).
Автоэнкодеры быстро приходят к overfitting. Чтобы это обойти, прибумали variational autoencoder (VAE). Энкодер вместо предсказания пикселя выдаёт среднее и сигму, дисперсию (грубо говоря, центр и радиус). А декодеру мы будем передавать случайную точку из области этого круга. Чтобы шарики не схлопнулись в точку, добавляют дополнительный loss, который заставляет сеть делать сигму как можно больше.
Сеть можно научить определённому вектору, например, наличию улыбки, наличию очков. Когда вектор получен, мы можем добавлять или вычитать его в других картинках.
1:00:00 - Generative adversarial networks (GANs) или генеративно-состязательные сети. Состоят из 2 сетей. Геренатор должен из точки (случайный шум) дать картинку. Дискриминатор видит картинки генератора и картинки из датасета, он должен определять, реальная картинка или сгенерированная. Цели у сетей противоположные. Генератор должен научиться делать такие картинки, которые дискриминатор не распознает. Генератор имеет доступ к весам дискриминатора, поэтому он смотрит изнутри, как картинку определили.
GAN Zoo - сотни ГАНов.
Современные: StyleGAN’18
9. Введение в NLP, word2vec
NLP сложно из-за того, что естественный язык сильно зависит от контекста. “Он видел их семью своими глазами”.
9:45 - NLP pipleline
Вход
(текст, распознавание речи, OCR) -> Морфология
(проверка текста, поиск по словам) -> Синтаксис
(крутая проверка текста, парсинг) -> Семантика
(положительное/отрицательное, sentiment analysis, машинный перевод) -> Контекст
(связывание предложений).
Чем дальше по пайплайну, тем труднее составить список правил, чтобы формализовать обработку.
22:00 - чтобы выразить задачу для нейросети, нужно перевести данные из символьного представления в непрерывное, то есть векторизовать. Как и в 8 уроке, в autoencoders, слова со схожим смыслом должны при этом оказаться ближе друг к другу и разбиться по кластерам.
30:30 - word2vec - одно из первых успешных решений. Использует подход skip-gram: берёт соседние слова у каждого слова в датасете предложений, для каждого определяет вероятность использования соседних слов. Контекст вокруг слова - n-gram.
В архитектуре такой сети нет нелинейности (ReLu). Размеры матриц в слоях пропорциональны длине словаря.
51:10 - Проблема с этим наступает на softmax, где система должна умножить каждое слово в словаре, а их могут быть миллионы. Чтобы это обойти, придумали negative sampling. При тренировке выбирают несколько случайных слов и выводят по ним бинарное предсказание вместо softmax.
1:08:00 - FastText от Facebook, умеет определять вектора для новых слов: раскладывает слово на n-граммы, каждое векторизует, для новых слов берёт среднее из них, стоит брать эту модель для начала.
10. Recurrent Neural Networks, Рекуррентные нейронные сети
У обычных сетей 1 вход и 1 выход. Бывают другие варианты:
- 1 вход, много выходов
- много входов, 1 выход (sentiment analysis)
- переменные входы, переменные выходы (перевод текста)
- много входов, столько же выходов
Рекуррентная сеть умеет запоминать выход на слое и на следующем шаге передавать самой себе в будущее это значение на вход, вместе с инпутом. Внутри слоя вычисляется h
: вход умножается на веса + предыдущий выход умножается на веса и берётся среднее (грубо говоря). На следующем шаге h
переиспользуется.
15:20 - Пример: генерация текста. Модель принимает символы по одному (+ “символы” BOS, EOS, начало и конец), учим её предсказывать следующий символ. Размер вектора - кол-во символов в языке.
34:50 - Как тренируется RNN. Сеть “разматывается”, как будто один слой на разных шагах - разные слои.
Есть проблема: любой сигнал, умножаясь за 100 шагов на одну и ту же матрицу, становится очень большим. tanh его убьёт либо в 0, либо в 1, ReLu вообще нельзя использовать, т.к. значения уходят в небеса. Решают через long short-term memory (LSTM), в отличие от Vanilla RNN. Вместо 1 входа h
делается 2 входа. c
меняется по минимуму, чтобы градиенты протекали через него без экспоненциального изменения. В h
добавляется несколько гейтов. Все гейты получают на вход конкатенацию векторов из h
и x
. Forget gate выдаёт вектор, равный размерности c
, который говорит, сколько в c
следует забыть. Input gate говорит, что нужно добавить (через tanh). Cell update говорит, что нужно передать на выход c
. Output gate говорит, как нужно изменить значение c
, чтобы выдать h
. Это похоже на ResNet из 6 урока, где данные передавались без изменений через несколько слоёв.
59:10 - Bidirectional RNN
1:04:35 - Пример разбора частей речи (part of speech tagging) с зависимостью от контекста. Решение: many to many, Bidirectional LSTM с дополнением (CRF models).
1:05:50 - Нахождение именованных сущностей (named entity recognition, NER). Решение: many to many, Bidirectional LSTM CNN.
1:06:50 - Анализ тональности (sentiment analysis). Решение: many to one, LSTM.
1:07:15 - Машинный перевод (machine translation). Решение: many to many, LSTM.
1:08:35 - Использование в PyTorch.
1:12:05 - Разбор частей речи подробнее.
Ссылки
https://supervise.ly/ - сервис для разметки данных
Чтобы заменять часы и минуты на ссылку с таймкодом, заменял в vscode
((\d+):(\d+)) -
на[$1](https://www.youtube.com/watch?v=1BUuB28FDOc&list=PL5FkQ0AF9O_o2Eb5Qn8pwCDg7TniyV1Wb&t=$2m$3s) -