Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
- Telegram Web
Telegram Web
Уничтожение Алгоритмов v2 🤨

На собесах вам могут спросить как и обычный алгос с LeetCode, так и попросить заебенить линейную регрессию на numpy или self-attention на torch, или на чистом питоне... 😂

Вот роадмапик для низведения до нуля алгоритмов и структур данных 😊
1️⃣ RoadMap от NeedCode`a - необходимая и нерушимая база каждого лайвкодера, на начальном этапе необходимо убить easy задачи тех тем, которые помечены на картинке красным кружком.
2️⃣ Практика по ML - это та самая классика, которую спрашивают на собесах: от реализации градиентного спуска до реализации GPT. Делайте тот объём, который вам комфортен, но я советую сделать всё.
3️⃣ Параллельно с практикой по ML углубляемся в RoadMap от NeedCode`a, там добиваем medium задачки в красном кружочке.
4️⃣ Когда вы прошли предыдущие пункты и точно поняли концепции и техники в решаемых задачах, то можете порешать задачки из файла, в котором есть ссылки на наиболее часто встречающиеся вопросы из собесов в Яшку (файл приложил в комментариях)

Как стоит подходить к изучению материалов 🔫
Решайте алгос 30-40 минут, если ничего не получилось, то смотрите разбор от NeetCode или другого челика. Поняли концепцию и после этого повторили код самостоятельно с этой же концепцией.

Также кидаю дополнительные ресурсы 😘
1️⃣ NeetCode - работник гугла, очень много рассказывает про алгоритмы
2️⃣ RoadMap от NeedCode`a - необходимая и нерушимая база каждого лайвкодера, необходимо убить все эти задачи
3️⃣ Для закрепления ваших знаний и ещё большего погружения в мир алгосов
а) Тренировки по алгоритмам от Яндекса 1.0
б) Тренировки по алгоритмам от Яндекса 2.0
в) Тренировки по алгоритмам от Яндекса 3.0
4️⃣ Алгоритмы, Часть I
5️⃣ Специализация Data Structures and Algorithms
6️⃣ LeetCode - святило всех алгоритмов
7️⃣ Сложность алгоритмов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Уничтожение Self-Attention

Self-Attention или механизм внимания - это такой механизм, который используется сейчас во всех современный LLMках. До него многие задачи решались с помощью рекуррентных нейросетей (RNN), но они обладали некоторыми недостатками:
- сложность в учёте длинных последовательностей
- проблема взрыва/затухание градиентов
- нельзя параллелить вычисления
- сложная в интерпретации

Как итог гугл выкладывает статью Attention Is All You Need. В ней гугл показывает концепцию, которая может решить данные недостатки 💥

Как устроен Self-Attention 💪
1️⃣ Векторизация и создание матриц Query, Key, Value.
На вход подаётся векторные представления слов (зелёные матрицы с 1 картинки). Каждая "строка" в этой матрице - это векторное представление слова. Входящие матрица умножаются на матрицы весов Key, Query, Values. После умножение уже получается матрицы Query, Key, Values (розовая, оранжевая и голубая матрица справа на первой картинке).

2️⃣ Подсчёт значимости между токенами
Умножается матрица Query на транспонированную матрицу Key (Q*K.T). Мы получаем промежуточную матрицу, отражающую значимость токенов друг для друга.

3️⃣ Нормировка
Для нормировки матрицы Q*K.T, матрица делится на корень из значения размерности векторов модели (например, на sqrt(512) для модели с размерностью 512). Нам нужно делить, так как при умножении Q на K.T у нас увеличивается дисперсия на sqrt(размерность).

4️⃣ Применение softmax для вычисления внимания
Потом применяется функция softmax для, чтобы нормализовать значения и получить attention-матрицу. На картинке 3 предложение "Life is short eat desert first", допусти каждое слово - это токен. Проделав шаги 1 - 4 у нас получится примерно такая attention-матрица, как на картинке 3, где каждый с каждым токеном имеет свою оценку "внимания" между собой. Если скор большой, то эти токены как-то связаны между собой, возможно они вместе образуют какую-то общую информацию.

5️⃣ Маскирование (при необходимости)
Зависит от задачи (например обучение генеративной модели), но на attention-матрицу может наложиться маска, например как на картинке 4

6️⃣ Получение итоговых значений
attention-матрица
умножается на матрицу Values по итогу получается матрица, которая идёт в последующие слои.

Почему выбор сделан на self-attention или его преимущества, которые вас обязательно спросят на собесе 💪
1️⃣ Self-Attention может учитывать зависимость между дальними токенами, так как скоры между токенами считаются непосредственно друг с другом
2️⃣ С помощью Multi-Head-Attention достигается параллельный расчёт, что позволяет вычислять всё более большой объём данных.
3️⃣ Self-Attention легче интерпретировать в отличие от RNN

Это была краткая сводка материала, чтобы понять концепцию Self-Attention и рассказать на собесе. Если вы хотите больше узнать более подробно про Self-Attention, то прошу к прочтению 😊
- Всем смотреть базу от Котенкова, здесь мы с ручкой и листком переписываем архитектуру, чтобы в полной мере понимать, как она работает
- Трансформеры в картинках - эту статью прочитать в качестве закрепления материала от Котенкова
- Transformers Explained Visually (Part 3): Multi-head Attention, deep dive
- Attention Networks: A simple way to understand Self-Attention
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN 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
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
Тотальное Уничтожение 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
Forwarded from ML-легушька
Тоже хотите собрать полный комплект яблочной техники? Тогда покупайте мои курсы изучайте статистику.
Сегодня полезный пост, в котором мы начнем собирать статистический словарик для начинающих ML-щиков и аналитиков.
0. Центральная предельная теорема.
Святой грааль теории вероятностей, из которого статистика как наука практически родилась. Что говорит ЦПТ? Если у нас есть много независимых случайных величин из одного распределения, то их среднее (как случайная величина) будет распределена нормально, причем математическое ожидание совпадет с мат.ожиданием одной случайной величины, а дисперсия будет дисперсией одной случайной величины, деленной на кол-во наблюдений. В частности, ошибки измерений и случайный шум часто распределены нормально, что позволяет использовать MSE-loss для моделей, приближающих данные, но про это в другом посте (поддержите активностью, если вам интересно!!!).
1. Статистические гипотезы.
Статистическая гипотеза представляет из себя утверждение о параметрах модели. В тестах обычно используется два вида гипотез - нулевая и альтернативная, обозначаются H0 и H1 соответственно. Нулевая гипотеза - та, которую мы примем, если не соберем достаточных доказательств ее неправильности. Соответственно, ее можно составить по формуле "при отсутствии данных принимаем такое же решение, как если бы было верно...".
Альтернативная гипотеза - гипотеза, требующая доказательств, то есть данных, свидетельствующих о ее правильности и о том, что нулевая гипотеза неверна. Пример: вы - банк, нормальный банк, не МФО, и на основе данных хотите принять решение, является ли заемщик надежным? Тут нулевой гипотезой будет то, что заемщик - ненадежный, ибо зачем без доказательств выдавать кредит кому попало? Это экономически невыгодно.
2. Статистические тесты, уровень значимости, мощность.
После того, как мы определились с гипотезами, нужно их проверить - для этого и нужны статистические тесты. Статистические тесты вычисляют функцию от наблюдений, называемую статистику, и проверяют, попало ли это значение в "критический регион" - множество значений, при которых мы отклоняем нулевую гипотезу. Критический регион основан на знании о том, как распределена тестовая статистика. Тесты бывают односторонние и двусторонние. При одностороннем тесте вы сравниваем тестовую статистику только с одним числом, в двустороннем тесте - с двумя числами. Подробнее с этим мы разберемся в практическом примере.
Однако, помимо формулирования гипотез, перед проведением теста необходимо определиться с уровнем значимости. Уровень значимости показывает, как часто наш тест неверно отклоняет нулевую гипотезу. Более формально - это вероятность отклонить H0 при условии ее правильности. В примере с банком - как часто мы выдаем кредит ненадежным заемщикам. От уровня значимости будет зависеть критический регион теста. Обычно используется значение 0.05 - то есть мы позволяем тесту ошибочно отвергать H0 не более чем в 5% случаев.
Почему же мы не можем поставить уровень значимости очень маленьким, скажем, 0.01%, чтобы почти никогда неверно не отклонять H0? Пострадает мощность. Мощность показывает, как часто мы правильно отклоняем H0, для случая с банком - как часто мы выдаем кредит надежным заемщикам. Если поставить уровень значимости очень низким, то почти все заемщики вернут нам кредит, но самих заемщиков станет сильно меньше! При уменьшении уровня значимости мощность обычно падает, и итоговая значимость будет зависеть от наших бизнес-целей.
2024/12/21 12:29:13
Back to Top
HTML Embed Code: