DeepSchool – Telegram
DeepSchool
10.3K subscribers
77 photos
1 video
1 file
432 links
Это канал школы deepschool.ru. Здесь мы будем:
- напоминать вам теорию ML/DL в виде коротких постов,
- задавать вопросы с собеседований,
- рассказывать про полезные фреймворки
- и делиться советами, которые помогут вам в работе.

@deepschool_support
Download Telegram
Channel created
Всем привет✌️ Это канал школы DeepSchool. Здесь мы будем:
- напоминать вам теорию ML/DL в виде коротких постов,
- рассказывать про полезные библиотеки и фреймворки,
- задавать вопросы с собеседований
- и делиться советами, которые помогут вам в работе.

Мы — это команда кураторов нашей школы. Сейчас среди нас больше Computer Vision инженеров, поэтому узкоспецифичные посты будут про CV. Но бóльшая часть информации будет полезна всем, кто связан с ML/DL. Поэтому, не-сивишники, присоединяйтесь)
🔥37👍3🥰1
DeepSchool pinned «Всем привет✌️ Это канал школы DeepSchool. Здесь мы будем: - напоминать вам теорию ML/DL в виде коротких постов, - рассказывать про полезные библиотеки и фреймворки, - задавать вопросы с собеседований - и делиться советами, которые помогут вам в работе. Мы…»
​​Инициализируем канал постом про инициализацию весов нейросети!

Основная цель выбора весов на старте — избежать затухания или взрыва градиента во время обучения. Для этого надо приравнять дисперсию выхода каждого слоя к единице. Именно это и пытаются сделать все методы инициализации.

Xavier Glorot предлагал несколько способов семплирования значений для W, но самый популярный: семплировать веса из равномерного распределения на отрезке ±sqrt(6)/sqrt(n1 + n2) (рис. 1), где n1 и n2 — количество нейронов на входе и выходе.
Этот метод работает при симметричных функциях активации, например при tanh. Но если заменить активации на ReLU, то градиенты снова затухнут.

Kaiming He в 2015 году предложил вариант инициализации при использовании ReLU: семплировать из нормального распределения с мат. ожиданием = 0 и дисперсией = 2/n1 (рис. 2), где n1 - количество нейронов в предыдущем слое.
В своей статье Kaiming с соавторами показали, что 30-слойная нейросеть сходится гораздо быстрее при Kaiming инициализации, а при Xavier вообще не учится.

Забавно, что вопрос: “как правильно инициализировать нейросети?” — актуален даже в 2022 году.

P.S. Изучить подробнее с выводами формул можно здесь, а здесь еще есть наглядные визуализации обучения сети с разными подходами.

#инициализация #xavier #kaiming
🔥48👍182
​​Multi-Task Learning или MTL

MTL — это когда вы учите одну модель решать сразу несколько задач. Например, сегментировать и классифицировать картинку. Multi-Task-нейросети состоят из общей части и нескольких голов, каждая из которых решает свою задачу. При обучении общая часть кодирует картинку в фичи ➡️ затем они подаются на вход в каждую голову ➡️ головы выдают предсказания ➡️ для каждой головы считается своя функция потерь ➡️ градиент спускается от каждой головы к началу сети.

Multi-Task-модель сэкономит вам время и память, ведь несколько задач теперь решаются одной нейросетью. Также MTL можно использовать и для регуляризации ваших моделей. Интуиция такая: если сеть учится решать несколько задач, ей сложнее будет переобучиться под одну из них. Поэтому в следующий раз при обучении сегментации, попробуйте добавить голову-классификатор после энкодера. Благодаря этому ваша модель точнее выучит полезные паттерны, а во время инференса будет сегментировать лучше (но это не точно🙂 как обычно, пробуем оба способа и сравниваем метрики).

#mtl #multitasklearning
🔥29👍14
Рубрика «Вопрос с собеседования»💼

Спрашивает Миша Лиз, куратор курса Ракета в CV

«На собеседованиях люблю задавать такой вопрос:
Перед вами стояла задача сегментировать всех котов на картинках. Т.е. получать маску кот/не кот. Вы получили разметку для 1000 картинок. Но вдруг к вам приходит заказчик и просит, чтобы помимо маски котов можно было получать маску всех животных (суровый Agile может работать не только в удобных вам ситуациях 😉).
У заказчика скоро презентация продукта, т.е. есть жесткий дедлайн, который нельзя сорвать. Вы понимаете, что до дедлайна успеете получить разметку только для 500 изображений, на которых помимо котов есть маска со всеми животными. Что будете делать?»

Подумайте, что бы вы ответили на этот вопрос? А сегодня в 20:00 МСК напишем ответ Миши 🔜
🔥19🤔11👍7
​​Ответ на вопрос с собеседования💼

Вы могли заметить, что вопрос не предполагает единственно верного ответа🙂 Мне всегда интересно, как кандидат умеет рассуждать, задавать вопросы и “решать вопросики”. Вопросы на знаю/не знаю обычно не задаю. Как по мне, это бесполезно. Да и скучно. Если человек не знает ответ на вопрос типа "чем LayerNorm отличается от GroupNorm", то он, сказав "не знаю", может расстроиться, поплыть и не проявить свои лучшие качества. Вопросы на конкретные знания можно задавать незаметно, между делом, и про себя отмечать, ответил ли кандидат.
Например, в задаче про кошек некоторые кандидаты сразу говорят: "а зачем нам для задачи сегментации и таких простых объектов 1000 картинок? Там с претрейна и на 500 хорошо завестись должно!". И это очень хороший поинт! Это означает, что кандидат примерно понимает, сколько картинок хватает для разных задач. В таком случае мы меняем условия на некомфортное для него количество картинок и решаем задачу с новым сетапом. Заметьте, если кандидат не сказал “что-то многовато картинок“, то он от этого не поплывет, и это не помешает ему показать все свои знания😉
Вариантов решения задачи тьма. Опишу один из них, который "принимается":
Перед нами задача семантической сегментации с мультилейбл таргетом (пиксель может быть одновременно и кошкой и животным). Поэтому сетку будем учить с BCE-лоссом по каждому каналу. В таком случае лосс считается в каждом пикселе независимо, а затем усредняется. Выберем среди 1000 размеченных картинок с кошками 500 картинок и отдадим их на доразметку класса животных. В итоге получим 500 картинок, на которых размечены оба класса и 500 картинок, на которых только кошки. При обучении сети не будем считать лосс по каналу с животными, если на картинке не размечен этот класс.
При таком подходе мы максимально использовали исходную большую разметку (1000 фоток) и новую разметку. Также у нас есть картинки, на которых размечены оба класса. И сделали это всего одним ифом!
Кстати, это хорошо работающий подход, когда у вас есть гигантский датасет, и нужно научиться предсказывать на нем что-то новое. И чтобы выучить это новое, вам не нужен весь размеченный миллиард картинок. Размечаем часть и только на этой части прокидываем "новые" градиенты. Профит!🙂

Эта задачка хороший старт, попутно ее можно развивать множеством вопросов, например:
* Пусть картинок не 1000 и 500, а 10000 и 100. Что поменяется?
* Как можно попытаться ускорить процесс разметки, чтобы успеть получить, скажем, не 500, а 900 размеченных фоток?
* А как выбрать из 1000 фоток 500 фоток для доразметки? А как быть, если в исходной выборке из 1000 фоток совсем не было фоток других животных?
* Позже заказчик приходит и просит ещё маски для самолетов. До дедлайна совсем немного времени и вы понимаете, что не успеете доразметить и получить новую модель. Ваши действия?

И ещё миллион других вариантов вопросов, которыми можно продолжить задачу🙂 Но ими не нужно "пулять" подряд, а вкидывать между делом при диалоге.
🔥41👍17🤔94❤‍🔥1
Рубрика «Вопрос с собеседования»💼

Вы натренировали гениальную нейросеть, которая умеет отличать котов от собак. У вас даже есть прод!
Люди с телефона посылают картинки в ваше API, которое под капотом дергает нейросеть (рис. 1). Сначала всё было хорошо, но ваше приложение стало очень популярным, и теперь ваше API иногда рвётся от нагрузки (рис. 2). Какие минусы есть у изначального решения? Как выдержать бо́льшую нагрузку, не разоряясь на покупку новых карточек? (предполагаем, что бутылочное горлышко системы — инференс нейросети)

По традиции перед публикацией ответа даём несколько часов на подумать😉
🔥23🤔7👍4❤‍🔥11
Ответ на вопрос с собеседования 💼

У изначального решения большой минус: картинки предсказываются синхронно по одной. Думаю, всем известно, что предсказать 64 картинки по одной выйдет гораздо дольше, чем предсказать один батч из 64 картинок. Но как организовать батчинг, когда картинки приходят к нам с клиента по одной?
Добавим немного асинхронщины. Введем промежуточную очередь! (рис.3). Также введем два параметра:
1) batch_size — размер батча, с которым хотим предсказывать;
2) interval — допустимое время "простоя".
Раньше мы сразу отправляли картинку в нейросеть. А сейчас позволим себе немного подождать, пока накопится батч.

После того, как картинка пришла в API, она сразу сбрасывается в очередь (это быстро!). Каждые interval ms мы "выгребаем" N картинок из очереди. N = min(len(queue), batch_size). (рис. 4)

Можно поступать умнее: если в очереди >= batch_size картинок, то после предикта будем сразу брать новую пачку.

Теперь должно стать понятнее, откуда берутся параметры у TorchServe.

Но в реальных задачах лучше не заниматься написанием собственного батчинга, а использовать готовые inference-сервера. Например, TorchServe или Triton от Nvidia.

Паттерн с введением промежуточной очереди, в которую можно что-то по-быстрому скинуть и которую мы разгребаем в удобном для нас темпе, появился конечно же не из мира DL 🙂Это очень популярный паттерн для highload-задач. Он позволяет бороться со всплесками и легко скейлиться под изменчивую нагрузку. Прочесть про него можно здесь.
🔥46👍41
при редактировании поста картинка ушла, ижвинити🙂
21🤔3
​​Не забываем корни, напоминаем про батчнорм 😉

Батч нормализация — неотъемлимая часть CNN. Основная цель этого слоя — корректировать распределение фичей во время обучения нейронной сети. Главная формула в этом слое — (1). Она применяется к каждому каналу в батче. То есть для фичей размерности [B, H, W, C] считается C средних E(X) и C выборочных дисперсий Var(X).
Получается, в слое батч нормализации есть два статистических параметра — среднее и выборочная дисперсия и два обучаемых — γ и β. Если статистические параметры неудачно нормализуют фичи, то обучаемые параметры позволят сети самой подкорректировать интенсивность и сдвиг фичей на выходе. При необходимости, сеть выучит параметры γ и β таким образом, чтобы на выходе получались исходные фичи без нормализации. Также важно запомнить: во время инференса среднее и выборочная дисперсия не рассчитываются, используются их экспоненциально сглаженные оценки (2), которые считаются во время тренировки.
🔥31👍7🙏1