19745
Все о Data Science, машинном обучении и искусственном интеллекте: от базовой теории до cutting-edge исследований и LLM. MAX - https://max.ru/devsp Личный блог - @just_genych По вопросам рекламы или разработки - @g_abashkin РКН: https://vk.cc/cJPGXD
Feature Aliasing в real-time пайплайнах: как отлавливать синонимы признаков с помощью графов, когда нет времени на батч-джойн
Когда один и тот же признак приходит под десятком имен в real-time потоке, модель либо видит разреженные фичи, либо учит шум. В продакшене это вылезает в момент масштабирования, когда rule-based маппинг на if-else превращается в ад поддержки, а словарь синонимов растет быстрее, чем инфраструктура.
Проблема: синонимы множатся, latency не прощает
user_id, userId, user.id — в батче это смержили бы за один join. В real-time пайплайне с миллионами событий в секунду такая роскошь недоступна. Rule-based подход с конфигами работает до первого расширения, а потом каждое новое имя фичи требует правки кода и редеплоя. Ошибка, которую я вижу чаще всего — попытка поддерживать словарь синонимов вручную или через regex, что ломается на первом же нестандартном паттерне.
Решение: graph-based дедупликация с Union-Find
Подход, который работает в реальном продакшене: строится граф синонимии, где вершины — это имена признаков или их значения, а ребра — семантическая или статистическая связь. Затем через Union-Find (или Connected Components) выделяются канонические группы. В прототипе подойдет NetworkX, но в production нужно инкрементальное обновление.
Пример кода для ядра логики:
class UnionFind:
def __init__(self):
self.parent = {}
def find(self, x):
if self.parent.setdefault(x, x) != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
px, py = self.find(x), self.find(y)
self.parent[px] = py
Batch-level caching для эмбеддингов: как не пересчитывать одно и то же в real-time
В production рекомендательных системах и NLP-сервисах узкое место часто — генерация эмбеддингов. Когда на один user request нужно проинференсить десятки кандидатов, каждый запрос требует векторного представления каждого объекта. Латенси растет, и специалисты часто упускают простой оптимизационный трюк: кэширование в рамках батча, а не глобальное.
Почему batch-level caching?
Запросы к инференс-сервису приходят батчами. Если вычислять эмбеддинги для каждого кандидата заново, число вызовов модели растет линейно с числом запросов и объектов в каждом. Однако многие объекты повторяются между запросами: топ-рекомендуемые товары, популярные тексты, частые сущности. Batch-level caching решает это дедупликацией ID внутри одного батча, минимизируя повторные вычисления.
Как это работает
Собираете все ID объектов из всех запросов батча, дедуплицируете их, вычисляете эмбеддинги только для уникальных ID, затем раздаете результаты через маппинг. Пример на Python:
def process_batch(batch_requests):
all_unique_ids = {}
for req in batch_requests:
for item_id in req['item_ids']:
all_unique_ids[item_id] = True
unique_ids_list = list(all_unique_ids.keys())
embeddings_map = compute_embeddings(unique_ids_list)
results = []
for req in batch_requests:
req_embeddings = [embeddings_map[i] for i in req['item_ids']]
results.append(compute_scores(req['user_vec'], req_embeddings))
return results
Positional attention decay в transformer-моделях: как информация вымывается из середины контекста и что с этим делать в production
Даете модели длинный документ, она уверенно отвечает на вопросы по началу и концу, но проваливается, когда ответ зарыт в середине. Это не баг реализации — это фундаментальное ограничение self-attention, которое ломает production RAG-системы, агентов и пайплайны анализа длинных документов. Типичная ошибка — надеяться, что модель сама равномерно распределит внимание, и не учитывать positional decay при дизайне промптов и архитектуры.
Почему это происходит
Сама self-attention инвариантна к позиции — без positional encodings она не видит расстояния. Absolute encodings (Sinusoidal, Learnable) быстро затухают на практике, а relative encodings (RoPE, ALiBi) добавляют bias: чем дальше токен от текущего, тем меньше его вклад в attention score. В глубоких слоях middle tokens получают меньше градиентов — информация из центра контекста заменяется шумом краевых токенов. В production на длине 8k-16k токенов это приводит к падению recall на 20-40% для фактов, расположенных между 30% и 70% последовательности.
Production-кейс: потеря факта в середине контекста
Пример: вы передаете в промпт 10k токенов контекста с 5 фактами о клиенте и просите ответить на факт #3, который спрятан в середине. Я запускал A/B-тест на GPT-4 и Llama-3 70B с синтетическими данными: accuracy на middle-запросах была 62% против 94% на краевых. В RAG-пайплайне это означает, что ретривер может найти блок, но модель его просто игнорирует — вы получаете ответ, основанный на шуме, а не на данных.
Практические приемы для production
1. Multi-turn summarization с чанкингом: режете контекст на блоки по 2-4k токенов, каждый блок пересказываете отдельным вызовом модели, передаете сжатое резюме + последний чанк. Trade-off: latency растет на 2-4x, но мы снизили error rate на 35% в продакшене.
2. Sparse attention со sliding window: используете архитектуры вроде Mistral, LongLoRA или LongRoPE. Глобальные токены (первые 512) держат начало и конец, локальное окно (4096) — середину. Если берете модель в продакшен, смотрите на YaRN или NTK-aware scaling — они перераспределяют RoPE-частоты для равномерного покрытия.
3. Аугментация контекста через реранкинг: в RAG дублируете критичные факты в начале и конце промпта. Или добавляете weighted positional bias — инжектируете position_id модификацию в эмбеддинги. Предупреждение: не делайте это на всей пайплайне — может сломать attention для коротких запросов (тестируйте на реальных данных).
4. Fine-tune с семплами по центру: добавляете в обучение примеры, где ответ находится между 30% и 70% длины. Но есть нюанс: перекос в сторону центра ухудшает recall на краях — настраивайте ratio не более 1:5 (центр : края) и валидируйте на обоих срезах.
Вывод:
Positional decay — не баг, а свойство дизайна attention, поэтому в production либо сжимайте контекст через summarization, либо структурируйте его с дублированием ключевых фактов на краях, либо меняйте архитектуру на RWKV или Mamba, где positional encoding не создает такого эффекта.
Стабильность градиентов при длинных последовательностях: как Spherical Gradient защищает от взрывов и затуханий в online-обучении временных рядов
В онлайн-обучении временных рядов градиенты либо взрываются, либо затухают на длинных последовательностях. LSTM и GRU справляются нестабильно: при потоковых данных модель не успевает адаптироваться к новым паттернам из-за экспоненциального роста или схлопывания градиента.
Проблема стандартного Gradient Clipping
Классический gradient clipping с фиксированным порогом часто ломается в online-режиме. При коротких последовательностях он обрезает слишком агрессивно, теряя информацию о редких событиях. А при длинных — не защищает от затухания, так как работает только с верхней границей нормы.
Spherical Gradient: принцип и реализация
Подход нормирует градиент на каждом шаге, фиксируя его длину при сохранении направления. Это L2-нормировка, которая решает обе проблемы:
- Градиент не взрывается, так как норма ограничена (например, 1.0)
- Градиент не затухает, так как даже при норме около нуля восстанавливается до фиксированного значения
Пример на PyTorch для production-сценария:
def spherical_gradient_clip(grad, max_norm=1.0, eps=1e-8):
norm = grad.norm()
if norm > max_norm:
return grad * (max_norm / norm)
elif norm < eps:
return torch.randn_like(grad) * eps
return grad
Обновили encoder - сломали ANN? Как мигрировать эмбеддинги без боли
В embedding-based системах encoder - это часть контракта данных. Его нельзя обновлять как обычную ML-модель: в ANN-индексе уже лежат вектора из старого пространства, и частая ошибка - считать совместимость гарантированной из-за той же размерности и метрики.
Почему совместимость ломается
Даже если размерность та же, cosine тот же, а offline-бенчмарк лучше, новый encoder не обязан быть совместим со старым индексом.
После обновления меняются:
- геометрия пространства;
- распределение норм;
- локальные окрестности;
- ranking ближайших соседей;
- калибровка score’ов;
- поведение ANN-структуры: HNSW/IVF/PQ строились под старое распределение.
Главный анти-паттерн: писать новые документы новым encoder’ом в старый индекс со старыми embedding’ами.
model_name, а полный контракт:embedding_version = encoder + tokenizer + pooling + normalization + dim + metricembedding_version рядом с документом, запросом, индексом и retrieval-логами. Иначе при деградации recall или CTR вы не поймёте, какой encoder реально участвовал в выдаче.docs_v1 -> embeddings_v1 -> ann_index_v1
docs_v2 -> embeddings_v2 -> ann_index_v2
M, efConstruction, efSearch могут быть не оптимальны для нового распределения.on_document_upsert(doc):
emb_v1 = encoder_v1(doc)
emb_v2 = encoder_v2(doc)
index_v1.upsert(doc.id, emb_v1)
index_v2.upsert(doc.id, emb_v2)
query -> encoder_v1 -> index_v1 -> results_v1
-> encoder_v2 -> index_v2 -> results_v2
ann_index_v1.
Temporal leakage в feature store: как point-in-time joins, backfill’ы и проверка каузальности фичей спасают модель от красивой offline-метрики и провала в проде
Temporal leakage в feature store - один из самых дорогих способов получить отличную offline-метрику и бесполезную модель в production. Проблема не в том, что фича плохая, а в том, что на train она знает больше, чем модель знала бы в момент принятия решения.
Предсказываем churn на датуt, а в фичах используемtransactions_last_30d, посчитанный после backfill’а из таблицы, куда транзакции доехали с задержкой или были пересчитаны с учетом будущих исправлений.
prediction_time. Фичи должны быть взяты в том состоянии, в котором они были доступны на этот момент.event_time - когда событие реально произошло;ingestion_time / created_at - когда оно попало в систему;available_at - когда фича стала доступна модели;prediction_time - момент прогноза.event_time <= prediction_time, но и available_at <= prediction_time:WITH ranked_features AS (
SELECT
l.entity_id,
l.prediction_time,
f.feature_value,
ROW_NUMBER() OVER (
PARTITION BY l.entity_id, l.prediction_time
ORDER BY f.event_time DESC
) AS rn
FROM labels l
JOIN features f
ON f.entity_id = l.entity_id
AND f.event_time <= l.prediction_time
AND f.available_at <= l.prediction_time
)
SELECT *
FROM ranked_features
WHERE rn = 1;
available_at, вы часто не можете доказать, что leakage отсутствует.Какую фичу модель увидела бы тогда, если бы пайплайн работал с теми же задержками, источниками и правилами доступности?
historical truth, а reconstructed truth. Для обучения моделей это разные вещи.prediction_time?days_since_last_payment_failed для задачи дефолта может быть почти прямым следствием будущего таргета.last_7d должно означать [t-7d, t), а не календарную неделю, которая включает будущее относительно t.event_time подходит.
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ
ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня
И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную.
Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы.
Подписывайтесь, нас уже 45 тысяч: @vibecoding_tg
Замечен челлендж с реальными данными и большим призовым фондом.
Ozon Tech запустил хакатон Робозон, который объединяет три инженерных трека на стыке CV и робототехники.
Призовой фонд приятный — 15 млн руб. Финалистов компания обещает отвези на E-CODE.
Задачи уже выложили, месяц на регистрацию. Участвовать можно хоть в одиночку. Или собрать команду до 7 человек.
Глядя на эти три задачи, кто из вас прямо сейчас уверен, что вытащит такую сортировку в продакшен за два месяца?
Хватит гадать — DeepSeek за тебя уже всё решил 🐳
* Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Бесплатно, контекст 1 млн токенов — закинул целую книгу, помнит всё. Код пишет отлично, а рассуждения (Reasoning) выдают логику, как у архитектора.
Решил протестировать агентский режим на задаче, которую вечно откладывал — собрать чистое инфополе с нуля. Чтобы не перебирать паблики вручную, зашёл через функцию похожих каналов в Telegram.
Скормил DeepSeek ссылки на качественных авторов по IT и AI, которых читаю сам, и попросил проанализировать сотни рекомендаций. Агент изучил контент на каналах и оставил только тех, кто делится практическим опытом по: AI-воркфлоу, автоматизации, вайб-кодингу, промт-инжинирингу, RAG-syst. нейрогенерации и др.
DeepSeek собрал полезную подборку экспертов в одну папку. Делюсь списком — внутри только полезный контент про IT & AI.
🔗Забирай в один клик: 👉 /channel/addlist/FYyQj91I8jJiMzg0
Что такое calibration модели и зачем она нужна
Многие смотрят на модель
только через:
👉 accuracy
👉 F1
👉 ROC-AUC
Но есть проблема.
Даже модель с хорошими метриками
может очень плохо оценивать вероятности.
Вторая модель calibrated.
Первая — нет.
«Можно ли доверять вероятностям модели?»
Бизнес часто работает не с классом,
а с risk score.
ROC-AUC оценивает ranking,
а не качество probability estimates.
Там главное — leaderboard.
Читать полностью…
В какой-то момент оказывается,
что качество вероятностей
важнее красивого ROC-AUC.
Reinforce.fi Challenge: Market-Action Arena
Хакатон по reinforcement learning в трейдинге с призами до $2,500 от Reinforce.fi (ex-Overnight.fi)
Задача:
построить модель, которая на каждом шаге выбирает оптимальное действие (A1–A10) и максимизирует суммарный PnL.
Что внутри:
— анонимизированные market-like признаки
— последовательности по 1000 шагов
— частично наблюдаемая среда
— скоринг = суммарный PnL
Почему это интересно с engineering стороны:
— задача на policy optimization, а не классический supervised ML
— длинные эпизоды (1000 steps)
— важно устойчивое поведение модели, а не single-step accuracy
— приближено к реальному execution / trading loop
Призы:
1 место — $2,500
2 место — $1,500
3 место — $1,000
Старт: конец июня
Длительность: ~1.5–2 месяца
Регистрация:
https://forms.gle/UB71QuyUvp8mSBRo9
Чат хакатона:
/channel/+R6lMJ10VXP5hOTI0
Российские ученые представили более быстрый и дешевый метод дообучения VLM
Команда исследователей из Т-Банка проверила, можно ли прокачивать визуально-языковые модели не в настоящих интерфейсах и средах, а в синтетических симуляторах — и переносить эти навыки на реальные задачи. И оказалось, что да: ученые представили метод VL-DAC, который учит модели совершать последовательность действий
Почему существующих методов недостаточно?
Современные VLM-модели неплохо понимают картинки, но начинают теряться, когда нужно действовать последовательно: открыть нужный раздел, выбрать объект, применить фильтр, построить маршрут или выполнить инструкцию шаг за шагом. И обучение таким сценариям в реальном мире дорогое и времязатратное. Можно тренировать модели в симуляторах, но существующие подходы требуют либо постоянного подбора коэффициентов вручную, либо большего количества памяти для хранения результатов о предыдущих шагах, либо смешивают обучение действию и оценке пользы выполненного действия. 🗒
Так был разработан метод VL-DAC. Модель обучалась сразу в нескольких средах для развития отдельных навыков:
•MiniWorld — навигация и маршруты
•Gym-Cards — выбор объекта по заданным условиям
•ALFWorld — выполнение инструкций и взаимодействие с внешними объектами
•WebShop — работа с веб-интерфейсами
Что получилось на практике?
После обучения модель Qwen2-VL-7B стала более чем на 50% лучше справляться с интерактивными задачами, улучшила пространственную ориентацию и веб-навигацию
Самое интересное — модель учится не только совершать действия, но и понимать, были ли они полезны для достижения цели. Это делает перенос навыков из симуляции в реальные задачи намного стабильнее 😐
🖥 Как научить LLM работать с поиском в интернете
Мы уже давно научили модели решать задачи, как математические уравнения или вести разговоры. Но когда речь заходит о реальной проверке фактов, поиск и анализ информации в интернете для многих LLM остаётся проблемой. Ведь одного запроса в поисковике недостаточно. Как и нам, так и моделям нужно уметь «идти по следам», уточнять данные и делать выводы на основе множества источников. Именно для этого команда InfoAgent создала своего рода «веб-детектива» — агента на базе LLM, который эффективно и последовательно ищет, анализирует и сопоставляет данные.
Что же отличает этот подход от обычных поисковых систем? В том, что агент не просто делает один запрос и «сдаётся». Он строит целую цепочку шагов, как опытный аналитик, постепенно уточняя информацию и проверяя факты.
❓ Как работает агент?
Основной принцип работы модели заключается в чередовании двух инструментов: поиска и просмотра страниц. Поиск предоставляет список URL с короткими фрагментами текста, а просмотр — длинные фрагменты выбранных страниц. Все найденные данные фиксируются в контексте, создавая «след», который агент использует для дальнейших шагов, а не полагается исключительно на память.
Команда не использовала стандартные API для поиска. Вместо этого был создан собственный конвейер, который фильтрует и обрабатывает информацию гораздо точнее. Результаты поиска проходят через BM25, эмбеддинги и ререйканинг, что даёт возможность LLM собирать более точные и тематичные сниппеты.
❗️ Почему обычный «вики-ретривер» не подходит?
InfoAgent делает акцент на задаче, где важно не просто находить факты, а проверять их на глубоком уровне. Для этого они специально «размывают» данные — имена заменяются на описания, даты превращаются в диапазоны, а точные формулировки перефразируются. Это заставляет модель не торопиться и искать более точные данные. При этом вопросы подбираются таким образом, чтобы агент не мог дать быстрый ответ — они требуют развернутого анализа.
⁉️ Как обучают модель?
Основным этапом обучения является создание длинных траекторий запросов, иногда до 20 шагов, где каждый запрос уточняет предыдущий. Изначально агент учится на размеченных данных (SFT), а затем проходит этап усиления с помощью обучения с подкреплением (RL). Это помогает модели не останавливаться на первом попавшемся ответе, а продолжать искать до тех пор, пока не будет найдено точное решение.
🔼 На практике, агент InfoAgent демонстрирует выдающиеся результаты. Например, на сложных бенчмарках он показывает отличные результаты, часто обходя более крупные модели с большим количеством параметров. При этом переход от SFT к RL существенно повышает точность поиска, делая результаты более разнообразными и точными.
Agentic Vision: Google превращает зрение модели в рабочий процесс
Google quietly выкатили Agentic Vision для Gemini 3 Flash, и это довольно важный сдвиг в том, как модели работают с изображениями. Вместо привычного «посмотри на картинку и ответь» теперь используется полноценный цикл Think–Act–Observe: модель сначала анализирует изображение и строит план, потом запускает код для обработки — детекцию, расчёты, измерения — и только после этого возвращается к рассуждению уже с новыми данными в контексте. Проще говоря, картинка превращается не в статичный вход, а в рабочее пространство для мышления. Типовой пример — подсчёт пальцев: модель не угадывает число, а реально детектит каждый палец, считает боксы и выводит результат. Лучше всего это заходит на сложных таблицах, схемах и мелких деталях, где обычное «визуальное понимание» раньше сыпалось. По метрикам прирост относительно обычной Gemini 3 Flash — в среднем 5–10%, а попробовать фичу уже можно и через API, и в AI Studio.
Data Science
🤣 Мем отлично отражает настроения в сообществе прямо сейчас
✖️ xCode Journal
Feature-wise Gradient Noise Injection против концептуального дрейфа
Концептуальный дрейф — это когда модель резко теряет качество, потому что данные поменялись. В online-пайплайнах это проблема номер один. Модель банально переобучается под текущее распределение, а при сдвиге — всё, метрики летят в тартарары. Ретрейнинг? Запаздывает. Детекция дрейфа? Тоже не сразу, да и переразметка нужна. Есть штука поизящнее — Feature-wise Gradient Noise Injection.
Суть метода
Коротко: добавляем шум к градиентам, но не абы как, а для каждого признака отдельно, с учётом его дисперсии в батче. Это мешает модели выучивать хрупкие паттерны, которые типичны для дрейфа. Признаки с высокой дисперсией — те, что чаще всего и дрейфуют — получают больше шума, их влияние на обновление весов снижается. Модель учится обобщать, а не запоминать случайные корреляции.
Почему это работает
Шум адаптируется под текущее распределение — если дисперсия меняется при дрейфе, шум автоматически подкручивается. И никакой отдельный детектор не нужен, регуляризация уже вшита в обучение. На мини-батче считаем дисперсию каждого признака σ²_j. Потом к градиенту по этому признаку добавляем шум N(0, λ·σ²_j). λ — гиперпараметр.
Пример на PyTorch
import torch
def add_feature_wise_noise(grad, features, lambda_noise=0.01):
var = features.var(dim=0, unbiased=True)
noise = torch.randn_like(grad) * (lambda_noise * var.sqrt())
return grad + noise
for x_batch, y_batch in dataloader:
pred = model(x_batch)
loss = criterion(pred, y_batch)
loss.backward()
for param in model.parameters():
if param.grad is not None:
param.grad = add_feature_wise_noise(param.grad, x_batch)
optimizer.step()
optimizer.zero_grad()
Feature-wise quantization-aware training для production inference: как сохранить метрики при внедрении 4-битных моделей на GPU с ограниченной памятью
Квантование до INT4 в продакшене режет память, но часто убивает метрики на чувствительных признаках. Обычный QAT усредняет scale на весь тензор, и редкие, но критичные фичи затираются. Feature-wise QAT решает это на уровне отдельных признаков.
Почему обычный QAT ломает метрики
Стандартное квантование обучает единый scale для всего тензора. В production-моделях, особенно в рекомендательных системах или NLP, некоторые признаки имеют высокую дисперсию или распределены неравномерно. Пример — эмбеддинги редких сущностей или временные ряды с выбросами. Один scale усредняет эти выбросы, и модель теряет важные нюансы, теряя 2-5% на задачах классификации и регрессии.
Как работает Feature-wise QAT
Вместо общего scale ты учишь отдельные параметры для каждого признака: scale и zero-point. Во время fine-tuning модель подстраивает каждый канал под искажения при 4-битном представлении. Псевдокод кастомного слоя:
class QuantLayer(nn.Module):
def __init__(self, num_features, bits=4):
super().__init__()
self.scales = nn.Parameter(torch.ones(num_features))
self.zero_points = nn.Parameter(torch.zeros(num_features))
self.max_val = 2**(bits-1) - 1
def forward(self, x):
x_scaled = x / self.scales
x_quant = torch.clamp(torch.round(x_scaled), -self.max_val, self.max_val)
return x_quant * self.scales
Label Leakage: когда валидация врет, а метрики — это иллюзия
Радуешься ROC-AUC 0.99 на сложном пайплайне, а в проде модель выдает 0.6? Знакомо. Это label leakage — утечка таргета. Но часто проблема не в банальной ошибке вроде scaler.fit(X_train, y_train). Скрытые пути хитрее, и они любят засады на middle/senior уровнях.
1. Агрегаты с прицелом на будущее
Классика в feature engineering. Допустим, считаешь среднее по категории:
df['avg_target_by_city'] = df.groupby('city')['target'].transform('mean')
Delayed feedback в CVR-моделях: как не сломать обучение и оценку конверсий из-за запаздывающих лейблов
В CVR пользователь может конвертироваться через минуты, дни или недели после клика, поэтому разметка «как есть» часто превращает будущие positive в ложные negative. Это критично для рекламы, рекомендаций, marketplace-воронок и A/B-тестов, где модель обучается на неполных логах.
Проблема: лейбл может быть еще не созрел
Для клика в момент click_time = t мы хотим оценить:P(conversion | click, x)
Но на дату сборки датасета T мы знаем только одно из двух:
* конверсия уже произошла до T
* конверсии пока не видно
Второй случай не равен converted = 0. Это censored observation: объект наблюдался недостаточно долго.
Типичная ошибка:
converted = 1, если conversion_time - click_time <= 7d
converted = 0, иначе
2025-01-31, то в train стоит брать клики не позже 2025-01-24.event_time, label_observed_until, horizon и label_age. Без них невозможно воспроизвести разметку и понять, почему CVR изменился после очередного retraining.P(y = 1, delay <= H | x)P(delay <= age | y=1, x)P(conversion at day k | no conversion before day k, x)horizon = 7d, то holdout должен содержать только объекты, для которых прошло минимум 7 дней после клика. Иначе вы измеряете не качество модели, а незрелость лейблов.train: clicks [D0, D1]
validation: clicks [D2, D3]
label cutoff: >= D3 + horizon
0-1h1-24h1-3d3-7d7d+
Как находить вредные обучающие примеры перед fine-tune: influence functions, TracIn и data pruning в production ML
В production ML «плохие» train-примеры могут стоить дорого: кластер mislabeled, устаревших или аномальных объектов способен стабильно ухудшать fine-tune на свежем срезе данных. Частая ошибка - чистить датасет только по эвристикам и не проверять, какие samples реально увеличивают loss на production-like validation.
1. Influence Functions
Идея: оценить, как изменится loss на validation-примере z_val, если немного увеличить вес train-примера z_train.I(z_train, z_val) ≈ - ∇L_val^T H^-1 ∇L_train
где H - Hessian по параметрам модели.
Если influence большой и положительный, train-пример, вероятно, увеличивает validation loss и вредит качеству.
Плюсы:
- аккуратная теоретическая постановка;
- можно связывать конкретные train-примеры с конкретными ошибками модели.
Минусы:
- дорогой H^-1;
- плохо масштабируется на большие нейросети;
- чувствителен к non-convexity, batchnorm/dropout, чекпоинтам и приближению Hessian.
В production обычно используют приближения: LiSSA, conjugate gradients, low-rank approximation или считают influence только для последнего слоя / head модели.
2. TracIn
Более инженерный вариант: train-пример полезен для val-примера, если их градиенты по ходу обучения направлены похоже. Вреден - если направлены противоположно.TracIn(z_train, z_val) = Σ_c η_c · ∇L_train(θ_c) · ∇L_val(θ_c)
где θ_c - чекпоинты, η_c - learning rate.
Сильно отрицательный score означает: train-пример тянет модель против направления, полезного для validation.
Мини-скетч для последнего слоя:
for ckpt in checkpoints:
model.load_state_dict(load(ckpt))
g_val = mean_grad(model.head, val_loader)
for i, batch in enumerate(train_subset):
g_train = grad(model.head, batch)
scores[i] += lr[ckpt] * dot(g_train, g_val)
harmful = argsort(scores)[:K]
train→val.remove / downweight / relabel и смотреть trade-off между quality, latency пересчета, стоимостью разметки, воспроизводимостью и надежностью мониторинга.
Конформные интервалы в production ML при covariate shift: как держать coverage без бесполезно широких предсказаний
Split conformal хорошо работает при exchangeability: train, calibration и test приходят из одного распределения. В production это часто ломается из-за гео, девайсов, каналов, сезонности или смены acquisition mix, а типичная ошибка - просто расширить интервалы “с запасом”.
Что именно ломается
При covariate shift имеем:p_prod(x) != p_cal(x)
но предполагаем, что p(y|x) примерно сохраняется. Если считать обычный conformal quantile на старом calibration set, coverage на текущем трафике может просесть.
Наивное решение - увеличить correction глобально. Coverage частично вернется, но price prediction interval, ETA interval или forecast band станут настолько широкими, что downstream-система перестанет им доверять.
Базовый production-рецепт
1. Учим quantile-модель:q_low(x), q_high(x)
2. На calibration set считаем nonconformity scores:s_i = max(q_low(x_i)-y_i, y_i-q_high(x_i), 0)
3. Оцениваем importance weights:w_i ~= p_prod(x_i) / p_cal(x_i)
4. Берем не обычный, а weighted quantile score'ов.
5. Для нового объекта строим:C(x) = [q_low(x)-tau, q_high(x)+tau]
Минимальный скелет:
import numpy as np
def weighted_quantile(values, weights, q):
order = np.argsort(values)
v = np.asarray(values)[order]
w = np.asarray(weights)[order]
cw = np.cumsum(w)
return v[np.searchsorted(cw, q * cw[-1])]
alpha = 0.1
scores = np.maximum(q_low_cal - y_cal,
y_cal - q_high_cal,
0)
weights = ratio_model.predict_weight(X_cal)
tau = weighted_quantile(scores, weights, 1 - alpha)
low = q_low_prod - tau
high = q_high_prod + tau
tau часто переоценивает неопределенность, если ошибка модели сильно зависит от x.s_i = |y_i - y_hat_i| / sigma_hat(x_i), а интервал строится как y_hat(x) +- tau * sigma_hat(x).tau по geo, device, channel, price bucket или risk bucket. Это близко к Mondrian conformal, но требует достаточного числа calibration examples в каждом сегменте.ESS = (sum w)^2 / sum(w^2)X.
Corpus drift в RAG-системах: как заметить деградацию retrieval без разметки, labels и явных ошибок
В RAG retrieval часто ломается тихо: модель та же, embedding model тот же, prompt тот же, latency в норме, а ответы стали хуже. Типичная ошибка - сразу крутить prompt или ругать LLM, хотя проблема ниже: изменился корпус.
1. Мониторьте drift самого корпуса
Мы не измеряем качество напрямую, но смотрим, как изменилось пространство, в котором работает retriever:
- распределение embedding-ов чанков;
- средняя длина чанка, overlap, число чанков на документ;
- доля новых, удалённых и изменённых чанков;
- дубликаты и near-duplicates;
- распределение доменов, типов документов, языков, дат;
- плотность embedding-пространства: не стало ли много «слипшихся» чанков.
Если корпус заметно сдвинулся, старые retrieval-пороги и ожидания по top-k могут стать мусором. Особенно если confidence logic завязана на score или gap между top-1 и top-2.
2. Anchor queries вместо labels
В production почти никогда нет labels вида «для этого query релевантны вот эти chunks». Но можно взять стабильный набор production-запросов: например, 500-5000 частых или бизнес-критичных query.
Это не разметка. Мы не знаем правильный chunk. Но знаем, что retrieval-поведение не должно хаотично меняться после каждого обновления корпуса.
Для каждого anchor query сохраняйте baseline:
- top-k doc/chunk ids;
- retrieval scores;
- rank positions;
- gap между top-1 и top-2;
- diversity top-k;
- source distribution.
После обновления корпуса сравнивайте новый retrieval с baseline.
Полезные proxy-метрики:
- Jaccard@k между старым и новым top-k;
- rank churn: сколько документов поменяло позиции;
- score distribution shift;
- падение top-1 score;
- уменьшение score gap;
- рост доли low-confidence retrieval;
- изменение источников в top-k;
- рост почти одинаковых чанков в top-k.
Минимальный набор, который уже даёт сигнал:
- mean_jaccard@10;
- p95_top1_score_drop;
- score_wasserstein между baseline и current scores.
3. Как интерпретировать сигналы
- mean_jaccard@10 резко упал: retriever стал приносить другой контекст;
- top-1 score системно падает: запросы хуже матчятся с корпусом;
- score distribution сильно сдвинулась: старые thresholds и confidence logic могли сломаться.
Практический совет: считайте эти метрики не только глобально, но и по сегментам - источникам, языкам, типам документов, продуктовым доменам. Глобальный average легко скрывает деградацию в критичном сегменте.
4. Retrieval confidence без ground truth
Даже без разметки можно смотреть на «уверенность» ретривера:
- высокий top-1 score;
- большой gap между top-1 и top-2;
- согласованность dense retrieval и BM25;
- стабильность top-k при query rewriting;
- низкая доля дубликатов в top-k;
- покрытие нужных источников.
Если dense и lexical retrieval внезапно начали расходиться, не стоит списывать это на шум. Часто это значит, что корпус или запросы изменились так, что одна из стратегий больше не работает как раньше.
Production minimum для RAG:
- хранить snapshot retrieval-результатов для anchor queries;
- считать overlap, score drift и rank churn после каждого обновления корпуса;
- отдельно мониторить дубликаты, новые чанки и распределения источников;
- заводить alerts не на один query, а на агрегаты по сегментам.
Corpus drift неприятен тем, что не выглядит как авария. Система отвечает, ошибок нет, latency нормальная. Просто контекст стал чуть менее релевантным. Потом ещё чуть менее. И качество RAG медленно проседает.
Вывод:
Без labels нельзя честно измерить relevance, но можно мониторить стабильность retrieval-поведения, уверенность ретривера и изменения корпуса, чтобы поймать деградацию раньше пользователей.
Turbo ML Conf 2026: конференция в области машинного обучения и ИИ пройдет в Москве в третий раз
На мероприятии, которое Т-Технологии проведут 18 июля в ДК “Серп и Молот”, соберутся ML-инженеры, исследователи, продакты и техлиды AI/ML-команд из крупнейших российских компаний. В этом году организаторы делают Turbo ML Conf 2026 более хардовым: меньше воды, больше практической информации и упор на практику в реальных кейсах. Одна из ключевых тем — разработка современных моделей, их архитектурные особенности и интеграция в конечные продукты. Программа разделена на три направления. Первое посвящено архитектуре современных моделей, их интерпретируемости, безопасному поведению, способности к рассуждению и самокоррекции. Второе — внедрению ML в продукты, интеграции классических и GenAI-моделей, влиянию на бизнес-метрики и пользовательский опыт. Третье — пайплайнам данных, методам дообучения, низкоуровневой оптимизации инференса и инфраструктуре. В программе — демозоны от ведущих компаний про продуктовые, платформенные решения с применением ML, а также выступления спикеров, которыми станут более 20 экспертов из Т-Банка, Яндекса, Авито, Сбера и Института AIRI. Участие бесплатное по предварительной регистрации. Количество мест ограничено.
Data Science
Когда ИИ-агент выходит за пределы экспериментов, одного «умного чата» становится мало. Чтобы агент был полезен в рабочей разработке, ему нужны правила, доступ к инструментам, понятный контекст, проверка действий и безопасная обвязка. Иначе вместо ускорения команда получает непредсказуемость, лишние риски и дорогой хаос в контекстном окне.
На открытом уроке 15 июня в 20:00 разберём, как устроены современные ИИ-агенты и их обвязка: правила, модули навыков и MCP — протокол подключения модели к внешним инструментам.
Поговорим, чем поведенческий слой агента отличается от слоя подключения, где искать готовые навыки, почему они стали популярны и как их устанавливать. Отдельно обсудим, как с помощью MCP дать агенту нужные инструменты, не перегружая контекст, а также как защищать агентов: схемы проверки, журналы аудита и типовые способы атак.
Урок не для тех, кто хочет просто «подключить агента к проекту» без правил, контроля и понимания рисков. И не для тех, кто считает, что рабочая интеграция ИИ — это только написать хороший запрос.
Регистрация: https://vk.cc/cYDpol
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Почему многие DS не понимают бизнес-задачу
Одна из самых частых проблем в Data Science
вообще не связана с моделями.
Многие DS отлично знают:
👉 метрики
👉 архитектуры
👉 feature engineering
👉 Python
👉 математику
Но при этом плохо понимают,
зачем бизнесу нужна модель.
Хотя для бизнеса разницы почти нет.
Хотя это важнее половины ML-стека.
«Получить максимальную метрику».
И иногда лучший ML-проект —
это вообще не ML.
Ещё до того,
как нормально поняли саму задачу.
А тем,
что умеют связывать:
👉 данные
👉 продукт
👉 ограничения
👉 деньги
👉 реальный процесс
🤣 Не баг, а фича
✖️ xCode Journal
Почему нормализация данных иногда ухудшает модель
Есть совет,
который почти все слышат в начале изучения ML:
«Всегда нормализуй данные».
Особенно это удивляет людей
после перехода с учебных задач на реальные данные.
Они чувствительны к масштабу признаков.
feature < threshold
Структура дерева от этого почти не меняется.
После StandardScaler часть фич
может стать менее информативной.
«А моей модели это вообще нужно?»
И модель уже косвенно «видела» test.
Читать полностью…
Scaling — это не улучшение данных само по себе.
Это инструмент под конкретный алгоритм.
Что делать, если модели работают хуже, чем ожидалось
Почти у всех в ML есть этот момент.
Ты:
👉 почистил данные
👉 обучил модель
👉 потратил кучу времени
👉 посмотрел метрики…
И качество оказалось намного хуже,
чем ты ожидал.
«Нужна модель посложнее».
Чаще проблема вообще не в модели.
Некоторые задачи в принципе плохо предсказываются.
«Если модель умная —
она всё найдёт сама».
Метрики низкие,
потому что split слишком жёсткий и реалистичный.
Модель может быть «математически хорошей»
и бесполезной одновременно.
И это не провал.
Потому что «мы же делаем AI».
Читать полностью…
А именно там обычно и лежит ответ.
Галлюцинации LLM: где модель помогает, а где уверенно врёт
Большие языковые модели выглядят как всезнающие эксперты. Текст гладкий, уверенный, логичный. Ровно до тех пор, пока не выясняется, что все это были галлюцинации. Давай разберёмся, где галлюцинации — это ожидаемое поведение модели, а где они quietly превращаются в серьёзную проблему.
1. Где галлюцинации — это «нормально»
Модель не знает, она продолжает
LLM — это не база фактов, а сверхмощный автодополнитель. Её цель — сгенерировать правдоподобное продолжение, а не истину.
Недостаток или неоднозначность данных
Если вопрос редкий, свежий или нишевый, модель просто заполняет пробелы. Она не умеет сказать «я не знаю» без отдельного обучения.
Креативные задачи
В сторителлинге и брейншторме галлюцинации — это не баг, а фича. Проблемы начинаются, когда тот же режим включается в фактах и коде.
2. Где начинаются проблемы
Фактические вопросы
Чат-бот уверенно сообщает неверные даты, имена и события. И пользователь принимает это за правду.
Генерация кода
• Функции, которых не существует.
• API, которых никогда не было.
• Код выглядит правильно — пока не запускаешь.
Критические домены
Юриспруденция, медицина, финансы. Здесь «звучит убедительно» = потенциальная катастрофа.
Уверенный тон без знаний
Самое опасное — модель не сомневается. Она не краснеет, не делает пауз, не оговаривается.
3. Что реально снижает галлюцинации
RAG (привязка к данным)
Модель отвечает не «из головы», а по конкретным документам. Есть источник — меньше фантазий.
Дообучение и выравнивание
RLHF, domain fine-tuning, обучение говорить «я не уверен». Модель учат быть осторожной, а не болтливой.
Чёткие инструкции:
— отвечай только по контексту
— если не знаешь — скажи
— обоснуй каждый шаг
Иногда этого уже достаточно.
• Пост-проверки и правила
• Тесты для кода
• Проверка ссылок
• Фильтры на запрещённые паттерны
Попросить модель:
— проверить себя
— оценить уверенность
— пересмотреть ответ
4. Что отличает надёжную систему от «просто LLM»
— Модель не единственный источник истины
— Есть данные, проверки и ограничения
— Ошибка ловится до пользователя
— Уверенность ≠ корректность
Устал инициализировать претрейны весами Qwen? Приходи к нам — мы честно учим с нуля! 😉
Ищем Senior/Senior+ AI Engineer и продактов в RnD-команду: как отдельных специалистов, так и целые команды, — которые готовы разрабатывать прорывные AI-решения.
Познакомиться ближе с нашими направлениями и оставить отклик можно на сайте.
А если хотите следить за тем, как команда RnD ML Сбера исследует и разрабатывает AI-технологии, — подписывайтесь на Telegram-канал команды. Там делятся исследованиями, экспериментами и инсайтами из мира AI, а также свежими вакансиями 🚀