Forwarded from EasyData
Привет, друзья!
Сегодня - короткая подборка роадмапов и ресурсов по изучению DS-ML. Всё проверенное и пригодное для подготовки к интервью и планирования обучения.
🐾 Матрицы компетенций от AndersenLab
Показывает, какие навыки ожидаются на разных грейдах и уровнях, удобно для формирования чек-листа роста и оценки прогресса.
✨ ссылка (выбирайте Python в специализации и AI/DS/DE/ML в Skill category)
🐾 Machine Learning Roadmap от MachineLearningMastery
Большая пошаговая инструкция: от математики и базовых алгоритмов до продакшена и MLOps, где расписаны все шаги со ссылками на книги, полезные статьи и курсы.
✨ ссылка
🐾 Deep-ML - практические ML/DL задачки
Онлайн-платформа с наборами реальных задач по ML/DL/NLP/CV. Формат близок к продакшену: нужно думать не только о модели, но и о фичах, пайплайнах, метриках. Есть задания для прокачки инженерных навыков.
✨ ссылка
🐾 NeetCode - roadmap + LeetCode-style подготовка
Сайт, посвященный алгоритмам и структурам данных: задачи собраны в тематические дорожки (arrays, trees, graphs и т.д.), есть разборы и объяснения. По духу похож на LeetCode, но структурированнее и понятнее для быстрой подготовки.
✨ ссылка
😎 Рецепт, как собрать из этого рабочий план:
1. Берём матрицу компетенций, отмечаем свои навыки и пробелы, получаем список приоритетов.
2. По роадмапам строим порядок изучения и выбираем подходящие ресурсы.
3. Подключаем практику: задачи на Deep-ML, вопросы для повторения, тренировка алгоритмов и структур.
А ещё на прошедшей неделе в канале стукнуло💯 подписчиков!
Спасибо каждому, кто читает, комментирует, задаёт вопросы и просто остаётся здесь.
Этот канал начинался как небольшой личный проект, а превратился в сообщество, где можно вместе учиться и расти в Data Science.
Дальше - больше💜
#карьера@data_easy
Сегодня - короткая подборка роадмапов и ресурсов по изучению DS-ML. Всё проверенное и пригодное для подготовки к интервью и планирования обучения.
Показывает, какие навыки ожидаются на разных грейдах и уровнях, удобно для формирования чек-листа роста и оценки прогресса.
✨ ссылка (выбирайте Python в специализации и AI/DS/DE/ML в Skill category)
Большая пошаговая инструкция: от математики и базовых алгоритмов до продакшена и MLOps, где расписаны все шаги со ссылками на книги, полезные статьи и курсы.
✨ ссылка
Онлайн-платформа с наборами реальных задач по ML/DL/NLP/CV. Формат близок к продакшену: нужно думать не только о модели, но и о фичах, пайплайнах, метриках. Есть задания для прокачки инженерных навыков.
✨ ссылка
Сайт, посвященный алгоритмам и структурам данных: задачи собраны в тематические дорожки (arrays, trees, graphs и т.д.), есть разборы и объяснения. По духу похож на LeetCode, но структурированнее и понятнее для быстрой подготовки.
✨ ссылка
1. Берём матрицу компетенций, отмечаем свои навыки и пробелы, получаем список приоритетов.
2. По роадмапам строим порядок изучения и выбираем подходящие ресурсы.
3. Подключаем практику: задачи на Deep-ML, вопросы для повторения, тренировка алгоритмов и структур.
А ещё на прошедшей неделе в канале стукнуло
Спасибо каждому, кто читает, комментирует, задаёт вопросы и просто остаётся здесь.
Этот канал начинался как небольшой личный проект, а превратился в сообщество, где можно вместе учиться и расти в Data Science.
Дальше - больше💜
#карьера@data_easy
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Data Science News (Andrey)
Готовимся к собесу, шпаргалка по деревьям
Общее понимание градиентного бустинга
Изначальный алгоритм Фридмана (Friedman, 2001) задаёт базовый принцип.
Идея: мы берём функцию потерь (loss), которую нужно минимизировать ансамблем слабых моделей (обычно деревья решений).
Начинаем с базовой константы (например, среднее значение таргета).
На каждом шаге строим новое дерево по текущим градиентам функции потерь (первая производная по предсказанию).
Значения в листьях подбираются так, чтобы минимизировать loss в этой области (иногда используют и вторую производную для точности).
Каждое дерево добавляется в модель с коэффициентом обучения (learning rate), чтобы не переобучиться.
Фридман показал, что этот подход работает и для регрессии (MSE), и для классификации (логлосс/NLL).
Chen & Guestrin, 2016 — это про XGBoost.
В XGBoost формализовали общее выражение для прироста качества (gain) узла с учётом первых и вторых производных.
Значение листа считается по формуле:
где
Прирост качества (gain) при разбиении узла:
где
Prokhorenkova et al., 2018 — про CatBoost.
Там основное — как бороться с переобучением и эффективно работать с категориальными признаками.
Категориальные фичи: кодирование делается через "средние по таргету", но с порядковым шифтом (ordered target encoding). То есть значение для объекта считается только по предыдущим объектам в случайной перестановке. Это сильно уменьшает target leakage.
Симметричные деревья: все разбиения на одном уровне одинаковые (level-wise). Это ускоряет инференс (можно SIMD/CPU оптимизации).
Очень много готовых функций потерь (MSE, логлосс, ранжирование, custom).
Для ранжирования — используют попарные лоссы (например, YetiRank, Pairwise). Данные группируются по запросам, и дерево строится так, чтобы правильно упорядочивать документы внутри группы.
Вопросы на собесе
1. Можно ли параллелить инференс?
Да. Каждое дерево считается независимо, потом результаты суммируются. Сумма — операция коммутативная, значит, можно распараллелить по деревьям.
2. Можно ли исключить дерево из ансамбля?
Формально да — это просто сумма функций. Но в отличие от бэггинга, деревья в бустинге строятся последовательно: каждое корректирует ошибки предыдущих. Если убрать дерево, качество почти всегда ухудшится.
3. В чём отличие от бэггинга/Random Forest?
В бустинге деревья строятся последовательно и учитывают ошибки прошлых шагов.
В RF деревья строятся независимо, а результат усредняется.
RF больше про снижение дисперсии, boosting — про уменьшение смещения.
4. Почему используют вторые производные (Hessian)?
Потому что это даёт более точную аппроксимацию loss при подборе весов листьев (аналог Ньютона вместо градиентного спуска).
Общее понимание градиентного бустинга
Изначальный алгоритм Фридмана (Friedman, 2001) задаёт базовый принцип.
Идея: мы берём функцию потерь (loss), которую нужно минимизировать ансамблем слабых моделей (обычно деревья решений).
Начинаем с базовой константы (например, среднее значение таргета).
На каждом шаге строим новое дерево по текущим градиентам функции потерь (первая производная по предсказанию).
Значения в листьях подбираются так, чтобы минимизировать loss в этой области (иногда используют и вторую производную для точности).
Каждое дерево добавляется в модель с коэффициентом обучения (learning rate), чтобы не переобучиться.
Фридман показал, что этот подход работает и для регрессии (MSE), и для классификации (логлосс/NLL).
Chen & Guestrin, 2016 — это про XGBoost.
В XGBoost формализовали общее выражение для прироста качества (gain) узла с учётом первых и вторых производных.
Значение листа считается по формуле:
w_j = - (sum(g_i)) / (sum(h_i) + lambda)
где
g_i — первый градиент,h_i — второй градиент (Гессиан),lambda — коэффициент регуляризации.Прирост качества (gain) при разбиении узла:
gain = 0.5 * ( ( (sum(g_left))^2 / (sum(h_left) + lambda) )
+ ( (sum(g_right))^2 / (sum(h_right) + lambda) )
- ( (sum(g_total))^2 / (sum(h_total) + lambda) ) ) - gamma
где
g_left, h_left — суммы градиентов и Гессианов для левого узла,g_right, h_right — суммы для правого узла,g_total, h_total — суммы для всего узла до разбиения,gamma — минимальный прирост, чтобы оставить разбиение (если меньше, то узел схлопывается, читай прунинг).Prokhorenkova et al., 2018 — про CatBoost.
Там основное — как бороться с переобучением и эффективно работать с категориальными признаками.
Категориальные фичи: кодирование делается через "средние по таргету", но с порядковым шифтом (ordered target encoding). То есть значение для объекта считается только по предыдущим объектам в случайной перестановке. Это сильно уменьшает target leakage.
Симметричные деревья: все разбиения на одном уровне одинаковые (level-wise). Это ускоряет инференс (можно SIMD/CPU оптимизации).
Очень много готовых функций потерь (MSE, логлосс, ранжирование, custom).
Для ранжирования — используют попарные лоссы (например, YetiRank, Pairwise). Данные группируются по запросам, и дерево строится так, чтобы правильно упорядочивать документы внутри группы.
Вопросы на собесе
1. Можно ли параллелить инференс?
Да. Каждое дерево считается независимо, потом результаты суммируются. Сумма — операция коммутативная, значит, можно распараллелить по деревьям.
2. Можно ли исключить дерево из ансамбля?
Формально да — это просто сумма функций. Но в отличие от бэггинга, деревья в бустинге строятся последовательно: каждое корректирует ошибки предыдущих. Если убрать дерево, качество почти всегда ухудшится.
3. В чём отличие от бэггинга/Random Forest?
В бустинге деревья строятся последовательно и учитывают ошибки прошлых шагов.
В RF деревья строятся независимо, а результат усредняется.
RF больше про снижение дисперсии, boosting — про уменьшение смещения.
4. Почему используют вторые производные (Hessian)?
Потому что это даёт более точную аппроксимацию loss при подборе весов листьев (аналог Ньютона вместо градиентного спуска).
Forwarded from Data Science News (Andrey)
Готовимся к собесу: вопрос про баланс смещения и дисперсии
В классической терминологии bias–variance tradeoff — это интуитивный способ понять обобщающую способность (generalization) через разложение ошибок модели:
- Смещение (bias) — систематическая ошибка модели, часто ассоциируется с недостаточным обучением (underfitting).
- Дисперсия (variance) — ошибка, связанная с чувствительностью модели к данным; обычно её связывают с переобучением (overfitting).
-
В классической литературе часто приводят оценку обобщающей способности через математическое ожидание для среднеквадратичной ошибки:
Это выражение уходит корнями в классическую статистику и MSE-разложение. Например, в такой интерпретации линейная регрессия будет иметь высокий bias и низкую variance, а бустинг — наоборот.
Однако в современной ML-перспективе такой подход к оценке обобщающей способности используется всё реже. Явление двойного спуска (double descent) напрямую противоречит классическим выводам: с ростом сложности модели «дисперсия» не обязательно ухудшает обобщающую способность, а может снова её улучшать.
Сейчас в вопросе generalization опираются на более современные методологии:
* Оценка обобщающей способности: методы train–test gap, uniform convergence bounds, PAC-Bayes, stability, compression.
* Оценка неопределённостей (вот здесь с картинками):
- алеаторическая (aleatoric) — связана с данными,
- эпистемическая (epistemic) — связана с моделью.
* Калибровка моделей на онлайн-данных (например, модель рекомендаций).
Почему теория сместилась? Потому что для сложных нелинейных моделей невозможно адекватно описать обобщение только через «разложение ошибок по MSE», как это делалось в 80-х. Нужно получать количественные оценки generalization и uncertainty — инструменты, которые реально позволяют улучшать модели.
Таким образом, bias–variance tradeoff — это лишь частный случай общей картины:
- Bias (классика) — систематическая эпистемическая ошибка (wrong inductive bias), которую можно уменьшить улучшением модели.
- Variance (классика) — вариации ошибки эпистемической природы, также контролируемые моделью.
- σ² (классика) — алеаторическая ошибка, лежащая вне контроля модели.
В классической терминологии bias–variance tradeoff — это интуитивный способ понять обобщающую способность (generalization) через разложение ошибок модели:
- Смещение (bias) — систематическая ошибка модели, часто ассоциируется с недостаточным обучением (underfitting).
- Дисперсия (variance) — ошибка, связанная с чувствительностью модели к данным; обычно её связывают с переобучением (overfitting).
-
Sigma - алеаторическая ошибка (шум в данных).В классической литературе часто приводят оценку обобщающей способности через математическое ожидание для среднеквадратичной ошибки:
E[(f_hat(x) - y)^2] = Bias(f_hat(x))**2 + Var(f_hat(x)) + sigma**2
Это выражение уходит корнями в классическую статистику и MSE-разложение. Например, в такой интерпретации линейная регрессия будет иметь высокий bias и низкую variance, а бустинг — наоборот.
Однако в современной ML-перспективе такой подход к оценке обобщающей способности используется всё реже. Явление двойного спуска (double descent) напрямую противоречит классическим выводам: с ростом сложности модели «дисперсия» не обязательно ухудшает обобщающую способность, а может снова её улучшать.
Сейчас в вопросе generalization опираются на более современные методологии:
* Оценка обобщающей способности: методы train–test gap, uniform convergence bounds, PAC-Bayes, stability, compression.
* Оценка неопределённостей (вот здесь с картинками):
- алеаторическая (aleatoric) — связана с данными,
- эпистемическая (epistemic) — связана с моделью.
* Калибровка моделей на онлайн-данных (например, модель рекомендаций).
Почему теория сместилась? Потому что для сложных нелинейных моделей невозможно адекватно описать обобщение только через «разложение ошибок по MSE», как это делалось в 80-х. Нужно получать количественные оценки generalization и uncertainty — инструменты, которые реально позволяют улучшать модели.
Таким образом, bias–variance tradeoff — это лишь частный случай общей картины:
- Bias (классика) — систематическая эпистемическая ошибка (wrong inductive bias), которую можно уменьшить улучшением модели.
- Variance (классика) — вариации ошибки эпистемической природы, также контролируемые моделью.
- σ² (классика) — алеаторическая ошибка, лежащая вне контроля модели.
Forwarded from Data Science News (Andrey)
Что такое свёртка в Graph Convolutional Networks?
Разберём на примере рекомендаций.
В рекомендациях мы оперируем явным откликом (лайк на item, покупка и т. д.) и неявным откликом (клик, просмотр видео). Если пользователь взаимодействовал с item, то в графе появляется ребро. Рёбра могут быть разных типов — в зависимости от действия. В итоге из данных формируется двудольный граф user–item.
Нейросетям на вход нужны матрицы, поэтому граф преобразуют в матрицу смежности (adjacency matrix). Кроме того, сами пользователи и items представлены эмбеддингами, которые, как правило, обучаются. В совокупности матрица смежности и эмбеддинги составляют вход для GNN.
Что есть convolution в слоях GNN?
Первый вопрос, который возникает при виде Graph Convolutional Networks (GCN) или их упрощённых вариантов вроде LightGCN: что именно здесь называется свёрткой?
Во-первых, матрица смежности
где
Далее, операция свёртки на слое
где
В упрощённых моделях, например LightGCN, матрицы весов
Почему это «свёртка»?
Популярные картинки в интернете часто проводят аналогию с классическими свёртками в CV, но она довольно условная.
Здесь «ядро свёртки» — это сама нормированная матрица смежности
На первом слое она отражает прямые взаимодействия из данных (user <-> item).
На втором слое это уже
На слое
Важно: сама матрица смежности
Таким образом, эмбеддинги на слое
Разберём на примере рекомендаций.
В рекомендациях мы оперируем явным откликом (лайк на item, покупка и т. д.) и неявным откликом (клик, просмотр видео). Если пользователь взаимодействовал с item, то в графе появляется ребро. Рёбра могут быть разных типов — в зависимости от действия. В итоге из данных формируется двудольный граф user–item.
Нейросетям на вход нужны матрицы, поэтому граф преобразуют в матрицу смежности (adjacency matrix). Кроме того, сами пользователи и items представлены эмбеддингами, которые, как правило, обучаются. В совокупности матрица смежности и эмбеддинги составляют вход для GNN.
Что есть convolution в слоях GNN?
Первый вопрос, который возникает при виде Graph Convolutional Networks (GCN) или их упрощённых вариантов вроде LightGCN: что именно здесь называется свёрткой?
Во-первых, матрица смежности
A (симметричная в случае неориентированного графа) нормируется:A′ = D^(−1/2) A D^(−1/2)
где
D — диагональная матрица степеней вершин (node degree matrix). Такая нормализация нужна для уменьшения смещения при агрегации соседей.Далее, операция свёртки на слое
L в общем виде выглядит так:H^(L+1) = σ(A′ H^(L) W^(L))
где
σ — функция активации,H^(L) — матрица эмбеддингов на текущем слое,W^(L) — обучаемая матрица весов слоя.В упрощённых моделях, например LightGCN, матрицы весов
W^(L) могут отсутствовать, то есть остаётся только агрегация через A′.Почему это «свёртка»?
Популярные картинки в интернете часто проводят аналогию с классическими свёртками в CV, но она довольно условная.
Здесь «ядро свёртки» — это сама нормированная матрица смежности
A′.На первом слое она отражает прямые взаимодействия из данных (user <-> item).
На втором слое это уже
(A′)^2 - то есть учёт путей длины два (user → item → user и наоборот).На слое
L это (A′)^L, что соответствует взаимодействиям на расстоянии L шагов в графе.Важно: сама матрица смежности
A′не меняется в процессе, но при возведении в степень она отражает более «дальние» связи.Таким образом, эмбеддинги на слое
L агрегируют информацию от соседей через A′ и (опционально) линейно преобразуются весами W^(L).Forwarded from с нуля до 1%
This media is not supported in your browser
VIEW IN TELEGRAM
Если завершать цикл создания цифровых персонажей, то нужно добавить генерацию видео с голосом.
Самая крутая связка на сегодняшний день elevenlabs+lipsync (а лучше даже veo3 и замена голоса через lipsync):
https://elevenlabs.io/app/speech-synthesis/text-to-speech - рекомендую попробовать gen3 + alpha (даёт управление эмоциями, передышками, почти полный контроль над речью)
Для первого варианта лучший выбор этот lipsync:
https://fal.ai/models/fal-ai/infinitalk (загружаем текст/аудио + картинку и смотрим как сгорает баланс - 1 секунда видео = 30 центов)
UPD: ПРЕДПОЧТИТЕЛЬНЫЙ ВАРИАНТ: Для второго:
https://fal.ai/models/creatify/lipsync (1 минута = 1 доллар)
С нуля до 1% 👉 @firsterstrongerbetter
Самая крутая связка на сегодняшний день elevenlabs+lipsync (а лучше даже veo3 и замена голоса через lipsync):
https://elevenlabs.io/app/speech-synthesis/text-to-speech - рекомендую попробовать gen3 + alpha (даёт управление эмоциями, передышками, почти полный контроль над речью)
Для первого варианта лучший выбор этот lipsync:
https://fal.ai/models/fal-ai/infinitalk (загружаем текст/аудио + картинку и смотрим как сгорает баланс - 1 секунда видео = 30 центов)
UPD: ПРЕДПОЧТИТЕЛЬНЫЙ ВАРИАНТ: Для второго:
https://fal.ai/models/creatify/lipsync (1 минута = 1 доллар)
С нуля до 1% 👉 @firsterstrongerbetter
Forwarded from Norgey Bilinskiy
YouTube
Introduction to Quantitative Trading
This video explores quantitative trading in a clear and accessible way.
Ever wondered how firms like Jane Street, XTX Markets, and Renaissance Technologies make money? In this video, you’ll learn how quants use mathematical models to predict market movements…
Ever wondered how firms like Jane Street, XTX Markets, and Renaissance Technologies make money? In this video, you’ll learn how quants use mathematical models to predict market movements…
Forwarded from Quant Valerian
промпт для тренировки конфликтов.md
8.7 KB
Я собрал промпт-тренажёр для отработки методики из книги. Вставляйте, как есть, целиком, в GPT-5 и тренируйтесь! В самом промпте есть подсказки по стадиям и техникам. Работает достаточно неплохо, генерирует много разных кейсов, довольно реалистично токсичит 😁
Я пока что прям подзалипаю на несколько секунд, чтобы придумать хороший ответ, в основном на третьей стадии, но думаю, что дело практики.
Я пока что прям подзалипаю на несколько секунд, чтобы придумать хороший ответ, в основном на третьей стадии, но думаю, что дело практики.
Forwarded from Заметки LLM-энтузиаста
🤖 GenSpark представил Custom Super Agent
Компания GenSpark AI анонсировала новую функцию Custom Super Agent, которая позволяет создавать персонализированных AI-агентов с помощью одного текстового запроса.
Главная фишка:
Агенты задействуют всю мощь инструментов GenSpark AI. По сути, в таких агентов можно "заворачивать" готовые шаблоны для решения сложных задач и даже мульти-агентные цепочки с deep research, генерацией изображений и видео.
Основные возможности:
• Создание ИИ-агентов для различных задач: еженедельные отчеты (например, по AI-индустрии), ежедневный анализ акций, генерация мемов, генерация обучающих курсов по разным тематикам, анализ CV под вакансию и т.д.
• Простое создание через текстовое описание задачи
• Повторное использование созданных агентов
• Возможность упоминания агентов в любом месте платформы через @
Совместное использование:
📤 Теперь такими супер-агентами пользователи GenSpark могут делиться друг с другом!
🔍 Поиск и использование агентов в Custom Super Agent Store
📌 Добавление понравившихся агентов в закладки
💳 Если используете чужого агента (а по сути автоматизированную мульти-агентную цепочку, опирающуюся на все возможности GenSpark), то он расходует кредиты вашей учетной записи
Хакатон (15-21 октября):
Проходит хакатон по созданию кастомных агентов с призовым фондом в виде кэша ($500 или $1000) или кредитов платформы. Детали есть на скриншоте.
Пример из практики:
Я создал и разместил в Custom Super Agent Store ИИ-агента "MoneyPrinter AI Video Generator", который анализирует трендовые новости по AI, выбирает наиболее виральные, генерирует скрипт и видео-ролик в выбранном формате для соцсетей. Пример работы данного агента я прикрепил к заметке. Cебестоимость 30 сек ролика получилась порядка 5000-6000 кредитов (в следующий раз замерю точнее), это около $5.
В итоге получается мощный инструмент для создания и обмена агентными цепочками между пользователями в рамках платформы Genspark. Не хватает только API или MCP-интерфейса, чтобы созданных ИИ-агентов использовать внутри своих приложений.
@llm_notes
#genspark #agents #custom #multiagent #hackathon
Компания GenSpark AI анонсировала новую функцию Custom Super Agent, которая позволяет создавать персонализированных AI-агентов с помощью одного текстового запроса.
Главная фишка:
Агенты задействуют всю мощь инструментов GenSpark AI. По сути, в таких агентов можно "заворачивать" готовые шаблоны для решения сложных задач и даже мульти-агентные цепочки с deep research, генерацией изображений и видео.
Основные возможности:
• Создание ИИ-агентов для различных задач: еженедельные отчеты (например, по AI-индустрии), ежедневный анализ акций, генерация мемов, генерация обучающих курсов по разным тематикам, анализ CV под вакансию и т.д.
• Простое создание через текстовое описание задачи
• Повторное использование созданных агентов
• Возможность упоминания агентов в любом месте платформы через @
Совместное использование:
📤 Теперь такими супер-агентами пользователи GenSpark могут делиться друг с другом!
🔍 Поиск и использование агентов в Custom Super Agent Store
📌 Добавление понравившихся агентов в закладки
💳 Если используете чужого агента (а по сути автоматизированную мульти-агентную цепочку, опирающуюся на все возможности GenSpark), то он расходует кредиты вашей учетной записи
Хакатон (15-21 октября):
Проходит хакатон по созданию кастомных агентов с призовым фондом в виде кэша ($500 или $1000) или кредитов платформы. Детали есть на скриншоте.
Пример из практики:
Я создал и разместил в Custom Super Agent Store ИИ-агента "MoneyPrinter AI Video Generator", который анализирует трендовые новости по AI, выбирает наиболее виральные, генерирует скрипт и видео-ролик в выбранном формате для соцсетей. Пример работы данного агента я прикрепил к заметке. Cебестоимость 30 сек ролика получилась порядка 5000-6000 кредитов (в следующий раз замерю точнее), это около $5.
В итоге получается мощный инструмент для создания и обмена агентными цепочками между пользователями в рамках платформы Genspark. Не хватает только API или MCP-интерфейса, чтобы созданных ИИ-агентов использовать внутри своих приложений.
@llm_notes
#genspark #agents #custom #multiagent #hackathon
Forwarded from что-то на инженерном
SELECT FOR UPDATE - как правильно использовать блокировку
В самом начале своего инженерного пути я работала с транзакциями в биллинге, и часто встречалась с дэдлоками при обновлении данных, но практически ничего не знала об устройстве процесса блокировок и тем более о том, как это можно отладить.
Тогда бы мне очень пригодилась эта статья, в которой супер понятно изложено в каких случаях какую блокировку использовать.
🤩 При работе с транзакциями в PostgreSQL есть проблема «потерянного обновления» - это когда две транзакции понимают, что данные не изменились, читают одни и те же строки и обе пытаются их изменить одновременно. В итоге, одна перезаписывает изменения другой, и данные теряются.
Простой способ избежать этого - заблокировать нужные строки во время чтения, чтобы другие транзакции не могли их поменять или удалить. Для этого чаще всего используют SELECT FOR UPDATE:
Таким образом гарантируется, что пока ваша транзакция не закончилась, никто другой не сможет обновить или удалить эти строки.
🤩 Но чаще всего операция SELECT FOR UPDATE избыточна и очень сильно влияет на производительность.
В PostgreSQL существует несколько режимов блокировок строк, которые влияют на параллелизм транзакций:
⭐️ FOR KEY SHARE - самый мягкий режим, нужен для проверок ссылочной целостности (например, внешних ключей). Блокирует строку от удаления или изменения ключа, но позволяет обновлять обычные поля и разрешает другим транзакции читать данные под своей блокировкой.
⭐️ FOR SHARE - блокирует строку для предотвращения изменений, позволяя читать с разделяемой блокировкой. Позволяет нескольким транзакциям одновременно читать данные, но никто не может их менять.
⭐ FOR NO KEY UPDATE - блокирует строку так, чтобы никто не мог её удалить или изменить ключи, и дает эксклюзивное право обновлять неключевые поля. Почти всегда подходит для обычных обновлений.
⭐ FOR UPDATE - самый жёсткий режим блокировки, блокирует строку полностью: эксклюзивное право на изменение или удаление строк. Использовать стоит только если вы меняете ключи или собираетесь удалять строки. При этом оставляет право читать ту же строку другим параллельным транзакциям, но только с помощью обычного оператора SELECT (без явных блокировок).
🔥 Ключевые конфликты:
🤩 FOR UPDATE конфликтует абсолютно со всеми другими режимами, гарантируя эксклюзивный доступ для полного изменения или удаления строки.
🤩 FOR NO KEY UPDATE конфликтует с другими FOR NO KEY UPDATE и с FOR SHARE, потому что FOR SHARE запрещает любые изменения строки, а FOR NO KEY UPDATE разрешает изменения неключевых полей. При этом, не конфликтует с FOR KEY SHARE - это ключевая особенность для повышения параллелизма.
🤩 FOR SHARE конфликтует с режимами обновления (FOR UPDATE и FOR NO KEY UPDATE), поскольку его цель - гарантировать, что строка не изменится вообще.
🤩 FOR KEY SHARE конфликтует только с FOR UPDATE, потому что FOR UPDATE может включать удаление или изменение ключевых полей, что запрещено режимом FOR KEY SHARE.
Также приложила к посту алгоритм выбора уровня блокировки от автора статьи.
©️что-то на инженерном
В самом начале своего инженерного пути я работала с транзакциями в биллинге, и часто встречалась с дэдлоками при обновлении данных, но практически ничего не знала об устройстве процесса блокировок и тем более о том, как это можно отладить.
Тогда бы мне очень пригодилась эта статья, в которой супер понятно изложено в каких случаях какую блокировку использовать.
Простой способ избежать этого - заблокировать нужные строки во время чтения, чтобы другие транзакции не могли их поменять или удалить. Для этого чаще всего используют SELECT FOR UPDATE:
sql
BEGIN;
SELECT * FROM orders WHERE order_id = 123 FOR UPDATE;
/* здесь логика обработки заказа */
UPDATE orders SET status = 'processed' WHERE order_id = 123;
COMMIT;
Таким образом гарантируется, что пока ваша транзакция не закончилась, никто другой не сможет обновить или удалить эти строки.
В PostgreSQL существует несколько режимов блокировок строк, которые влияют на параллелизм транзакций:
Что происходит, если использовать SELECT FOR UPDATE, когда достаточно FOR NO KEY UPDATE?
Получаются лишние блокировки, которые блокируют не только обновления, но и вставки в дочерние таблицы, если в базе есть внешние ключи. Это приводит к падению производительности, появлению тайм-аутов и дэдлоков.
Также приложила к посту алгоритм выбора уровня блокировки от автора статьи.
©️что-то на инженерном
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DeepSchool
Active learning
Active learning — это непрерывный цикл выбора данных, их разметки и обучения модели. От выбора данных для разметки зависит, сколько ресурсов будет потрачено для достижения целевых метрик в проекте. В новой статье рассматриваем одну из важнейших задач Active learning — отбор объектов 🫵
Из новой статьи вы узнаете:
- о концепции Active learning
- популярные методы отбора объектов: Entropy Sampling, Query-by-Committee, Bayesian Active learning by Disagreement (BALD) и др.
- сильные и слабые стороны рассмотренных методов
Читайте статью по ссылке! 👀
⚡️ Если хотите научиться решать сложные задачи в Computer Vision, то приходите на наш курс CV Rocket. Запишитесь в лист ожидания, чтобы получить скидку до 20%
Active learning — это непрерывный цикл выбора данных, их разметки и обучения модели. От выбора данных для разметки зависит, сколько ресурсов будет потрачено для достижения целевых метрик в проекте. В новой статье рассматриваем одну из важнейших задач Active learning — отбор объектов 🫵
Из новой статьи вы узнаете:
- о концепции Active learning
- популярные методы отбора объектов: Entropy Sampling, Query-by-Committee, Bayesian Active learning by Disagreement (BALD) и др.
- сильные и слабые стороны рассмотренных методов
Читайте статью по ссылке! 👀
Please open Telegram to view this post
VIEW IN TELEGRAM
DeepSchool
Active learning - DeepSchool
Активное обучение: выбор данных и методы семплирования