Все специализации

ML-инженер и Data Scientist: вопросы на собеседовании

60 вопросов с разбором ответов — те формулировки, которые действительно встречаются на интервью.

В машинном обучении и алгоритмах часто встречаются параметры n и k, влияющие на сложность алгоритма:

n обычно обозначает размер входных данных (например, количество объектов, признаков, элементов).

k часто используется для обозначения числа кластеров, соседей (в k-NN), или других параметров модели.

Сложность алгоритма зависит от того, как именно он обрабатывает эти параметры:

Если алгоритм перебирает все объекты, его сложность часто выражается как O(n).

Если алгоритм требует сравнения каждого объекта с k элементами (например, k ближайших соседей), сложность может быть O(n*k).

В алгоритмах кластеризации (например, k-means) сложность зависит от количества итераций, размера данных n и числа кластеров k, часто O(nki), где i — число итераций.

Таким образом, сложность зависит от того, какие операции выполняются и как они масштабируются с увеличением n и k. Например, увеличение k в k-NN увеличит количество вычислений для каждого объекта, а увеличение n — общее количество объектов для обработки.

CTC loss (Connectionist Temporal Classification) — это функция потерь, широко используемая в задачах распознавания последовательностей, таких как OCR (оптическое распознавание символов), где выравнивание между входными данными и целевой последовательностью неизвестно.

В OCR модель получает последовательность признаков (например, из изображения текста), а целевая последовательность — это текст, который нужно распознать. Проблема в том, что длина входной последовательности и длина текста не совпадают, и неизвестно, какие части входа соответствуют каким символам.

CTC loss решает эту проблему, позволяя модели предсказывать последовательность с возможными пустыми символами (blank), и автоматически вычисляет вероятность всех возможных выравниваний между входом и целевой последовательностью. Это позволяет обучать модель без явной разметки выравнивания.

Пример применения:

Модель выдает вероятности для каждого символа (включая blank) на каждом временном шаге.

CTC loss суммирует вероятности всех путей, которые могут привести к целевой последовательности, и минимизирует отрицательный логарифм этой суммы.

Таким образом, CTC loss позволяет эффективно обучать модели для распознавания текста, где точное выравнивание между входом и выходом неизвестно.

TPR (True Positive Rate) и FPR (False Positive Rate) — это метрики, используемые для оценки качества бинарной классификации.

TPR (чувствительность, recall) — доля правильно предсказанных положительных случаев от всех реальных положительных:

[ TPR = \frac{TP}{TP + FN} ]

FPR — доля ошибочно предсказанных положительных случаев от всех реальных отрицательных:

[ FPR = \frac{FP}{FP + TN} ]

Здесь TP — истинные положительные, FP — ложные положительные, FN — ложные отрицательные, TN — истинные отрицательные.

Precision — это доля правильно предсказанных положительных случаев от всех предсказанных положительных:

[ Precision = \frac{TP}{TP + FP} ]

Связь между ними:

Recall и TPR — это синонимы.

Precision и recall вместе помогают понять баланс между полнотой и точностью классификации.

Пример:

Если модель часто ошибочно классифицирует отрицательные объекты как положительные (высокий FPR), precision падает, так как много FP. Если модель пропускает много положительных (низкий TPR/recall), то полнота страдает.

Чтобы получить эмбеддинги из текста для трансформера, обычно выполняют следующие шаги:

Токенизация: разбивают текст на токены (слова, подслова или символы), например, с помощью Byte-Pair Encoding (BPE) или WordPiece.

Преобразование токенов в индексы: каждому токену сопоставляют числовой индекс из словаря модели.

Встраивание токенов (Embedding): индексы подаются на слой эмбеддингов, который преобразует их в векторы фиксированной размерности.

Пример на Python с использованием библиотеки Hugging Face Transformers:

Эти эмбеддинги можно использовать как вход для дальнейших слоев трансформера или других моделей.

Для использования BERT в задаче вопрос-ответ (QA) формата SQuAD обычно применяют модель, обученную на этом датасете, которая принимает на вход пару: вопрос и контекст (текст, в котором нужно найти ответ).

Основные шаги:

Подготовка входных данных: объединить вопрос и контекст в один входной текст с разделителями, например, [CLS] вопрос [SEP] контекст [SEP].

Прогон через BERT: модель возвращает для каждого токена два набора логитов — начало и конец ответа.

Определение ответа: выбирается отрезок текста с максимальной суммой вероятностей начала и конца.

Пример с использованием библиотеки Hugging Face Transformers на Python:

Таким образом, BERT позволяет эффективно находить ответ на вопрос в заданном контексте, используя механизм предсказания начала и конца ответа в тексте.

Случайный лес уменьшает влияние отдельных деревьев на итоговое предсказание за счёт двух ключевых механизмов:

Бэггинг (Bootstrap Aggregating) — каждое дерево обучается на случайной выборке с возвращением из исходных данных. Это обеспечивает разнообразие деревьев, так как они видят разные подмножества данных.

Случайный выбор признаков при разбиении узлов — при построении каждого узла дерева выбирается случайный набор признаков, из которых выбирается лучший для разбиения. Это дополнительно снижает корреляцию между деревьями.

В итоге, итоговое предсказание формируется усреднением (для регрессии) или голосованием (для классификации) результатов всех деревьев. Благодаря этому ошибки и переобучение отдельных деревьев компенсируются, повышая общую устойчивость и точность модели.

Выбор между precision (точностью) и recall (полнотой) зависит от конкретной задачи и того, какие ошибки более критичны.

Precision важен, когда критично минимизировать ложноположительные срабатывания. Например, при спам-фильтрации лучше не пропускать важные письма в спам — ложноположительные ошибки нежелательны.

Recall важен, когда нужно поймать как можно больше положительных случаев, даже если при этом появляются ложноположительные. Например, при диагностике заболеваний важно не пропустить больных, даже если часть здоровых будет ошибочно классифицирована.

Пример:

В задаче обнаружения мошенничества в банке важен recall, чтобы не пропустить мошеннические операции.

В задаче рекомендации товаров важен precision, чтобы не показывать пользователю нерелевантные предложения.

Таким образом, выбор метрики зависит от баланса между рисками пропуска и ложных срабатываний в конкретной бизнес-задаче.

CLIP (Contrastive Language–Image Pre-training) — это модель, которая связывает изображения и текст в общем пространстве признаков. Альтернативы CLIP, такие как SigLIP и EVA-CLIP, представляют собой улучшения или вариации этой идеи:

SigLIP — это модификация CLIP, которая использует сигмоидальную функцию активации и другие архитектурные изменения для повышения точности и устойчивости модели при связывании изображений и текста.

EVA-CLIP — модель, основанная на архитектуре EVA (Extremely Vision-friendly Architecture), оптимизированная для улучшенного восприятия визуальной информации и более эффективного обучения с меньшими вычислительными ресурсами.

Эти альтернативы стремятся улучшить качество мультимодального представления, повысить эффективность обучения и адаптироваться к более специфичным задачам компьютерного зрения и обработки естественного языка.

Пример использования CLIP и его альтернатив обычно связан с задачами поиска изображений по текстовому описанию или генерацией описаний для изображений.

Self-attention — это механизм, при котором элементы входной последовательности взаимодействуют сами с собой для вычисления весов важности. Каждый элемент «внимательно смотрит» на все остальные элементы той же последовательности, чтобы понять, какие из них важнее для текущего шага. Это ключевой компонент в трансформерах для обработки последовательностей, например, в моделях языка.

Cross-attention — используется, когда есть две разные последовательности: одна выступает как запрос (query), а другая — как ключи и значения (key, value). Cross-attention позволяет модели фокусироваться на релевантных частях второй последовательности при обработке первой. Например, в задачах перевода или генерации текста cross-attention связывает выход декодера с выходом энкодера.

Итого:

Self-attention помогает модели учитывать контекст внутри одной последовательности.

Cross-attention связывает две разные последовательности, позволяя одной учитывать информацию из другой.

Пример: в трансформере для перевода self-attention применяется внутри энкодера и декодера, а cross-attention — между энкодером и декодером.

В классических NLP-моделях, таких как TF-IDF и n-граммы, используются следующие признаки (features):

TF-IDF (Term Frequency-Inverse Document Frequency):

Term Frequency (TF) — частота появления слова в документе.

Inverse Document Frequency (IDF) — обратная частота документа, показывающая, насколько слово уникально для данного документа относительно всего корпуса.

Итоговый признак — произведение TF и IDF для каждого слова, отражающее важность слова в документе.

n-граммы:

Последовательности из n подряд идущих слов (например, биграммы — пары слов, триграммы — тройки).

Используются для захвата контекста и фразеологии.

n-граммы:

Character n-grams:

Последовательности из n подряд идущих символов.

Помогают учитывать морфологию, ошибки и особенности написания.

Character n-grams:

Эти признаки обычно кодируются в виде векторов, где каждый элемент соответствует частоте или весу определённого слова или n-граммы в тексте.

Градиентный бустинг — это метод ансамблевого обучения, который строит модель последовательно, добавляя новые слабые модели (обычно деревья решений), чтобы исправить ошибки предыдущих.

Градиент появляется в том, что каждая новая модель обучается на градиенте функции потерь по предсказаниям текущей ансамблевой модели. Проще говоря, мы минимизируем ошибку, используя градиентный спуск в пространстве функций.

На каждом шаге вычисляется градиент ошибки (направление и величина, в котором нужно улучшить предсказания), и новая модель обучается предсказывать этот градиент, тем самым корректируя итоговое предсказание.

Это позволяет эффективно уменьшать ошибку и улучшать качество модели за счет последовательного обучения на ошибках предыдущих моделей.

OOV-токен (Out-Of-Vocabulary) — это специальный токен, который используется для обозначения слов или символов, отсутствующих в словаре модели. Такие слова не распознаются напрямую, что может ухудшать качество обработки текста.

Subword-токенизация решает проблему OOV, разбивая слова на более мелкие части — подслова или морфемы. Вместо того чтобы рассматривать слово целиком, модель работает с известными подсловами, что позволяет обрабатывать новые или редкие слова, комбинируя знакомые части.

Например, слово "unhappiness" может быть разбито на подслова: "un", "happi", "ness". Даже если "unhappiness" отсутствует в словаре, модель понимает его через знакомые части.

Таким образом, subword-токенизация снижает количество OOV-токенов и улучшает обобщающую способность моделей NLP.

Multi-head attention — ключевой механизм в трансформерах, который позволяет модели одновременно фокусироваться на разных частях входной последовательности.

Q (Query), K (Key), V (Value) — это три матрицы, получаемые из входных данных с помощью обучаемых линейных преобразований. Каждая позиция в последовательности преобразуется в три вектора:

Query — запрос, по которому ищется релевантная информация.

Key — ключ, с которым сравнивается запрос.

Value — значение, которое возвращается в ответ на запрос.

Вычисление весов внимания:

Считается скалярное произведение Query и Key для каждой пары позиций.

Результат масштабируется (обычно делится на корень из размерности ключей) для стабилизации градиентов.

Применяется softmax, чтобы получить вероятностное распределение весов.

Весы умножаются на соответствующие Value, и результаты суммируются — это и есть выход внимания.

Зачем несколько голов (multi-head)?

Несколько голов позволяют модели смотреть на информацию с разных «углов зрения», то есть каждая голова учится выделять разные зависимости и паттерны в данных. Это повышает выразительность и качество модели.

Пример упрощённо:

Где W_Q_i, W_K_i, W_V_i, W_O — обучаемые матрицы, d_k — размерность ключей, h — число голов.

Функция активации Sigmoid имеет вид:

[ \sigma(x) = \frac{1}{1 + e^{-x}} ]

Она преобразует любое входное значение в диапазон (0, 1), что удобно для интерпретации как вероятность.

Проблемы Sigmoid:

Затухающие градиенты: При больших по модулю значениях входа производная функции близка к нулю, что замедляет обучение глубоких сетей.

Нецентрированность: Выход всегда положителен, что может замедлять сходимость градиентного спуска.

Насыщение: При больших положительных или отрицательных значениях функция «насыщается», градиенты становятся очень малыми.

Применение:

Часто используется на выходном слое для задач бинарной классификации, где выход интерпретируется как вероятность принадлежности к классу.

Интерпретация:

Значение функции можно воспринимать как вероятность принадлежности объекта к положительному классу. Например, выход 0.9 означает 90% вероятность.

Пример использования в Python:

В современных глубоких сетях часто предпочитают ReLU и её варианты из-за проблем Sigmoid.

Модели Hugging Face, особенно трансформеры, обучаются на больших корпусах текста и обычно хорошо справляются с пониманием коротких аббревиатур, если они встречались в обучающих данных. Однако качество понимания зависит от контекста и специфики аббревиатуры.

Если аббревиатура распространённая и часто встречается (например, "NASA", "CPU"), модель, скорее всего, будет её корректно обрабатывать и учитывать в эмбеддингах. Для редких или новых аббревиатур модель может не иметь достаточного контекста, и тогда её понимание будет ограничено.

Для улучшения работы с аббревиатурами можно:

Использовать специализированные модели или дообучать их на данных с аббревиатурами.

Применять методы расширения аббревиатур (например, подставлять полные формы).

Таким образом, модели Hugging Face понимают короткие аббревиатуры в той мере, в какой они представлены и контекстуализированы в обучающих данных.

Model documentation, включая model cards и datasheets, — это стандартизированные документы, которые описывают характеристики, возможности, ограничения и условия использования моделей машинного обучения.

Model card обычно содержит информацию о целях модели, используемых данных, метриках качества, потенциальных рисках, вопросах справедливости и этических аспектах. Это помогает пользователям и разработчикам понять, как и где модель может применяться, а также выявить возможные источники предвзятости.

Datasheet для модели — более технический документ, который подробно описывает архитектуру модели, процесс обучения, наборы данных, используемые для тренировки и тестирования, а также результаты экспериментов.

Такая документация повышает прозрачность, способствует доверию к модели и помогает в оценке её пригодности для конкретных задач, особенно в критичных областях, где важна справедливость и безопасность.

Dropout — это метод регуляризации в глубоких нейронных сетях, который помогает предотвратить переобучение. Во время обучения случайным образом "выключается" (обнуляется) часть нейронов с заданной вероятностью (например, 0.5), что заставляет сеть не полагаться слишком сильно на отдельные нейроны и улучшает обобщающую способность.

На этапе обучения (train) dropout активно работает: нейроны случайно отключаются, и веса обновляются с учётом этого.

На этапе инференса (inference) dropout отключается, все нейроны активны, а выходы масштабируются (обычно умножаются на вероятность сохранения нейрона), чтобы компенсировать эффект отключения во время обучения.

Пример на PyTorch:

Чтобы понять, что модель недообучена или переобучена, анализируют поведение ошибки на обучающей и валидационной выборках:

Недообучение (underfitting): модель плохо работает и на обучающей, и на тестовой выборках — ошибка высокая везде. Это значит, что модель слишком простая и не способна уловить закономерности.

Переобучение (overfitting): модель показывает очень низкую ошибку на обучающей выборке, но высокая ошибка на тестовой. Модель слишком хорошо запомнила обучающие данные, включая шум, и плохо обобщает.

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

Пример:

Для борьбы с переобучением применяют регуляризацию, сбор большего объема данных, упрощение модели или методы ранней остановки.

Thresholds для расчёта ROC-AUC — это пороговые значения вероятности или оценки модели, при которых классификатор решает, к какому классу отнести объект.

Для построения ROC-кривой пороги выбираются из диапазона возможных значений предсказанных вероятностей (обычно от 0 до 1). На каждом пороге вычисляются значения True Positive Rate (TPR) и False Positive Rate (FPR).

Чаще всего thresholds формируются как уникальные значения предсказанных вероятностей на тестовом наборе, отсортированные по убыванию. Это позволяет оценить качество классификации при разных уровнях чувствительности и специфичности.

Примерный алгоритм:

Получить предсказанные вероятности для всех объектов.

Отсортировать уникальные значения вероятностей.

Использовать каждое значение как порог, классифицируя объекты с вероятностью выше порога как положительные.

Рассчитать TPR и FPR для каждого порога.

На основе этих точек строится ROC-кривая, а площадь под ней (AUC) служит метрикой качества модели.

EU AI Act предъявляет строгие требования к системам с высоким риском (high-risk AI systems), чтобы обеспечить безопасность, прозрачность и защиту прав пользователей. Основные требования включают:

Оценка рисков и управление ими: обязательное проведение оценки рисков до выпуска системы и постоянный мониторинг.

Качество данных: данные для обучения должны быть репрезентативными, точными и минимизировать предвзятость.

Документация и прозрачность: подробная техническая документация, включая описание архитектуры, алгоритмов и принципов работы.

Обеспечение объяснимости: пользователи должны иметь возможность понять, как система принимает решения.

Человеческий контроль: возможность вмешательства человека в работу системы для предотвращения ошибок или вреда.

Безопасность и надежность: система должна работать стабильно и защищать от кибератак.

Соответствие стандартам и сертификация: прохождение обязательных процедур оценки соответствия перед выводом на рынок.

Эти меры направлены на повышение доверия и справедливости в использовании AI, особенно в критически важных сферах, таких как здравоохранение, транспорт и правосудие.

Выбор лосс функции (функции потерь) зависит от задачи машинного обучения и типа модели:

Для задач регрессии обычно используют Mean Squared Error (MSE) или Mean Absolute Error (MAE).

Для задач классификации с двумя классами часто применяют Binary Cross-Entropy (логистическая регрессия).

Для многоклассовой классификации — Categorical Cross-Entropy.

Для задач с несбалансированными классами могут использоваться взвешенные версии лосс функций или Focal Loss.

Например, при обучении нейронной сети для классификации изображений с 10 классами обычно применяют Categorical Cross-Entropy:

Важно выбирать лосс функцию, которая соответствует метрике качества и типу выходных данных модели.

Tesseract — это открытая система оптического распознавания символов (OCR), изначально разработанная HP, а затем поддерживаемая Google. Она позволяет извлекать текст из изображений и широко используется благодаря своей доступности и поддержке множества языков.

Границы качества Tesseract:

Хорошо работает с чёткими, контрастными изображениями с простым шрифтом и минимальными искажениями.

Качество распознавания снижается при плохом качестве изображения: шум, размытость, искажения, сложные фоны.

Не всегда хорошо справляется с рукописным текстом или декоративными шрифтами.

Требует предварительной обработки изображений (бинаризация, выравнивание) для улучшения результатов.

Tesseract отлично подходит для задач распознавания печатного текста в документах, сканах и фотографиях, но для сложных случаев может потребоваться дополнительная обработка или использование более специализированных моделей.

Да, свёртку 3x3 можно заменить двумя последовательными свёртками 3x1 и 1x3. Такой приём часто используется для уменьшения количества параметров и вычислительной нагрузки.

Выигрыш:

Меньше параметров: две свёртки 3x1 и 1x3 имеют суммарно меньше весов, чем одна 3x3.

Меньше вычислений: операции с меньшими ядрами проще и быстрее.

Более глубокая архитектура: добавляется дополнительный слой нелинейности между двумя свёртками, что может улучшить выразительность модели.

Потери:

Потенциально меньшее восприятие контекста за один слой, так как 3x3 охватывает сразу 9 пикселей, а 3x1 и 1x3 — по 3 пикселя за свёртку.

Возможна потеря информации, если не правильно настроить слои или активации.

Пример на PyTorch:

CatBoost может принимать на вход любое количество факторов (признаков), ограниченное только ресурсами вашей системы и здравым смыслом для модели. Обычно количество признаков зависит от задачи и данных, но CatBoost хорошо работает с большим числом категориальных и числовых признаков благодаря встроенной обработке категориальных данных. Важно правильно подготовить данные и выбрать релевантные признаки для повышения качества модели.

Bias amplification — это явление, когда модель машинного обучения усиливает существующие предвзятости (bias) в данных. Риски связаны с тем, что модель не просто отражает исходные данные, а увеличивает дисбаланс или несправедливость, что может привести к:

Усилению дискриминации по признакам (пол, раса, возраст и т.д.)

Несправедливым решениям, влияющим на пользователей

Потере доверия к системе и юридическим последствиям

Ухудшению качества модели в долгосрочной перспективе из-за искаженных данных

Например, если в обучающем наборе данных женщин-программистов мало, модель может недооценивать их способности и усиливать этот стереотип при принятии решений.

BatchNorm (Batch Normalization) и LayerNorm (Layer Normalization) — методы нормализации активаций в нейронных сетях, которые помогают ускорить обучение и стабилизировать градиенты.

BatchNorm:

Нормализует входы слоя по батчу: для каждого признака вычисляет среднее и дисперсию по всем примерам в батче.

Формула: ( \hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} ), где (\mu_B) и (\sigma_B^2) — среднее и дисперсия по батчу.

После нормализации применяется масштабирование и сдвиг с обучаемыми параметрами (\gamma) и (\beta).

Преимущества BatchNorm:

Ускоряет сходимость.

Позволяет использовать большие learning rate.

Часто улучшает обобщающую способность.

Недостатки BatchNorm:

Зависит от размера батча, при маленьких батчах работает хуже.

Не подходит для рекуррентных сетей и онлайн-обучения.

LayerNorm:

Нормализует по признакам внутри одного примера, то есть вычисляет среднее и дисперсию по всем нейронам слоя для каждого отдельного примера.

Независима от размера батча.

Преимущества LayerNorm:

Хорошо работает с рекуррентными сетями (RNN, LSTM).

Недостатки LayerNorm:

Может быть менее эффективна в сверточных сетях по сравнению с BatchNorm.

Применение:

BatchNorm широко используется в сверточных нейронных сетях (CNN).

LayerNorm часто применяется в трансформерах и рекуррентных сетях.

Пример использования BatchNorm в PyTorch:

Пример LayerNorm:

ROC-AUC (площадь под кривой ROC) измеряет способность модели различать классы, оценивая соотношение истинно положительных и ложно положительных результатов при разных порогах. При сильном дисбалансе классов ROC-AUC может быть менее информативен, так как он не учитывает абсолютное количество ошибок, а только относительные показатели. В таких случаях модель может показывать высокий ROC-AUC, даже если плохо распознаёт миноритарный класс. Поэтому для дисбалансных данных часто дополнительно используют метрики, чувствительные к классовому дисбалансу, например Precision-Recall AUC или F1-меру.

Большие свёртки (например, 9x9, 7x7, 5x5) практически перестали использовать по нескольким причинам:

Высокая вычислительная стоимость: большие фильтры требуют значительно больше операций, что замедляет обучение и инференс.

Потеря локальной информации: большие ядра охватывают слишком большой участок, что может привести к размытию важных локальных признаков.

Эффективность маленьких свёрток: использование нескольких последовательных свёрток с малыми ядрами (например, 3x3) позволяет моделям захватывать тот же рецептивное поле, но с меньшими затратами и большей нелинейностью.

Например, архитектура VGGNet использует несколько 3x3 свёрток подряд вместо одной большой, что улучшает качество и эффективность.

Стемминг и лемматизация — это методы нормализации слов в обработке естественного языка (NLP), но они отличаются по подходу и точности.

Стемминг — это грубое усечение слов до основы (стема) путём удаления суффиксов и окончаний. Он не учитывает контекст и может обрезать слова не совсем корректно, иногда приводя к несуществующим корням.

Лемматизация — более точный процесс, который приводит слово к его словарной форме (лемме), учитывая морфологический разбор и часть речи. Например, "бегу", "бегал" лемматизируются к "бежать".

Когда применять:

Стемминг подходит для задач, где важна скорость и допустима некоторая погрешность, например, в поисковых системах или при анализе больших объемов текста.

Лемматизация предпочтительна, когда важна точность и семантическая корректность, например, в задачах машинного перевода, анализа тональности или извлечения информации.

Пример стемминга на Python с использованием библиотеки NLTK:

Пример лемматизации:

Существует множество алгоритмов сортировки, вот основные из них с их временной и пространственной сложностью:

Пузырьковая сортировка (Bubble Sort)

Время: O(n²) в худшем и среднем случае

Память: O(1) (сортировка на месте)

Сортировка вставками (Insertion Sort)

Время: O(n²) в худшем случае, O(n) в лучшем (почти отсортированный массив)

Память: O(1)

Память: O(1)

Сортировка выбором (Selection Sort)

Время: O(n²) во всех случаях

Память: O(1)

Память: O(1)

Сортировка слиянием (Merge Sort)

Время: O(n log n) во всех случаях

Память: O(n) (требует дополнительной памяти для слияния)

Быстрая сортировка (Quick Sort)

Время: O(n log n) в среднем, O(n²) в худшем случае (редко)

Память: O(log n) (рекурсивный стек)

Пирамидальная сортировка (Heap Sort)

Память: O(1)

Память: O(1)

Тимсорт (Timsort) — гибридная сортировка, используемая в Python и Java

Время: O(n log n) в среднем и худшем случае

Память: O(n)

Память: O(n)

Выбор алгоритма зависит от размера данных, требований к памяти и стабильности сортировки (сохраняет ли порядок равных элементов). Например, Merge Sort стабилен, Quick Sort — обычно быстрее, но нестабилен.

В случайном лесу можно изменить несколько ключевых параметров:

Количество деревьев (n_estimators): увеличивает количество деревьев в ансамбле. Больше деревьев обычно повышают стабильность и точность модели, но увеличивают время обучения.

Максимальная глубина деревьев (max_depth): ограничивает глубину каждого дерева. Меньшая глубина помогает избежать переобучения, но может привести к недообучению, если слишком мала.

Минимальное количество образцов для разбиения узла (min_samples_split) и для листа (min_samples_leaf): влияют на структуру деревьев и помогают контролировать переобучение.

Максимальное количество признаков для разбиения (max_features): влияет на разнообразие деревьев и обобщающую способность.

Влияние глубины и количества деревьев:

Глубина деревьев контролирует сложность каждого дерева. Глубокие деревья могут запомнить шум в данных (переобучение), а мелкие — могут не уловить сложные зависимости (недообучение).

Количество деревьев влияет на стабильность и точность модели. Чем больше деревьев, тем лучше усреднение ошибок, но с ростом времени обучения и потребления ресурсов.

Пример настройки случайного леса в Python с библиотекой scikit-learn:

MAP (Mean Average Precision) — это метрика качества, часто используемая в задачах информационного поиска и рекомендательных системах. Она измеряет среднюю точность по всем запросам или объектам, учитывая порядок релевантных элементов в выдаче.

Принцип работы:

Для каждого запроса вычисляется Average Precision (AP) — средняя точность на позициях, где встречаются релевантные результаты.

Затем берётся среднее значение AP по всем запросам.

MAP хорошо отражает качество ранжирования, так как учитывает не только наличие релевантных элементов, но и их позицию в списке.

Пример: если у вас есть 3 релевантных документа в топ-5 результатов, MAP будет учитывать, насколько высоко они расположены, а не просто факт их присутствия.

Ищу новую работу, чтобы развиваться профессионально и сталкиваться с новыми вызовами. Хочу применять и расширять свои знания в области машинного обучения и искусственного интеллекта, работать над более масштабными и интересными проектами.

Также важно найти команду, где ценят инновации, обмен опытом и поддерживают рост сотрудников. Новая работа — это возможность внести больший вклад, реализовать свои идеи и продолжить карьерный рост.

DoRA (Domain-oriented Retrieval Augmentation) и LoRA (Low-Rank Adaptation) — это методы адаптации больших языковых моделей, но с разными подходами.

LoRA — метод тонкой настройки модели, который добавляет низкоранговые матрицы к весам модели, позволяя эффективно адаптировать модель без изменения всех параметров.

DoRA — метод, который фокусируется на улучшении модели через интеграцию релевантной информации из внешних источников (retrieval), ориентируясь на конкретную предметную область (domain). Это позволяет модели использовать актуальные данные для генерации ответов.

Таким образом, LoRA — это техника параметрической адаптации модели, а DoRA — подход, который расширяет модель за счёт внешних знаний, ориентированных на конкретную область.

P-value — это вероятность получить наблюдаемые данные (или более экстремальные), если нулевая гипотеза верна. В статистике и машинном обучении p-value помогает оценить значимость результатов теста или модели.

Если p-value мало (обычно меньше 0.05), это говорит о том, что наблюдаемые данные маловероятны при условии, что нулевая гипотеза верна, и её стоит отвергнуть. Если p-value велико, недостаточно оснований отвергать нулевую гипотезу.

Пример: при проверке, влияет ли новый алгоритм на точность модели, нулевая гипотеза — «алгоритм не влияет». Если p-value = 0.01, значит вероятность получить такие данные при отсутствии эффекта — 1%, и можно считать, что алгоритм действительно влияет на точность.

В трансформерах вычислительная сложность внимания пропорциональна квадрату длины входной последовательности (O(n²)).

Если подать два входа по 512 токенов отдельно (2×512), то каждая операция внимания будет иметь сложность примерно 512² = 262144, и суммарно — 2 × 262144 = 524288.

Если объединить их в один вход длиной 1024 токена (1×1024), то сложность будет 1024² = 1 048 576, что вдвое больше.

Поэтому с точки зрения скорости и вычислительных ресурсов эффективнее обрабатывать два входа по 512 токенов отдельно, а не объединять их в один длинный.

Однако стоит учитывать архитектуру модели и цели задачи: объединение может быть полезно для моделирования взаимодействия между двумя последовательностями, но с точки зрения производительности это дороже.

Линейная регрессия — это метод статистического моделирования, который используется для прогнозирования значения зависимой переменной на основе одной или нескольких независимых переменных. Модель предполагает линейную зависимость между входными признаками и целевой переменной.

Формально, модель выглядит так:

[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n + \varepsilon ]

где:

(y) — целевая переменная,

(x_i) — признаки,

(\beta_i) — коэффициенты модели,

(\varepsilon) — ошибка (шум).

Цель обучения — найти коэффициенты (\beta_i), минимизирующие ошибку предсказания, обычно с помощью метода наименьших квадратов.

Линейная регрессия часто используется для прогнозирования, оценки влияния факторов и как базовая модель в машинном обучении. Регуляризация (например, L1 или L2) применяется для борьбы с переобучением и улучшения обобщающей способности модели.

Self-ask prompting — это техника в работе с большими языковыми моделями (LLM), при которой модель сама формулирует дополнительные уточняющие вопросы к исходному запросу, чтобы последовательно получить более точный и полный ответ. Вместо того, чтобы сразу отвечать, модель разбивает задачу на подзадачи, задавая себе вопросы и отвечая на них по очереди. Это помогает улучшить качество и обоснованность ответов, особенно при решении сложных или многошаговых задач.

CUDA (Compute Unified Device Architecture) — это платформа и API от NVIDIA для параллельных вычислений на GPU.

Основные понятия:

Kernel — функция, которая выполняется параллельно на GPU. Запускается множество копий kernel, каждая из которых обрабатывает часть данных.

Thread — отдельный поток выполнения kernel. Каждый thread выполняет одну копию kernel.

Block — группа потоков (threads), которые могут взаимодействовать между собой через общую память и синхронизироваться.

Grid — набор блоков, которые вместе образуют всю рабочую нагрузку для kernel.

Структура запуска kernel выглядит так: вы задаёте количество блоков в grid и количество потоков в каждом блоке. Это позволяет эффективно распараллеливать вычисления на тысячи потоков.

Пример запуска kernel на CUDA (псевдокод):

Таким образом, CUDA позволяет эффективно использовать параллелизм GPU для ускорения вычислений.

При использовании функции активации Sigmoid вместе с Batch Normalization могут возникать следующие проблемы:

Сжатие градиентов: Sigmoid сжимает входные значения в диапазон (0,1), что может привести к затуханию градиентов, особенно если входы находятся в насыщенных областях функции (близко к 0 или 1).

Нарушение распределения: BatchNorm нормализует входы к слою, но после применения Sigmoid распределение становится сильно сжато и несимметрично, что может ухудшить обучение.

Потеря преимуществ BatchNorm: BatchNorm лучше работает с активациями, которые имеют нулевое среднее и симметричный диапазон (например, ReLU или tanh). Sigmoid же смещает выходы в положительный диапазон, что снижает эффективность нормализации.

Из-за этих причин часто рекомендуют использовать ReLU или другие функции активации с BatchNorm, а Sigmoid применять на выходном слое, где это необходимо (например, для бинарной классификации).

Деревья (например, решающие деревья) склонны к переобучению сильнее, чем линейные модели, из-за их высокой гибкости и способности точно подстраиваться под обучающие данные.

Причины:

Высокая выразительная способность: дерево может создавать сложные разбиения пространства признаков, что позволяет идеально подстроиться под шум и выбросы.

Отсутствие регуляризации по умолчанию: без ограничений глубины или минимального числа объектов в листе дерево может вырасти очень глубоким, запоминая детали обучающей выборки.

Локальные решения: дерево строит правила, которые работают хорошо на обучающих данных, но могут плохо обобщаться на новые.

В отличие от линейных моделей, которые ограничены линейной зависимостью и обычно имеют меньше параметров, деревья могут моделировать сложные нелинейные зависимости, что повышает риск переобучения.

Для борьбы с этим применяют методы регуляризации (ограничение глубины, минимальное число объектов в листе), а также ансамбли (Random Forest, Gradient Boosting), которые уменьшают переобучение за счёт усреднения.

Stable Diffusion состоит из нескольких ключевых компонентов:

Условный автоэнкодер (Conditional Autoencoder) — кодирует входное изображение в компактное латентное пространство и декодирует обратно, что позволяет работать с меньшим размером данных.

Диффузионная модель (Diffusion Model) — обучается постепенно добавлять шум к латентному представлению и затем восстанавливать исходное изображение, что позволяет генерировать новые изображения из шума.

Условный механизм (Conditioning) — обычно это текстовый энкодер (например, CLIP), который преобразует текстовое описание в вектор, влияющий на процесс генерации, чтобы создавать изображения, соответствующие описанию.

Процесс диффузии и обратного диффузионного сэмплинга — алгоритм, который итеративно преобразует случайный шум в осмысленное изображение, используя обученную модель.

Примерно так выглядит схема работы:

Для кодирования категориальных признаков в машинном обучении существует несколько популярных методов:

One-hot кодирование

Каждое уникальное значение категориального признака преобразуется в отдельный бинарный признак.

Пример: признак "Цвет" с значениями {Красный, Зеленый, Синий} преобразуется в три признака: is_Красный, is_Зеленый, is_Синий.

Подходит для категорий без порядка.

One-hot кодирование

Label Encoding (метка кодирования)

Каждому уникальному значению присваивается целочисленный код.

Пример: Красный=0, Зеленый=1, Синий=2.

Используется, когда категории имеют порядок, либо для алгоритмов, умеющих работать с такими кодами.

Target Encoding (кодирование по целевой переменной)

Категории заменяются статистикой целевой переменной (например, средним значением).

Помогает учитывать связь категории с целевой переменной.

Требует аккуратности, чтобы избежать утечки данных.

Binary Encoding

Сначала категории кодируются числами, затем эти числа преобразуются в бинарный формат.

Уменьшает размерность по сравнению с one-hot.

Binary Encoding

Frequency Encoding

Категории заменяются на частоту их появления в данных.

Frequency Encoding

Hash Encoding (Feature Hashing)

Используется для очень больших категорий, где создается фиксированное число признаков с помощью хеш-функции.

Выбор метода зависит от задачи, объема данных и используемого алгоритма. Например, деревья решений хорошо работают с label encoding, а линейные модели — с one-hot кодированием.

Gradient Descent (GD) — это метод оптимизации, при котором градиенты считаются по всей обучающей выборке за одну итерацию.

Плюсы: точное направление спуска, стабильное уменьшение функции потерь.

Минусы: медленная итерация при больших данных, высокая вычислительная нагрузка.

Stochastic Gradient Descent (SGD) — градиенты считаются по одному случайному примеру за итерацию.

Плюсы: быстрые итерации, меньше памяти, может выходить из локальных минимумов благодаря шуму.

Минусы: высокая дисперсия градиентов, менее стабильное поведение, требует тщательной настройки скорости обучения.

Mini-Batch SGD — компромисс между GD и SGD, градиенты считаются по небольшим подвыборкам (батчам).

Плюсы: баланс между скоростью и стабильностью, эффективное использование параллелизма, сглаживание шума.

Минусы: выбор размера батча влияет на качество и скорость обучения, требует настройки.

В практике Mini-Batch SGD чаще всего используется, так как сочетает преимущества обоих методов и хорошо масштабируется.

Дисбаланс классов — ситуация в задаче классификации, когда количество объектов одного класса значительно превышает количество объектов другого (или других) классов. Это приводит к тому, что модель может плохо распознавать менее представленные классы, так как она склонна оптимизироваться под большинство.

Способы борьбы с дисбалансом классов:

Пересэмплирование: увеличение числа объектов меньшего класса (oversampling) или уменьшение числа объектов большего класса (undersampling).

Использование специальных метрик: например, F1-score, ROC-AUC вместо простой точности.

Применение алгоритмов, устойчивых к дисбалансу: например, ансамбли, методы с взвешиванием классов.

Генерация синтетических данных: методы вроде SMOTE создают новые объекты для меньшего класса.

Пример применения SMOTE:

Это помогает улучшить качество модели на редких классах.

Ускорение инференса в машинном обучении зависит от используемых методов оптимизации и аппаратного обеспечения. Основные подходы включают:

Квантование моделей — уменьшение точности весов (например, с float32 до int8), что снижает объем вычислений и ускоряет инференс без значительной потери качества.

Применение специализированных библиотек и фреймворков (TensorRT, ONNX Runtime, OpenVINO), которые оптимизируют граф вычислений и используют аппаратные возможности.

Использование аппаратного ускорения: GPU, TPU, FPGA или специализированных нейросетевых процессоров.

Параллелизация и батчинг запросов — обработка нескольких запросов одновременно для повышения пропускной способности.

Оптимизация архитектуры модели — упрощение модели, сокращение числа параметров.

В зависимости от задачи и подхода ускорение может достигать от нескольких раз до десятков раз по сравнению с базовым CPU-инференсом.

Word2vec — это метод представления слов в виде векторов фиксированной размерности, который позволяет моделировать семантические отношения между словами.

Основная идея — обучить нейронную сеть предсказывать контекст слова (или само слово по контексту), в результате чего каждое слово получает векторное представление, отражающее его смысловую близость к другим словам.

Пример использования word2vec:

Word2vec широко используется в NLP для задач классификации, кластеризации и поиска похожих слов.

Cycle-GAN — это архитектура генеративных состязательных сетей, предназначенная для обучения преобразования изображений из одного домена в другой без парных примеров (unsupervised image-to-image translation).

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

Используются следующие виды потерь:

Adversarial Loss (состязательная потеря): заставляет сгенерированные изображения быть похожими на реальные из целевого домена.

Cycle Consistency Loss (потеря циклической согласованности): штрафует за несоответствие между исходным изображением и изображением, восстановленным после двойного преобразования (A→B→A и B→A→B).

Identity Loss (потеря идентичности): опционально, помогает сохранить цветовую палитру и структуру, когда изображение уже принадлежит целевому домену.

Таким образом, Cycle-GAN позволяет обучать модели преобразования между доменами без необходимости иметь пары соответствующих изображений.

Guardrail metrics — это метрики, которые используются для мониторинга и контроля качества моделей машинного обучения или экспериментов, чтобы предотвратить деградацию производительности или нежелательные эффекты.

Их задача — служить «ограждением» (guardrail), то есть сигнализировать, если модель начинает работать хуже ожидаемого или если эксперимент приводит к негативным последствиям.

Примеры guardrail metrics:

Метрики качества модели (точность, F1, AUC), которые не должны падать ниже определённого порога.

Метрики стабильности (например, распределение предсказаний), чтобы выявить дрейф данных.

Метрики бизнес-эффектов (например, конверсия, отток), которые показывают влияние модели на реальные показатели.

В A/B-тестах guardrail metrics помогают убедиться, что новая версия модели не ухудшает критичные аспекты, даже если основная метрика улучшается.

Таким образом, guardrail metrics — это инструмент для безопасного внедрения и эксплуатации моделей, минимизирующий риски.

При выборе learning rate для SFT (Supervised Fine-Tuning) больших языковых моделей (LLM) важно провести несколько проверок, чтобы избежать переобучения или слишком медленного обучения:

Мониторинг потерь (loss): Следите за динамикой функции потерь на тренировочных и валидационных данных. Если loss не уменьшается или колеблется, learning rate может быть слишком высоким.

Проверка стабильности обучения: Слишком большой learning rate может привести к расходимости или скачкам в loss. Если обучение нестабильно, уменьшите learning rate.

Скорость сходимости: Если learning rate слишком мал, обучение будет очень медленным. Нужно найти баланс между скоростью и стабильностью.

Использование learning rate scheduler: Часто применяют адаптивные методы или планировщики, которые уменьшают learning rate по мере обучения.

Тестирование на небольшом подмножестве: Перед полной тренировкой попробуйте разные значения learning rate на небольшой части данных, чтобы быстро оценить поведение.

Сравнение с базовыми значениями: Начинайте с рекомендованных значений для конкретной модели и задачи, например, 1e-5 или 5e-5, и корректируйте по результатам.

Отслеживание метрик качества: Помимо loss, смотрите на метрики качества (например, точность, F1), чтобы убедиться, что модель действительно улучшается.

Пример настройки learning rate в PyTorch:

Таким образом, выбор learning rate — это баланс между скоростью обучения и стабильностью, который достигается через мониторинг и эксперименты.

L1-регуляризация (Lasso) добавляет к функции потерь сумму абсолютных значений весов (||w||₁), что приводит к появлению угловых точек в оптимизационной поверхности. Это способствует тому, что оптимальное решение часто имеет ровно нулевые значения для некоторых весов, то есть зануляет часть из них, обеспечивая разреженность модели.

L2-регуляризация (Ridge) добавляет сумму квадратов весов (||w||₂²), что создает гладкую параболическую поверхность без углов. В результате веса уменьшаются, но редко становятся точно нулём, так как оптимизация стремится к малым, но ненулевым значениям.

Пример:

Здесь L1 может занулить некоторые веса, а L2 — только уменьшить их.

Non-Maximum Suppression (NMS) — это алгоритм, используемый в задачах обнаружения объектов для удаления избыточных перекрывающихся предсказаний. Когда модель обнаруживает несколько боксов, которые сильно пересекаются и относятся к одному объекту, NMS оставляет только тот, у которого наивысшая уверенность (score), а остальные удаляет.

Принцип работы:

Отсортировать все предсказанные боксы по убыванию вероятности.

Выбрать бокс с максимальной вероятностью и добавить его в итоговый набор.

Удалить из списка все боксы, которые сильно перекрываются с выбранным (по метрике IoU — Intersection over Union, превышающей заданный порог).

Повторять шаги 2-3, пока не обработаны все боксы.

Это позволяет уменьшить количество ложных срабатываний и получить более точные результаты обнаружения.

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

Повороты (Rotation): часто используются повороты на 90°, 180°, 270°, так как спутниковые снимки могут иметь разную ориентацию. Важно сохранять геопривязку при поворотах.

Масштабирование (Multi-scale): изменение масштаба изображения для обучения моделей устойчивости к разным разрешениям. Может включать ресемплирование с сохранением пропорций.

Отражения (Flips): горизонтальные и вертикальные отражения, если это не нарушает географическую корректность.

Изменение яркости и контраста: для моделирования различных условий освещения и атмосферных эффектов.

Добавление шума и артефактов: имитация помех, облачности или других искажений.

Кропы и сдвиги (Random Crops, Translations): для обучения модели на частях изображения и повышении устойчивости к смещениям.

Важно учитывать, что некоторые аугментации могут исказить геопространственную информацию, поэтому их применение должно быть осознанным и согласованным с задачей.

Основные метрики бинарной классификации:

Accuracy (Точность)

Доля правильно классифицированных объектов.

Плюс: простая и интуитивная.

Минус: плохо работает при несбалансированных классах.

Accuracy (Точность)

Precision (Точность положительных предсказаний)

Доля истинно положительных среди всех предсказанных положительных.

Плюс: важна, когда ложноположительные ошибки критичны.

Минус: не учитывает пропущенные положительные.

Recall (Полнота)

Доля истинно положительных, найденных моделью, от всех реальных положительных.

Плюс: важна, когда пропуск положительных критичен.

Минус: может быть высокой при большом числе ложноположительных.

Recall (Полнота)

F1-score

Гармоническое среднее Precision и Recall.

Плюс: балансирует между точностью и полнотой.

Минус: не учитывает истинно отрицательные.

F1-score

ROC AUC (Площадь под ROC-кривой)

Оценивает способность модели различать классы при разных порогах.

Плюс: не зависит от порога классификации.

Минус: может быть менее информативна при сильном дисбалансе.

Confusion Matrix (Матрица ошибок)

Показывает TP, FP, TN, FN для детального анализа.

Выбор метрики зависит от задачи и того, какие ошибки критичнее — пропуски или ложные срабатывания.

В Stable Diffusion шаг t — это дискретный временной индекс, который указывает на уровень шума в процессе диффузии. При обучении t обычно семплируется случайно из равномерного распределения по всему диапазону шагов (например, от 1 до T), чтобы модель училась восстанавливать данные из разных уровней зашумления.

На инференсе (генерации) шаги t выбираются детерминированно, обычно в обратном порядке от T к 1, с фиксированным шагом или с помощью специальных схем семплинга (например, DDIM), чтобы постепенно очищать изображение от шума.

Пример:

Обучение: t ~ Uniform(1, T)

Инференс: t = T, T-1, T-2, ..., 1

Таким образом, обучение охватывает весь спектр зашумления, а инференс — последовательное удаление шума по шагам.

Оптимизация тяжелых запросов к базе данных включает несколько подходов:

Использование индексов: создание индексов по колонкам, которые участвуют в условиях WHERE, JOIN и ORDER BY, значительно ускоряет поиск.

Анализ плана выполнения запроса: с помощью EXPLAIN можно понять, какие операции занимают больше всего времени и оптимизировать их.

Денормализация данных: в некоторых случаях стоит хранить избыточные данные для уменьшения количества JOIN.

Разбиение запросов: вместо одного сложного запроса можно выполнить несколько простых и объединить результаты на уровне приложения.

Кэширование результатов: если данные не меняются часто, можно кэшировать результаты запросов.

Оптимизация структуры таблиц: правильный выбор типов данных и нормализация.

Использование партиционирования: разделение больших таблиц на части для ускорения доступа.

Пример создания индекса в PostgreSQL:

Это позволит ускорить поиск пользователей по email.

Bias-variance trade-off — это фундаментальная концепция в машинном обучении, описывающая компромисс между двумя типами ошибок при обучении модели:

Bias (смещение) — ошибка, возникающая из-за слишком простой модели, которая не способна хорошо описать данные (недообучение).

Variance (дисперсия) — ошибка, связанная с тем, что модель слишком чувствительна к шуму в обучающих данных и плохо обобщается на новые данные (переобучение).

Если модель слишком простая, она будет иметь высокий bias и низкую variance. Если слишком сложная — низкий bias, но высокая variance.

Цель — найти баланс, при котором модель достаточно сложна, чтобы уловить закономерности, но не слишком, чтобы не подстраиваться под шум.

Пример: при обучении регрессии с полиномами низкой степени (линейная регрессия) bias будет высоким, а variance низким; при высокой степени полинома — наоборот.

Модель в контексте машинного обучения — это математическая или статистическая структура, которая обучается на данных для выявления закономерностей и принятия решений.

Как модель помогает бизнесу:

Автоматизация процессов: например, модель может автоматически классифицировать заявки клиентов, что ускоряет обработку.

Прогнозирование: модели прогнозируют спрос, что помогает оптимизировать запасы и производство.

Персонализация: рекомендации товаров или услуг на основе предпочтений клиентов увеличивают продажи.

Снижение рисков: модели выявляют мошенничество или аномалии, что помогает предотвратить убытки.

Таким образом, модель превращает данные в ценные инсайты и автоматизирует принятие решений, что повышает эффективность и конкурентоспособность бизнеса.

Из перечисленных алгоритмов:

Линейная регрессия может дать отрицательное предсказание, так как это просто линейная комбинация признаков без ограничений.

KNN (k-ближайших соседей) предсказывает среднее или медиану значений соседей, поэтому если у соседей есть отрицательные значения, может дать отрицательное предсказание. Но если все y > 0, то и предсказания будут > 0.

Градиентный бустинг, дерево решений, случайный лес и нейросеть могут дать отрицательные предсказания, если не применять ограничений (например, активации ReLU, ограничение выхода или трансформации).

Итог: без дополнительных ограничений все перечисленные модели могут предсказывать отрицательные значения, кроме KNN, если все обучающие y > 0, тогда KNN не даст отрицательных предсказаний.

Чтобы избежать отрицательных предсказаний, можно применять:

Трансформацию целевой переменной (например, логарифм).

Ограничения на выход модели.

Специальные модели, учитывающие неотрицательность.

GIL (Global Interpreter Lock) — это механизм в CPython (стандартной реализации Python), который обеспечивает, что в каждый момент времени только один поток выполняет байт-код Python.

Это означает, что даже если у вас несколько потоков, они не могут одновременно выполнять Python-код, что ограничивает параллелизм в многопоточных программах.

GIL упрощает управление памятью и предотвращает проблемы с конкурентным доступом к объектам, но снижает эффективность многопоточных вычислений, особенно на многоядерных процессорах.

Для обхода ограничений GIL часто используют:

Многопроцессность (модуль multiprocessing)

Использование расширений на C, которые освобождают GIL во время тяжелых вычислений

Другие реализации Python без GIL (например, Jython, IronPython)

Пример:

Хотя потоки запускаются, GIL гарантирует, что байт-код выполняется последовательно.

А если вопрос прозвучит не так, как вы готовились?

Так бывает чаще всего. ИзиСобес слышит вопрос интервьюера и подсказывает ответ прямо во время разговора — его не видно ни в Zoom, ни при демонстрации экрана.

Посмотреть ИзиСобес