Получи случайную криптовалюту за регистрацию!

DeepSchool

Логотип телеграм канала @deep_school — DeepSchool D
Логотип телеграм канала @deep_school — DeepSchool
Адрес канала: @deep_school
Категории: Технологии
Язык: Русский
Количество подписчиков: 5.13K
Описание канала:

Это канал школы deepschool.ru. Здесь мы будем:
- напоминать вам теорию ML/DL в виде коротких постов,
- задавать вопросы с собеседований,
- рассказывать про полезные фреймворки
- и делиться советами, которые помогут вам в работе.
Админ: @TimurFatykhov

Рейтинги и Отзывы

4.33

3 отзыва

Оценить канал deep_school и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

2

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

0


Последние сообщения 2

2022-07-06 19:25:38
Решение задачки

Но к сожалению, такой трюк одно лечит, а другое калечит. Ловите хорошую обзорную статью, где про это есть подробнее
634 views16:25
Открыть/Комментировать
2022-07-06 15:56:42
Предыдущим постом навеяно
Задачка по математике на GAN'ы
(много букаф иностранных и символов, поэтому картинкой)
662 views12:56
Открыть/Комментировать
2022-07-05 15:33:35
Самый главный совет:
Приложите иконку Гудфеллоу к вашему трейнлупу. Без этого точно не заведется
754 views12:33
Открыть/Комментировать
2022-07-05 15:31:08 ​​Как приручить GAN. Советы от Димы, куратора курса Ракета в CV

GAN'ы всё ещё доминируют в генеративных задачах, потому что ближайший конкурент в лице диффузионных моделей пока слишком медленный и на прод его не потащишь.

Кто такой GAN:
Есть моделька генератор. Она берёт на вход некоторый вектор x. В векторе x может быть что угодно: случайный вектор, осмысленный эмбеддинг, картинка. А выплёвывает генератор на выходе некоторый вектор y. Обычно y — картинка, но может быть и каким-нибудь вектором.
Есть моделька дискриминатор. Дискриминатор учится на классификацию и отделяет изображения из реального домена от изображений из генератора.

GAN по пунктикам (рис)
1. Генератор генерирует картинку;
2. Полученная картинка идёт в дискриминатор. Считается classification-loss
3. Генератор делает градиентный шаг так, чтобы обмануть дискриминатор. (сдвинуть предсказание дискриминатора в сторону ошибки);
4. Через дискриминатор прогоняется реальная картинка. Считается classification-loss;
5. Дискриминатор делает градиентный шаг, чтобы минимизировать сумму наших classification-loss. Так дискриминатор учится различать реальные и синтетические изображения;
6. Повторять пока не сойдётся.

Проблемки
Из-за этой жесткой конкурентной борьбы генератора и дискриминатор, GAN'ы очень тяжко сходятся. Чтобы ганы чаще добирались до прода, вот пачка советов.

Советики
У меня на практике лучший лосс для GAN'ов это Least Square Gan (LSGAN). Мы просто берём логиты с дискриминатора (до сигмоиды) и тянем их по MSE к 1. Да, делаем классификацию через регрессию, и ганы от этого только лучше учатся. Сверху можно добавить ещё и Relativistic GAN;
Дискриминатор может выдавать не одно число, а например сетку 7x7 как в PatchGAN. Благодаря этому выдается скор реалистичности не для всей картинки, а для регионов. Этот трюк почти всегда улучшает сходимость и качество сети. Можно взять гига-чада от мира дискриминаторов - UnetGAN, который выдаёт скор для каждого пикселя (в топовом RealESRGAN например так). Но там начинаются проблемы со стабильностью. Поэтому уважаемые ресёрчеры учили всё это с moving average 0.999 на веса модели;
Стартовать с какого-нибудь простого претрейна лучше, чем учить GAN с нуля. Можно сначала предобучить генератор с L1-лоссом и получить мыльный результат, а затем дотюнивать вместе с дискриминатором.
Вспомогательные лоссы вообще всегда помогают не разбежаться сетке. Только скор реалистичности далеко не всегда приведёт вас куда надо. Для картинок попробуйте использовать ContentLoss и L1 лосс в добавок. Это будет держать ваш GAN в рамках дозволенного;
Не пытайтесь подбирать число шагов для генератора и дискриминатора. Сильно крутить learning rate, как правило, тоже бесполезно. Можно подобрать порядок, но не упарываться в десятых знаках после запятой. Все пытались и я пытался (ганы прунил, а оно потом не дотюнивалось), и вы будете пытаться. В обучении GANов ваш бро это ADAM, он сам со всем разберётся (почти);
Батчнормы чаще всего зло, генерит артефакты;
Прочитайте StyleGAN и StyleGANv2 там очень много трюков, их часто можно утянуть и к себе в пайплайн.
702 views12:31
Открыть/Комментировать
2022-07-01 20:14:30
1.2K views17:14
Открыть/Комментировать
2022-07-01 20:14:25 Ответ на вопрос

Один из вариантов, который может прийти в голову: если на картинке (на пачке картинок) разметка не поменялась относительно предсказания сети — баним человека. Вариант даже рабочий, но не до конца . Пусть вы отгрузили на крауд сто фотографий и на всех них ваша сеть была ну просто восхитительна. Люди честно за ней не исправляли, потому что зачем. Мы забанили кучу хороших людей. Плохо.
Так как поймать обманщика? Приманим его! (honeypot) Пусть мы хотим доразметить 100 картинок. Подмешаем к ним десять картинок, в которых специально сделаем разметку корявенькой (рис. 4). Если человек привык ничего не поправлять за сетью, то он обязательно попадется в нашу ловушку. Таких людей будем банить и ничего не будем им платить.
Ханипоты — это простой, мощный и почти бесплатный (а при проверке согласованности трёх разметчиков нам нужно заплатить трём разметчикам!) инструмент отлова недобросовестных исполнителей.
Уйдем от сетапа с предразметкой. Тогда можно ловить обманщиков на картинки, которые у нас хорошо размечены. Кто часто сильно мажет мимо эталона — бан.
За такими ханипотами нужно ухаживать. Если на каком-то ханипоте часто ошибаются — проверь, всё ли с ним хорошо. Мы могли накосячить и сделать плохую приманку. Либо мы могли изменить правила разметки, а приманку не поправили и она протухла.
1.1K views17:14
Открыть/Комментировать
2022-07-01 14:28:19
1.2K views11:28
Открыть/Комментировать
2022-07-01 14:26:15 Рубрика «Вопрос не с собеседования, но на подумать»

В обучении сеток часто работает правило Парето. На небольшом наборе данных сеть уже показывает результаты, которые сильно лучше рандома. Но чтобы пробить целевые метрики, мы должны добывать новую разметку снова и снова.
Для ускорения процесса разметки часто делают следующий трюк: текущей версией нейросети предсказывают новую пачку картинок, которую нужно разметить. Тогда при разметке нужно будет только поправлять за сеткой (рис. 1). Это сильно быстрее и дешевле.
Для разметки часто используют краудсорсинг-сервисы. В них большое количество людей за небольшое количество денег размечают ваши данные В этих сервисах попадаются нечестные люди. От них вы получите мусор, а не разметку. Один из методов отлова таких обманщиков и отбора качественной разметки - проверка согласованности (рис. 2). Мы показываем одну и ту же картинку нескольким людям. Если разметка от кого-то из них явный выброс, мы ее не принимаем. Если от человека много таких выбросов, мы его баним.
Рассмотрим сетап с предразметкой. У разметчиков появляется отличная схема: можно вообще ничего не поправлять за нейросетью (рис. 3). Почти на всех картинках они будут отвечать правильно и при этом их ответы будут согласоваться. Для них это бесплатные (наши!) деньги. Но нас это "почти" не устраивает, мы воюем за каждый процент качества!
Какой механизм отсева обманщиков вы бы предложили? Кто хорошо знаком с крауд-сервисами — не подсказывайте
1.2K views11:26
Открыть/Комментировать
2022-06-29 19:18:03
1.1K views16:18
Открыть/Комментировать
2022-06-29 19:17:56 Об асинхронности вычислений на карточке

Вычисления на карточке на самом деле проходят асинхронно. Мы "сбрасываем" на нее тензора и идём дальше, не блокируя основной поток программы (рис. 1). Когда результат понадобится, тогда его и спросим (проведем синхронизацию). Благодаря этому наш код ускоряется, так как пока тензора молотятся на GPU, мы можем заняться полезным на CPU или скинуть ещё данных на свободную часть GPU.
Если забыть про асинхронность, можно получать неправильные бенчмарки (рис. 2). При бенчмарках нас спасает torch.cuda.synchronize() , который заблокирует основной поток до тех пор, пока операции на карточке не завершатся.
Также для бенчмарков можно пользоваться torch.utils.benchmark (рис. 3).

Думаю, у каждого хоть раз вылетала такая ошибка: CUDA error 59: Device-side assert triggered. Чаще всего она происходит, когда что-то напутали с шейпами. С кем не бывает Обычно трейсбек этой ошибки показывает на строчку, которая не имеет отношения к реальной проблеме и в нём непонятно, что конкретно поломалось. Это как раз из-за асинхронности. В потоке программы мы уже убежали вперед, а ошибка от CUDA из прошлого нас догнала. Обычно при этой ошибке советуют перевести все вычисления на CPU, отдебагать, а потом опять перевести на GPU. Но если вам лень лезть в код/конфиг и что-то поправлять или вы сожалеете о каждой секунде жизни, которую у вас отняли вычисления на CPU, то есть простой хак. Запустите код с нужной переменной окружения: CUDA_LAUNCH_BLOCKING=1 python your_code.py. При ней все CUDA-вычисления станут синхронными, а ошибка трейсбека начнет указывать на нужную строчку кода Но эту переменную прокидываем только при дебаге! Принудительная синхронизация замедляет вычисления
956 viewsedited  16:17
Открыть/Комментировать