Ebout Data Science | Дима Савелко
2K subscribers
140 photos
11 videos
86 links
Ebout Data Science by @ngmdite
Download Telegram
Уничтожение LLM System Design 😎

Как отвечать на собеседовании, если вас спросят: «Постройка мне чат-бота с помощью LLM»? Разберем основные шаги на конкретной задаче.

Основываясь на этот пост, пройдёмся по пунктам.

1️⃣ Нужно чётко сформулировать цель, задачу, ограничения и ресурсы. Прям пытайте интервьювера, чтобы выдал все исходные данные 🍗

Задача: создать чат-бота, который отвечает на финансовые запросы.

Исходные условия:
- В продакшене уже используется API GigaChat (временное решение).
- Доступен API ChatGPT.
- Есть два ассессора.
- Ответы предоставляются без контекста.

Ограничения:
- Ответ за максимум 2 минуты.
- Аппаратные ресурсы: 4 GPU (80 ГБ каждая, A100).

2️⃣ Теперь нужно определиться с метрик. Обычно в задачах построения дизайна система выделяют три вида метрик

Бизнесовые метрики 💸
- Уровень автоматизации — процент запросов, обработанных ботом без операторов.
- Снижение затрат — экономия на поддержке
- Удержание клиентов — сколько пользователей продолжают пользоваться услугами после общения с ботом. Но эту метрику сложно определить, поэтому для простоты стоит поделить на тех пользовался чат-ботом, а кто не пользовался.

Онлайн-метрики:
- Удовлетворенность клиентов (CSAT) — пользовательская оценка (1–5).

Оффлайн-метрики:
- Loss — насколько хорошо обучена модель.
G-Eval — метод «LLM as Judge», когда одна модель оценивает ответы другой по качеству (например, от 1 до 5).
Оценка ассессоров — реальные люди оценивают ответы по техническому заданию. Это ключевая метрика, с которой можно проверить корреляцию с G-Eval.
Бенчмарки — открытые или специально созданные под задачу бизнеса.

3️⃣ Теперь нужно определиться с данными, откуда и сколько их получить, а также как поделить на Train/Test 🕺

Выделяем ключевые сущности:
У нас есть диалог, а в диалоге:
- Запрос пользователя
- Ответ модели
- Маркер начала диалога
- Идентификаторы запроса, ответа, пользователя и т.д.

Способы получения данных:
➡️ Синтетика — быстро и дешево, но требует проверки (например, через G-Eval).
➡️ Открытые датасеты — бесплатны, но их нужно очищать (GPT или предобученные модели).
➡️ Собственные данные — качественно, но дорого и долго (нужны четкие ТЗ для копирайтеров).

Объем данных: Для обучения LoRA потребуется хотя бы 10 тысяч примеров для тренировки и около 700 для тестирования.
Для упрощения пока исключаем поиск контекста, работу с контекстом распишу в следующей части)

4️⃣ Построение пайплайна обучения 😺

Бейзлайн: предположим, что у нас уже есть метрики для текущего решения (например, на GigaChat).

Входные данные:
X — запрос пользователя.
Y — эталонный ответ.

Модели:
llama3.1 400b. Пробуем сначала запромпить модель и смотрим на результаты бенчмарков.
saiga_llama3.1 70b. Сначала промптим, затем обучаем под конкретную задачу.
Loss: Используем CrossEntropyLoss — простой и надежный метод для обучения LoRA на основе SFT.

Метрики:
На тренировочной выборке оцениваем Loss.
На тестовой — G-Eval, оценки ассессоров (на 500 случайных примерах) и бенчмарки.
Деплой: Для деплоя используем vllm.

5️⃣ Потенциальные улучшения 🐒

- Добавить контекст в ответы для повышения точности модели (реализуем в следующей части).
-Применить ORPO-метод, чтобы модель лучше понимала, какие ответы допустимы, а какие нет.
- Квантизация или дистилляция для того, чтобы уменьшить latency
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
14🍌7❤‍🔥32👍2🥰1
Forwarded from ML Baldini • Nikita Boyandin (Nikita Boyandin)
#Коллабы #road1k

ML system design - это та вещь, с которой я столкнулся только когда уже был на стажировке, причем сразу с книжки Валерия Бабушкина(кстати, он подписался на меня в Linkedin😭). У Димы есть невероятно классный пост про старт в mlsd и как их побеждать на собесах, а я постараюсь чуть расширить область и дать реальных кейсов.

В своем посте я разберу типовой кейс из классического мл "Обнаружение вредоносного контента🤨 в социальных сетях"

1. Формулировка проблемы😲
Уточняющие вопросы точно помогут сделать задачу понятнее и проще, поэтому стоит их задавать по максимуму, даже если они кажутся глупыми

Цель: отслеживать публикации, выявлять вредоносный контент и понижать его в должности / удалять

Примеры категорий вредоносного контента: насилие, обнаженная натура, разжигание ненависти

Цель ML: определить, является ли публикация вредоносной

Входные данные: Публикация (текст, изображение, видео)
Выходные данные: P(вредная) или P(насильственная), P (обнаженная натура), P (ненависть) и т.д
Категория ML: Мультимодальная (с несколькими ярлыками) классификация

2. Метрики😐
Оффлайн-метрики: F1, PR-AUC, ROC-AUC
Онлайн-метрики: распространенность (процент вредоносных сообщений, которые не были предотвращены, по сравнению со всеми публикациями), количество показов вредоносных сообщений, процент обоснованных (отмененных) обращений, показатель активности (соотношение обнаруженных систем к обнаруженным пользователями)

3. Архитектурные компоненты🤨
Мультимодальный ввод (текст, изображения, видео и т.д.):
Методы мультимодального слияния
Раннее слияние: сначала объединяются модальности, а затем делается единый прогноз
Позднее слияние: модальности обрабатываются независимо друг от друга, прогнозируется слияние
минусы: отдельные обучающие данные для модальностей, подборка индивидуально безопасного контента может быть вредной


Классификация с несколькими метками/многозадачностью
Один бинарный классификатор для каждой категории вреда (p (насилие), p (обнаженная натура), p (ненависть))
несколько моделей, которые обучаются и обслуживаются отдельно, правда стоят дорого
Один классификатор с несколькими метками - сложная задача для изучения

Многозадачный классификатор: изучайте несколько задач одновременно
на отдельных общих слоях (изучайте сходство между задачами) -> преобразованные объекты
уровни, относящиеся к конкретной задаче: главы классификации
плюсы: единая модель, общие уровни предотвращают избыточность, обучающие данные для каждой задачи можно использовать и для других задач (ограниченные данные)

4. Сбор и подготовка данных☺️
Основные участники, по которым доступны данные:
Идентификатор пользователя, возраст, пол, местоположение, контакты

Элементы(сообщения): идентификатор публикации, идентификатор автора, контекст текста, изображения, видео, ссылки, временная метка

Взаимодействие пользователя с публикацией: user_id, post_id, тип взаимодействия, значение, временная метка


5. Разработка функций😠
Особенности: Содержание публикации (текст, изображение, видео) + Взаимодействие с публикацией (текст + структурированный) + Информация об авторе + Контекст сообщений
Текст:
Предварительная обработка (нормализация + токенизация)
Кодирование (векторизация):
Статистические (BoW, TF-IDF)
Кодеры на основе ML (BERT)
Изображения / видео:
Предварительная обработка и извлечение объектов
Изображения:
Clip, SImCLR
Видео:
VideoMoCo
Взаимодействие с публикациями:
Количество лайков, комментариев, репостов, сообщений (масштаб)
Комментарии (текст):
Аналогично тексту публикации (совокупные вложения в комментарии)
Пользователи:
Используйте только демографические данные автора публикации, характеристики учетной записи (количество подписчиков, возраст учетной записи).


6. Разработка модели и автономная оценка🕺
7. Онлайн-тестирование и внедрение🕺
8. Масштабирование, мониторинг и обновления😠

Ресурсы для лучшего понимая🫡:
1. Куча примеров кейсов
2. Разница МЛСД в проде и ресерче

Если понравился пост, то обязательно ставь лайк, а я пока буду дальше трудится над каналом💗
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🍌6🔥2🤝1
Тотальное Уничтожение Multihead-Attention 😎

Для начала вам стоит прочитать пост про Self-Attention для более лучшего понимания данного поста. Если ты действительно хочешь понять MHA, то к данному посту нужно подходить ни один раз, спрашивая в комментах или у GPT.

Главная суть MHA - Multihead Attention 🤨
- Распараллеливание: Каждая голова в MHA обрабатывается независимо, что позволяет эффективно использовать вычислительные ресурсы (например, GPU).
- Интерпретация разных смыслов: Разные головы фокусируются на различных аспектах текста, что помогает модели "замечать" важные связи между словами с разных точек зрения.

Детальный разбор 😎
Представим, что batch_size=1, seq_len=4, embedding_dim=6, heads=3 (количество голов).
На вход поступает последовательность ["Я", "Хочу", "Пиццу", "<eos>"]. Каждый токен - это слово, которое преобразуется в эмбеддинг (вектор). На выходе имеем матрицу эмбеддингов X, смотрите на картинку 1

1️⃣ Генерация матриц Q, K, V
Картинка 1:
- На вход в MHA поступает матрица эмбеддингов X.
- Имеем веса Wq, Wk, Wv, которые обучаются.
- Путём матричного умножения X на Wq, Wk, Wv получаем три матрицы: Q, K, V.

Размерности:
- X → (batch_size, seq_len, embedding_dim)
- Wq, Wk, Wv → (embedding_dim, embedding_dim)
- Q, K, V → (batch_size, seq_len, embedding_dim)

2️⃣ Деление на головы
Картинка 2:
Вот у нас получились матрицы Q, K, V. Важно понимать, что MHA — это не создание новых отдельных матриц Q, K, V, а деление каждой из них на головы.
Условно, для каждого токена мы уменьшаем длину его вектора, разделяя его между головами. Например, на картинке 2 токен "пиццу" изначально представлен эмбеддингом длиной 6 → [13,14,15,16,17,18]. Если количество голов равно 3, то теперь этот токен преобразуется в 3 вектора по 2 элемента каждый → [[13,14],[15,16],[17,18]], теперь токен "пиццу" представили как три вектора с размером вектора два. Для этого выполняются операции reshape и swap, у нас появляется новая переменная head_dim = embedding_dim/heads 😐

Размерности:
- Q, K, V(batch_size, seq_len, embedding_dim) = (1, 4, 6)
- Q, K, V после reshape(batch_size, seq_len, heads, head_dim) = (1, 4, 3, 2)
- Q, K, V после swap(batch_size, heads, seq_len, head_dim) = (1, 3, 4, 2)

3️⃣ Self-Attention по каждой голове
Картинки 3-5:
Теперь происходит обычная формула Self-Attention по каждой голове: softmax((Q x K.T)/sqrt(head_dim)) * V
И основная суть, что каждая голова обрабатывается параллельно на одном устройстве (например, GPU), что обеспечивает эффективное распараллеливание вычислений ☝️

Размерности:
Attention Output для каждой головы имеет размерность → (batch_size, seq_len, head_dim) = (1, 4, 2).

4️⃣ Объединение голов
Картинки 6-8:

Вот мы посчитали для каждой головы Attention Output, а теперь время всё конкатить, восстанавливая исходную размерность эмбеддингов. Делаем обратные операции что и на втором шаге. Сначала reshape, а потом swap 🤪

Размерности:
- Attention Output каждой головы → (batch_size, text, seq_len, head_dim) = (1, 3, 4, 2)
- После swap(batch_size, seq_len, heads, head_dim)=(1, 4, 3, 2)
- После reshape(batch_size, seq_len, heads×head_dim)=(1, 4, 6)

5️⃣ Финальная обработка
Картинка 9:

Ну и наконец-то получаем наш Attention Output, который матрично умножается на матрицу весов Wo: Attention Output x Wo. По итогу получается FinalOutput, которая идёт в следующие слои 😋

Размерности:
- Wo → (embedding_dim, embedding_dim) = (6, 6)
- Attention Output → (batch_size, seq_len, embedding_dim) = (1, 4, 6)
- FinalOutput → (batch_size, seq_len, embedding_dim) = (1, 4, 6)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🍌14🔥136👍2👏1
Forwarded from ML-легушька
Тоже хотите собрать полный комплект яблочной техники? Тогда покупайте мои курсы изучайте статистику.
Сегодня полезный пост, в котором мы начнем собирать статистический словарик для начинающих ML-щиков и аналитиков.
0. Центральная предельная теорема.
Святой грааль теории вероятностей, из которого статистика как наука практически родилась. Что говорит ЦПТ? Если у нас есть много независимых случайных величин из одного распределения, то их среднее (как случайная величина) будет распределена нормально, причем математическое ожидание совпадет с мат.ожиданием одной случайной величины, а дисперсия будет дисперсией одной случайной величины, деленной на кол-во наблюдений. В частности, ошибки измерений и случайный шум часто распределены нормально, что позволяет использовать MSE-loss для моделей, приближающих данные, но про это в другом посте (поддержите активностью, если вам интересно!!!).
1. Статистические гипотезы.
Статистическая гипотеза представляет из себя утверждение о параметрах модели. В тестах обычно используется два вида гипотез - нулевая и альтернативная, обозначаются H0 и H1 соответственно. Нулевая гипотеза - та, которую мы примем, если не соберем достаточных доказательств ее неправильности. Соответственно, ее можно составить по формуле "при отсутствии данных принимаем такое же решение, как если бы было верно...".
Альтернативная гипотеза - гипотеза, требующая доказательств, то есть данных, свидетельствующих о ее правильности и о том, что нулевая гипотеза неверна. Пример: вы - банк, нормальный банк, не МФО, и на основе данных хотите принять решение, является ли заемщик надежным? Тут нулевой гипотезой будет то, что заемщик - ненадежный, ибо зачем без доказательств выдавать кредит кому попало? Это экономически невыгодно.
2. Статистические тесты, уровень значимости, мощность.
После того, как мы определились с гипотезами, нужно их проверить - для этого и нужны статистические тесты. Статистические тесты вычисляют функцию от наблюдений, называемую статистику, и проверяют, попало ли это значение в "критический регион" - множество значений, при которых мы отклоняем нулевую гипотезу. Критический регион основан на знании о том, как распределена тестовая статистика. Тесты бывают односторонние и двусторонние. При одностороннем тесте вы сравниваем тестовую статистику только с одним числом, в двустороннем тесте - с двумя числами. Подробнее с этим мы разберемся в практическом примере.
Однако, помимо формулирования гипотез, перед проведением теста необходимо определиться с уровнем значимости. Уровень значимости показывает, как часто наш тест неверно отклоняет нулевую гипотезу. Более формально - это вероятность отклонить H0 при условии ее правильности. В примере с банком - как часто мы выдаем кредит ненадежным заемщикам. От уровня значимости будет зависеть критический регион теста. Обычно используется значение 0.05 - то есть мы позволяем тесту ошибочно отвергать H0 не более чем в 5% случаев.
Почему же мы не можем поставить уровень значимости очень маленьким, скажем, 0.01%, чтобы почти никогда неверно не отклонять H0? Пострадает мощность. Мощность показывает, как часто мы правильно отклоняем H0, для случая с банком - как часто мы выдаем кредит надежным заемщикам. Если поставить уровень значимости очень низким, то почти все заемщики вернут нам кредит, но самих заемщиков станет сильно меньше! При уменьшении уровня значимости мощность обычно падает, и итоговая значимость будет зависеть от наших бизнес-целей.
🔥7🍌42
Почему ты получаешь отказы после прохождения собеса? Или Алгоритм прохождения собесов 💪

Проблема:
Очень часто такое бывает, что человек проходит 1000 скринингов с HR`ом, 500 техничек и 100 финалок, но всё равно не получает оффер. А почему? Всё очень просто, нужно всего лишь попросить фидбек и исправить свои ошибки

Вроде бы это простая истина, но много моих учеников не понимают такого простого алгоритма:

1️⃣ Ходим на собесы 🍗
Чтобы получить оффер, нам нужно уметь проходить собеседования (оффер = вкачанный навык прохождения собеседования). Поэтому на данном этапе наша цель получить как можно больше приглашений на скрининг и попасть на следующие этапы собеседования.

2️⃣ Просим фидбек 😺
Если мы проебали на каком-то определённом этапе собеседования, то нам обязательно нужно попросить фидбек. Прям не бойтесь мучить HR`ом своими вопросами. Запомните, глупый вопрос это тот вопрос, который не спросили.
Независимо от этапа пишите сообщение вида:
Здравствуйте! Подскажите, пожалуйста, почему мне дали отказ? Для меня очень важно понять, где мои ошибки и пробелы в знаниях, поэтому прошу вас дать фидбек. Буду благодарен)

Также будет ОГРОМНЫМ плюсом, если вы будете записывать собеседование и потом его пересматривать. Хоть это и на первых порах будет вызывать дискомфорт, но результат не заставит долго ждать, если вы будете грамотно анализировать свои ошибки.

3️⃣ Анализируем фибдек 🎲
Тут мы получили фидбек и поняли, что мы не знаем, что такое 'операция умножения и сколько существует цифр'. Теперь мы рассматриваем это не как проблему, а как задачу и задать себе следующий вопрос: "А что я могу сделать, чтобы на следующем собеседовании не допустить такую ошибку?". Нужно понять, как мы можем это исправить.

4️⃣ Исправляем ошибки 🔨
Нам нужно найти материалы, статьи, видео в ютубе, которые помогут нам в решение данной задачи. Выучить это, сделать конспект, шпаргалку, но не допустить, чтобы это повторилось не повторилось на следующем собесе.
Мой пример: Я очень часто могу забыть какую-нибудь формулу, поэтому на собесах использую шпаргалку. Тогда стоит мне чуть взглянуть на неё, я сразу понимаю какой элемент за что отвечает.

Итог 🚶‍♀️
Повторю, получение оффера = навык проходить собесы; навык проходит собесы = повторение шагов 1-4. Выполняя эти простые действия, вы точно получите оффер!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🍌64💯21❤‍🔥1
Итоги of the year и планы на next year 🥇

Чем ещё я буду вас радовать в следующем году 💪
1️⃣ Я выхожу на ютуб. Первое видео уже на стадии монтажа, там будет жёсткий МОК по ClassicML: линейная/логистическая регрессия, l1, l2, переобучение, метрики классификации. Также буду выкладывать записи с собесов, ещё МОКи и другие форматы роликов, короче, будет жёсткий движ
2️⃣ Больше/чаще/качественнее - планирую развивать ТГ-канал ещё больше, чтобы стать большим человеком в медийке, дальше-больше!
3️⃣ Развитие профессионализма/менторства/медийки - именно это три вектора, которые я буду развивать, а как следствие писать для вас об этом

Было проделано не мало работы над качеством и структурой постов и в целом над каналом 🚶‍♀️
- выработал собственный стиль постов: заголовок, подзаголовки, смайлики и смехуюшечки
- определился со своей ЦА в тг-канале: в основном я делаю контент для начинающий ребят, перекатунов и мидлов. В основном посты про найм, как/где/зачем найти работу в DS, выкладываю посты с объяснением материалов из серии "уничтожение" с надеждой, что их кто-то сохраняет и действительно читает
- по цифрам достиг ~930 подписоты к НГ, а в планах было 1к..., но ничего мы ещё добьём!

Надеюсь, что ваши цели в этом году были достигнуты, и вы уже поставили цели на следующий год! Буду вам очень благодарен, если напишите в комментах:
- Свою цель на 2024
- Насколько вы выполнили её в 2024
- И цель на 2025 год

Не стесняйтесь, давайте вместе подведём итоги года) 🤟
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34🍌9👍5❤‍🔥1🎉1💩1
Вопросы, которые вам обязательно зададут на типичном собесе по ClassicML ч1

Все вопросы вы можете посмотреть в моём личном сборнике вопросов, там также есть вопросы не только по ClassicML, но и по NLP, CV и вопросы с компаний)

*️⃣Что такое линейная регрессия ?
Линейная регрессия — это метод прогнозирования, который ищет линейную зависимость между зависимой переменной y и независимыми переменными x. Модель описывается уравнением: y = w*x + b, где w - веса модели, а b - смещение.


*️⃣Как обучается линейная регрессия?
Обучение заключается в подборе коэффициентов w, b, минимизируя функцию потерь, например, среднеквадратичную ошибку (MSE). Методы оптимизации: градиентный спуск или аналитическое решение через нормальное уравнение.


*️⃣Какие плюсы и минусы линейной регрессии ?
Плюсы: может в тенденцию, интерпретируемость, быстрое обучение
Минусы: не работает с нелинейными зависимостями, чувствительна к выбросам


*️⃣Что такое переобучение? Как его обнаружить?
Переобучение — это ситуация, когда модель слишком хорошо подстраивается под обучающие данные, теряя способность обобщать на новые данные. Есть вероятность переобучения, если высокая точность на трейне, и низкая не тесте, а также сильно расходятся кривые обучения.


*️⃣Что такое регуляризация ? Какие виды её бывают, и чем они отличаются? Можешь ли графически интерпиртировать регуляризацию? Почему она помогает бороться с переобучением?
Картинка 1, 2
Регуляризация — это метод добавления штрафа в функцию потерь для уменьшения сложности модели.
L1-регуляризация (Lasso): добавляет штраф на сумму модулей коэффициентов.
L2-регуляризация (Ridge): добавляет штраф на сумму квадратов коэффициентов.
Графическая интерпретация:
L1-регуляризация (Lasso): штраф создает ромбовидный контур ограничений. Это приводит к тому, что веса некоторых признаков могут становиться равными нулю, делая модель разреженной.
L2-регуляризация (Ridge): штраф формирует круговые контуры ограничений. Это приводит к тому, что веса уменьшаются равномерно, сохраняя все признаки в модели, но снижая их вклад.
Почему помогает: Уменьшает влияние нерелевантных признаков и сложных моделей.


*️⃣Какие методы борьбы с переобучением?
- Регуляризация (L1, L2).
- Уменьшение сложности модели путём отбора фичей
- Добавление больше чистых данных.
- Кросс-валидация.


*️⃣Что такое Cross-Validation? TimeSeries-Cross-Validation?
Картинка 3, 4
Кросс-валидация (CV) — метод оценки качества модели через разбиение данных на тренировочные и валидационные наборы (например, K-Fold).
TimeSeries-CV: используется для временных рядов, учитывает временную зависимость. Пример: sliding window или expanding window.
Please open Telegram to view this post
VIEW IN TELEGRAM
🍌13❤‍🔥9👍2🔥21