Перейти к основному содержимому

Алгоритмы ИИ

Всем

Содержание

Справочник по алгоритмам (~40 разделов). Базовые понятия ML, метрики и практика — в статье Машинное обучение.


Алгоритмы, используемые в ИИ

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

Современный ИИ основан на трёх ключевых подходах:

  • Машинное обучение — алгоритмы, обучающиеся на примерах
  • Глубокое обучение — нейронные сети с множеством слоёв
  • Обучение с подкреплением — обучение через взаимодействие со средой

Алгоритмы ИИ применяются для решения задач классификации, регрессии, кластеризации, генерации данных и многих других.


Обучающие, тестовые и валидационные выборки

Разделение данных в машинном обучении

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

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

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


Историческое развитие подхода к разделению данных

В ранних работах по распознаванию образов 1960-х годов исследователи использовали единственный набор данных как для обучения, так и для оценки. Такой подход приводил к завышенным оценкам качества моделей. В 1974 году Томас М. Ковер и Питер Е. Харт в работе о методе ближайших соседей впервые формализовали необходимость разделения данных на независимые подмножества.

К середине 1990-х годов с развитием нейронных сетей и увеличением сложности моделей появилась потребность в трёхкомпонентном разделении. Джон Моудер и его коллеги в 1995 году предложили схему с отдельной валидационной выборкой для контроля остановки обучения. Современная практика кросс-валидации, особенно k-fold, получила широкое распространение после публикаций Рональда Кёхлера в начале 2000-х годов.


Практические аспекты разделения

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

В библиотеке scikit-learn версии 1.4 реализована функция train_test_split с параметром stratify для сохранения распределения классов:

Код ITЗагрузка примера кода…

В экосистеме .NET библиотека ML.NET версии 3.0 предоставляет компонент TrainTestSplit:

var splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
var trainData = splitDataView.TrainSet;
var testData = splitDataView.TestSet;

Для языка Java библиотека Weka версии 3.8 включает класс RandomSplitClassifier:

RandomSplitClassifier splitter = new RandomSplitClassifier();
splitter.setTrainPercent(70.0);
splitter.setInputFormat(data);
Instances train = Filter.useFilter(data, splitter);
Instances test = Filter.useFilter(data, splitter);

Дерево решений

Принцип работы и структура

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

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


Исторический контекст развития

Первые концепции деревьев решений появились в работе Уильяма Белла в 1954 году в контексте медицинской диагностики. Формальный алгоритм ID3 разработал Джон Росс Куинлан в 1979 году. Этот алгоритм использовал энтропию для выбора оптимальных разбиений. В 1986 году Куинлан представил улучшенную версию C4.5, поддерживающую непрерывные признаки и обработку пропущенных значений.

Алгоритм CART (Classification and Regression Trees) был предложен Лео Брейманом, Джеромом Фридманом, Ричардом Олшеном и Чарльзом Стоуном в 1984 году. CART стал основой для многих современных ансамблевых методов, включая случайный лес и градиентный бустинг.


Пример реализации на Python

Библиотека scikit-learn версии 1.4 предоставляет класс DecisionTreeClassifier:

Код ITЗагрузка примера кода…


Особенности настройки гиперпараметров

Глубина дерева напрямую влияет на сложность модели. Малая глубина приводит к недообучению, избыточная — к переобучению. Параметр min_samples_split определяет минимальное количество образцов, необходимое для разделения узла. Значение min_samples_leaf задаёт минимальное количество образцов в листовом узле.

Обрезка дерева (pruning) применяется после построения полной структуры. Алгоритм последовательно удаляет узлы, вклад которых в улучшение качества модели оказывается незначительным. В реализации библиотеки scikit-learn обрезка выполняется через параметр ccp_alpha, реализующий cost-complexity pruning.


Случайный лес

Ансамблевый подход и механизм работы

Случайный лес объединяет множество деревьев решений в единую модель. Каждое дерево обучается на случайной подвыборке обучающих данных с возвращением (бутстрап). При выборе разбиения в каждом узле алгоритм рассматривает случайное подмножество признаков вместо полного набора. Этот механизм снижает корреляцию между отдельными деревьями и повышает устойчивость ансамбля.

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


Историческое развитие метода

Идея объединения множества слабых моделей восходит к работе Томаса Ховкинса в 1990 году. Лео Брейман формализовал концепцию случайного леса в 2001 году, опубликовав статью "Random Forests" в журнале Machine Learning. Ключевым нововведением Бреймана стало случайное ограничение признаков при построении каждого узла дерева.

Первоначальная реализация Бреймана на языке Fortran получила распространение после создания пакета randomForest для языка R в 2002 году. Версия для Python появилась в составе библиотеки scikit-learn в 2010 году. Современные оптимизации, включая параллельное построение деревьев, реализованы в библиотеке Ranger для R и в расширениях scikit-learn.


Пример реализации на нескольких языках

Реализация на Python с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация на C# с использованием ML.NET версии 3.0:

var pipeline = mlContext.Transforms.Conversion
.MapValueToKey("Label", "Label")
.Append(mlContext.Transforms.Concatenate("Features", featureColumnNames))
.Append(mlContext.MulticlassClassification
.Trainers.RandomForest(
new SymbolicSgdLogisticRegressionBinaryTrainer.Options
{
NumberOfTrees = 100,
MinimumExampleCountPerLeaf = 1
}))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

var model = pipeline.Fit(trainData);

Реализация на Java с использованием библиотеки Smile версии 3.0:

Код ITЗагрузка примера кода…


Механизм оценки важности признаков

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


Метод опорных векторов

Геометрическая интерпретация и принцип работы

Метод опорных векторов строит оптимальную разделяющую гиперплоскость между классами в признаковом пространстве. Оптимальность определяется максимальной шириной полосы (margin), свободной от объектов обучающей выборки. Граничные объекты, лежащие на краях этой полосы, называются опорными векторами и полностью определяют положение разделяющей гиперплоскости.

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


Исторический контекст

Владимир Вапник и Алексей Червоненкис разработали теоретические основы метода в 1963 году в рамках теории структурного риска. Первый практический алгоритм SVM опубликован Вапником и Коринной Кортес в 1995 году. Ядерный метод получил развитие в работах Бернарда Бозера, Изабель Гийон и Вапника в 1992 году.

Алгоритм последовательного минимального оптимизации (SMO), разработанный Джоном Платтом в 1998 году, сделал SVM практически применимым для задач среднего масштаба. Библиотека LIBSVM, созданная Чих-Чунг Чангом и Чих-Джень Лином в 2001 году, стала стандартной реализацией метода.


Пример реализации на Python

Реализация с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…


Особенности масштабирования признаков

Метод опорных векторов чувствителен к масштабу признаков. Признаки с большим диапазоном значений доминируют в расчёте расстояний. Обязательное предварительное масштабирование выполняется с помощью StandardScaler или MinMaxScaler. В конвейере обработки данных масштабирование размещается перед этапом обучения SVM.

Параметр C регулирует компромисс между шириной разделяющей полосы и количеством ошибок на обучающих данных. Большое значение C приводит к узкой полосе с малым количеством ошибок. Малое значение C допускает больше ошибок ради увеличения ширины полосы. Параметр gamma для RBF-ядра управляет радиусом влияния отдельных опорных векторов.


Метод ближайших соседей

Принцип работы и метрики расстояния

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

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


Исторический контекст

Эвелин Фикс и Джозеф Ходжес младший описали базовую концепцию метода в техническом отчёте Стэнфордского университета в 1951 году. Томас Ковер и Питер Харт формализовали теоретические свойства метода в 1967 году, доказав сходимость ошибки классификации к байесовскому оптимуму при увеличении объёма выборки.

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


Пример реализации на Python

Реализация с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…


Оптимизация поиска ближайших соседей

Полный перебор всех объектов выборки имеет вычислительную сложность O(n). Для ускорения поиска применяются структуры данных: kd-деревья для размерностей до двадцати, ball-деревья для более высоких размерностей. Признаки с разным масштабом требуют обязательного предварительного масштабирования.

Выбор оптимального значения k выполняется с помощью кросс-валидации. Нечётные значения k предпочтительны для задач бинарной классификации во избежание ситуаций с равным количеством голосов. Значение k обычно выбирается в диапазоне от трёх до тридцати в зависимости от объёма выборки.


Логистическая регрессия

Математическая основа без формул

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

Алгоритм оптимизирует параметры модели методом максимального правдоподобия. Процесс обучения минимизирует кросс-энтропийную функцию потерь. Регуляризация предотвращает переобучение путём ограничения величины коэффициентов. Типы регуляризации включают L1 (Lasso), L2 (Ridge) и их комбинацию (Elastic Net).


Исторический контекст

Пьер Франсуа Верюль ввёл логистическую функцию в 1844 году для описания демографических процессов. Джозеф Беркун применил логистическую регрессию в биостатистике в 1944 году. Дэвид Кокс формализовал обобщённую линейную модель с логит-связью в 1958 году, получившую название модели Кокса.

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


Пример реализации на нескольких языках

Реализация на Python с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация на C# с использованием ML.NET версии 3.0:

var pipeline = mlContext.Transforms.Conversion
.MapValueToKey("Label", "Label")
.Append(mlContext.Transforms.Concatenate("Features", featureColumnNames))
.Append(mlContext.BinaryClassification
.Trainers.LbfgsLogisticRegression(
new LbfgsLogisticRegressionBinaryTrainer.Options
{
L2Regularization = 1.0f,
NumberOfIterations = 100
}));

var model = pipeline.Fit(trainData);

Реализация на Java с использованием библиотеки Weka версии 3.8:

Код ITЗагрузка примера кода…


Интерпретация коэффициентов модели

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

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


Градиентный бустинг

Принцип последовательного улучшения моделей

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

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


Эволюция реализаций бустинга

Алгоритм градиентного бустинга описан Джеромом Фридманом в 1999 году в работе "Greedy Function Approximation: A Gradient Boosting Machine". Первая популярная реализация — библиотека GBM для языка R — появилась в 2005 году. Ограничения скорости и потребления памяти стимулировали развитие оптимизированных версий.

Библиотека XGBoost, разработанная Тяньци Ченом и Карлосом Гуэстрином, представлена в 2014 году. Ключевые улучшения включают регуляризацию деревьев, обработку пропущенных значений без предварительной импутации и параллельное построение узлов дерева. Версия 1.0, выпущенная в 2020 году, добавила поддержку квантизации признаков для ускорения обучения.

Библиотека LightGBM от Microsoft, анонсированная в 2017 году, применяет градиентное одностороннее выборочное сканирование для ускорения поиска оптимальных разбиений. Поддержка монотонных ограничений позволяет гарантировать логику влияния признаков на прогноз. Версия 4.0 (2023 год) включает оптимизации для работы с категориальными признаками без предварительного кодирования.

Библиотека CatBoost от Яндекса, выпущенная в 2017 году, решает проблему смещения при работе с категориальными признаками через упорядоченное кодирование. Алгоритм строит симметричные деревья, что ускоряет применение модели в производственной среде. Версия 1.2 (2024 год) добавила поддержку мультиклассовой классификации с оптимизацией под распределённые вычисления.


Пример реализации на Python

Реализация с использованием XGBoost версии 2.0:

Код ITЗагрузка примера кода…

Реализация с использованием LightGBM версии 4.0:

Код ITЗагрузка примера кода…


Особенности работы с категориальными признаками

Категориальные признаки требуют специальной обработки в алгоритмах бустинга. Традиционный подход — однократное кодирование — увеличивает размерность данных и может создать ложные отношения между категориями. Алгоритм CatBoost применяет упорядоченное целочисленное кодирование: для каждого объекта вычисляется статистика целевой переменной по предыдущим объектам в случайной перестановке данных.

Пример подготовки категориальных признаков для CatBoost:

Код ITЗагрузка примера кода…


Нейронные сети

Архитектура многослойных перцептронов

Многослойный перцептрон состоит из входного слоя, одного или нескольких скрытых слоёв и выходного слоя. Каждый нейрон соединён со всеми нейронами предыдущего слоя. Входной сигнал проходит через взвешенную сумму и нелинейную функцию активации. Распространённые функции активации включают ReLU для скрытых слоёв и сигмоиду или softmax для выходного слоя в задачах классификации.

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


История развития нейросетевых архитектур

Фрэнк Розенблатт представил перцептрон в 1958 году как модель распознавания образов. Марвин Минский и Сеймур Пейперт в 1969 году показали ограничения однослойных перцептронов, что привело к первому спаду интереса к нейросетям. Алгоритм обратного распространения ошибки независимо переоткрыт несколькими исследователями в середине 1980-х годов, включая Дэвида Румельхарта и Рональда Уильямса.

Свёрточные нейронные сети разработаны Яном Лекуном в 1989 году для распознавания рукописных цифр. Архитектура LeNet-5, представленная в 1998 году, стала основой для современных свёрточных сетей. Конволюционные слои выделяют локальные признаки изображения, а пулинговые слои обеспечивают инвариантность к небольшим сдвигам объекта.

Рекуррентные нейронные сети появились в работах Джеффри Хинтона и коллег в конце 1980-х годов. Проблема затухающих градиентов в длинных последовательностях решена через архитектуру долгой краткосрочной памяти (LSTM), предложенную Зеппом Хочрайтером и Юргеном Шмидхубером в 1997 году. Ячейки памяти и вентили в LSTM контролируют поток информации во времени.


Пример реализации на Python с TensorFlow

Реализация многослойного перцептрона с использованием TensorFlow 2.15:

Код ITЗагрузка примера кода…

Реализация свёрточной сети для изображений:

Код ITЗагрузка примера кода…


Реализация на C# с ML.NET

ML.NET версии 3.0 поддерживает нейронные сети через компонент TensorFlow.NET:

Код ITЗагрузка примера кода…


Алгоритмы кластеризации

Метод K-средних

Алгоритм K-средних разбивает данные на K кластеров путём итеративного обновления центроидов. Инициализация центроидов выполняется случайным выбором K объектов из данных или методом K-means++. На каждой итерации каждый объект относится к ближайшему центроиду, после чего центроиды пересчитываются как среднее арифметическое всех объектов кластера.

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


Исторический контекст кластеризации

Стюарт Ллойд описал базовый алгоритм K-средних в техническом отчёте Bell Labs в 1957 году, хотя публикация появилась только в 1982 году. Эдвард Форджи независимо предложил аналогичный метод в 1965 году. Метод максимизации ожидания для гауссовых смесей, предложенный Демпстером, Лэрдом и Рубиным в 1977 году, расширил возможности вероятностной кластеризации.

Алгоритм DBSCAN, разработанный Мартином Эстером и коллегами в 1996 году, кластеризует объекты на основе плотности. Объекты в областях высокой плотности формируют кластеры, а объекты в разреженных областях помечаются как шум. Алгоритм не требует указания числа кластеров и обнаруживает кластеры произвольной формы.


Пример реализации K-средних на Python

Реализация с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация алгоритма DBSCAN:

Код ITЗагрузка примера кода…


Алгоритмы понижения размерности

Метод главных компонент

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

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


История развития методов понижения размерности

Карл Пирсон предложил геометрическую интерпретацию метода главных компонент в 1901 году. Гарольд Хотеллинг формализовал метод в 1933 году в работе "Analysis of a Complex of Statistical Variables into Principal Components". Алгоритм сингулярного разложения, лежащий в основе современных реализаций, разработан в работах Эккарта и Янга в 1936 году.

Метод t-SNE, предложенный Лоренсом ван дер Маатеном и Джеффри Хинтоном в 2008 году, сохраняет локальные отношения между объектами в пространстве низкой размерности. Алгоритм минимизирует расходимость Кульбака-Лейблера между распределениями вероятностей соседства в исходном и преобразованном пространствах. Параметр перплексии управляет балансом между вниманием к локальной и глобальной структуре данных.


Пример реализации на Python

Реализация PCA с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация t-SNE:

Код ITЗагрузка примера кода…


Наивный байесовский классификатор

Вероятностная основа классификации

Наивный байесовский классификатор применяет теорему Байеса для вычисления апостериорной вероятности принадлежности объекта к классу. Алгоритм предполагает условную независимость признаков при заданном классе. Это упрощение редко выполняется в реальных данных, но на практике классификатор демонстрирует устойчивую работу.

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


Исторический контекст

Томас Байес сформулировал теорему, носящую его имя, в работе, опубликованной посмертно в 1763 году. Пьер-Симон Лаплас независимо переоткрыл и расширил теорему в 1774 году. Применение байесовского подхода к классификации получило распространение в 1960-х годах в задачах распознавания текста.

Первые практические реализации наивного байеса для фильтрации спама появились в конце 1990-х годов. Пол Грэм описал применение алгоритма для фильтрации электронной почты в эссе 2002 года "A Plan for Spam". Простота реализации и эффективность на текстовых данных сделали метод стандартным инструментом обработки естественного языка.


Пример реализации на Python

Реализация с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация для непрерывных признаков:

Код ITЗагрузка примера кода…


Градиентный спуск и его варианты

Базовый алгоритм оптимизации

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

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


Развитие алгоритмов оптимизации

Дэвид Румельхарт и коллеги популяризировали алгоритм обратного распространения ошибки с градиентным спуском в 1986 году. Ян Лекун ввёл импульс (momentum) в 1989 году для ускорения сходимости в узких оврагах функции потерь. Импульс накапливает скорость движения в стабильных направлениях и сглаживает колебания в шумных направлениях.

Оптимизатор AdaGrad, предложенный Джоном Дучи и коллегами в 2011 году, адаптирует скорость обучения для каждого параметра на основе истории градиентов. Параметры с большими градиентами получают меньшую скорость обучения. Алгоритм эффективен для разреженных данных, но может преждевременно снижать скорость обучения до нуля.

Адам (Adaptive Moment Estimation), разработанный Дидериком Кингмой и Джимми Ба в 2014 году, комбинирует идеи импульса и адаптивной скорости обучения. Алгоритм оценивает первый и второй моменты градиента и корректирует их на смещение. Адам стал стандартным оптимизатором для обучения глубоких нейронных сетей благодаря устойчивой сходимости и малой чувствительности к настройке гиперпараметров.


Пример реализации на Python

Реализация мини-пакетного градиентного спуска:

Код ITЗагрузка примера кода…

Реализация оптимизатора Адам:

Код ITЗагрузка примера кода…


Генетические алгоритмы

Эволюционный подход к оптимизации

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

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


Историческое развитие эволюционных вычислений

Джон Холланд заложил теоретические основы генетических алгоритмов в книге "Адаптация в естественных и искусственных системах", опубликованной в 1975 году. Холланд ввёл ключевые концепции схем и теорему о схемах, объясняющую эффективность эволюционного поиска. Дэвид Голдберг популяризировал метод в инженерных приложениях через книгу "Генетические алгоритмы в поиске, оптимизации и машинном обучении" (1989 год).

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


Пример реализации на Python

Реализация базового генетического алгоритма для оптимизации функции:

Код ITЗагрузка примера кода…

Реализация для задачи коммивояжера с использованием библиотеки DEAP:

Код ITЗагрузка примера кода…


Алгоритмы ассоциативных правил

Методика выявления закономерностей в транзакциях

Алгоритмы ассоциативных правил обнаруживают регулярные взаимосвязи между элементами в наборах данных. Каждая транзакция представляет собой множество элементов, приобретённых вместе. Правило записывается в форме "если элементы A, то элементы B" с указанием поддержки и достоверности.

Поддержка правила измеряет долю транзакций, содержащих все элементы правила. Достоверность показывает вероятность наличия элементов B при условии наличия элементов A. Подъём (lift) оценивает силу ассоциации, сравнивая наблюдаемую достоверность с ожидаемой при независимости элементов. Правила с подъёмом больше единицы указывают на положительную корреляцию.


Алгоритм Apriori и его развитие

Ракеш Агравал и Рамакришнан Срикант представили алгоритм Apriori в 1994 году. Ключевое наблюдение алгоритма — свойство антимонотонности поддержки: если множество элементов нечасто, все его надмножества также будут нечастыми. Алгоритм генерирует кандидатов размера k из частых наборов размера k-1 и проверяет их поддержку в данных.

Алгоритм FP-Growth, предложенный Агравалом и коллегами в 2000 году, устраняет необходимость генерации кандидатов. Структура FP-дерева сжимает информацию о транзакциях, сохраняя частоту элементов и связи между ними. Рекурсивный метод извлечения частых наборов работает напрямую с деревом, что повышает производительность на порядок по сравнению с Apriori.


Пример реализации на Python

Реализация алгоритма Apriori с использованием библиотеки mlxtend версии 0.23:

Код ITЗагрузка примера кода…

Реализация алгоритма FP-Growth:

from mlxtend.frequent_patterns import fpgrowth

# Используем тот же датафрейм df из предыдущего примера

# Поиск частых наборов методом FP-Growth
frequent_itemsets_fp = fpgrowth(
df,
min_support=0.3,
use_colnames=True
)

print("Частые наборы, найденные FP-Growth:")
print(frequent_itemsets_fp.sort_values('support', ascending=False))

Методы ансамблирования моделей

Бэггинг и его особенности

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

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


Стекинг и каскадное объединение моделей

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

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

--


Пример реализации стекинга на Python

Реализация стекинга с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация кастомного стекинга с контролем процесса:

Код ITЗагрузка примера кода…


Алгоритмы обнаружения аномалий

Статистические методы выявления выбросов

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

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


Изолирующий лес

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

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


Пример реализации на Python

Реализация изолирующего леса с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация метода локальной факторизации выбросов (LOF):

Код ITЗагрузка примера кода…


Метрики качества моделей машинного обучения

Метрики для задач классификации

Матрица ошибок предоставляет детальную информацию о качестве классификации. Четыре основных компонента матрицы — истинно положительные, истинно отрицательные, ложно положительные и ложно отрицательные объекты. На основе матрицы ошибок вычисляются точность, полнота и F-мера.

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

Площадь под кривой ошибок (ROC-AUC) оценивает качество ранжирования объектов по вероятности принадлежности к классу. Кривая строится по точкам с разными порогами классификации. Значение AUC равно вероятности того, что случайно выбранный положительный объект получит более высокую оценку, чем случайный отрицательный.


Метрики для задач регрессии

Средняя абсолютная ошибка измеряет среднее абсолютное отклонение прогнозов от реальных значений. Метрика устойчива к выбросам и интерпретируема в единицах целевой переменной. Средняя квадратичная ошибка придаёт больший вес крупным ошибкам из-за возведения в квадрат отклонений. Корень из средней квадратичной ошибки возвращает метрику в исходные единицы измерения.

Коэффициент детерминации R² показывает долю дисперсии целевой переменной, объяснённой моделью. Значение 1 соответствует идеальному прогнозу, 0 — модели, предсказывающей среднее значение. Отрицательные значения указывают на худшее качество, чем у константной модели. Скорректированный R² учитывает количество признаков и размер выборки для честной оценки сложных моделей.


Пример вычисления метрик на Python

Реализация расчёта метрик классификации:

Код ITЗагрузка примера кода…

Реализация метрик регрессии:

Код ITЗагрузка примера кода…


Кросс-валидация и подбор гиперпараметров

Стратегии кросс-валидации

Кросс-валидация оценивает качество модели через многократное разделение данных на обучающие и проверочные подмножества. K-блочная кросс-валидация разбивает данные на K равных частей. Модель обучается K раз, каждый раз используя K-1 блоков для обучения и один блок для проверки. Среднее качество по всем блокам даёт устойчивую оценку обобщающей способности.

Стратифицированная кросс-валидация сохраняет пропорции классов в каждом блоке. Этот подход критически важен для несбалансированных задач классификации. Для временных рядов применяется прогрессивная кросс-валидация, где обучающие блоки всегда предшествуют проверочным во времени. Такая схема предотвращает утечку информации из будущего в прошлое.


Поиск оптимальных гиперпараметров

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

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


Пример реализации на Python

Реализация стратифицированной кросс-валидации:

Код ITЗагрузка примера кода…

Реализация случайного поиска гиперпараметров:

Код ITЗагрузка примера кода…


Алгоритмы обучения с подкреплением

Архитектура взаимодействия агента и среды

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

Цель агента — максимизировать совокупное вознаграждение за временной горизонт. Совокупное вознаграждение вычисляется как сумма текущего и будущих вознаграждений с экспоненциальным затуханием через коэффициент дисконтирования. Коэффициент дисконтирования управляет балансом между немедленной выгодой и долгосрочными последствиями действий.


Классические алгоритмы временных различий

Алгоритм Q-обучения обновляет таблицу значений действий для каждой пары состояние-действие. Обновление выполняется на основе разницы между полученным вознаграждением плюс максимальное значение будущего действия и текущей оценкой Q-функции. Коэффициент скорости обучения регулирует влияние нового опыта на существующие оценки.

Глубокое Q-обучение заменяет таблицу Q-значений нейронной сетью. Сеть принимает состояние среды как вход и выдаёт оценки всех возможных действий. Целевая сеть с фиксированными весами стабилизирует обучение, предоставляя стабильные целевые значения для обновления основной сети. Опыт повторного воспроизведения накапливает переходы состояний в буфер и выбирает мини-пакеты случайным образом для обучения, разрушая корреляции между последовательными наблюдениями.


История развития методов

Ричард Саттон и Эндрю Барто заложили теоретические основы временных различий в 1988 году. Алгоритм Q-обучения впервые описан Чарльзом Уоткиным в 1989 году как метод обучения без модели среды. В 1992 году Геральд Тезаурус применил Q-обучение для игры в бэкгаммон, продемонстрировав практическую применимость метода.

Глубокое Q-обучение представлено исследователями DeepMind в 2013 году. Система DQN достигла уровня человека в играх Atari 2600, обучаясь исключительно по пиксельному изображению экрана и сигналу вознаграждения. В 2015 году улучшенная версия алгоритма победила чемпиона мира в игре "Го", используя комбинацию глубоких свёрточных сетей и метода Монте-Карло для древовидного поиска.


Пример реализации на Python

Реализация агента глубокого Q-обучения с использованием TensorFlow 2.15:

Код ITЗагрузка примера кода…

Реализация алгоритма актёра-критика для непрерывных действий:

Код ITЗагрузка примера кода…


Алгоритмы обработки естественного языка

Трансформерные архитектуры

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

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


Эволюция языковых моделей

Архитектура трансформера представлена исследователями Google в работе "Внимание — это всё" в 2017 году. Модель BERT, выпущенная в 2018 году, обучается предсказывать пропущенные слова в тексте и следующее предложение. Двунаправленная архитектура позволяет модели учитывать контекст как слева, так и справа от текущего слова.

Модель GPT применяет автогрессивный подход с односторонним вниманием. Обучение выполняется предсказанием следующего слова в последовательности. Версия GPT-3, выпущенная в 2020 году, содержит 175 миллиардов параметров и демонстрирует способность к выполнению задач без дополнительного обучения при предоставлении примеров в запросе. Архитектура последовательного масштабирования показала, что качество языковых моделей предсказуемо растёт с увеличением количества параметров и объёма обучающих данных.


Пример реализации на Python

Работа с предобученной моделью BERT через библиотеку transformers версии 4.38:

Код ITЗагрузка примера кода…

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

Код ITЗагрузка примера кода…


Алгоритмы рекомендательных систем

Коллаборативная фильтрация

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

Матричная факторизация представляет взаимодействия пользователей и объектов через произведение двух низкоразмерных матриц. Латентные факторы кодируют скрытые характеристики пользователей и объектов. Произведение соответствующих векторов даёт прогнозируемую оценку взаимодействия. Алгоритм минимизирует разницу между прогнозируемыми и реальными оценками с регуляризацией для предотвращения переобучения.


Гибридные подходы

Гибридные системы комбинируют коллаборативную фильтрацию с контентной фильтрацией. Контентная фильтрация анализирует атрибуты объектов — текстовое описание, категорию, технические характеристики. Рекомендации формируются на основе сходства атрибутов с объектами, которые пользователь предпочитал ранее.

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


Пример реализации матричной факторизации

Реализация с использованием библиотеки implicit версии 0.7:

Код ITЗагрузка примера кода…

Реализация нейронной рекомендательной системы:

Код ITЗагрузка примера кода…


Алгоритмы временных рядов

Автогрессионные модели

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

Сезонная компонента учитывает периодические колебания с фиксированным периодом. Полная модель SARIMA объединяет все компоненты — сезонную и несезонную автогрессию, интегрирование, сезонное и несезонное скользящее среднее. Подбор порядков компонент выполняется через анализ автокорреляционной и частичной автокорреляционной функций или автоматический поиск по критерию Акаике.


Прогнозирование с помощью градиентного бустинга

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

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


Пример реализации на Python

Реализация модели SARIMA с использованием statsmodels версии 0.14:

Код ITЗагрузка примера кода…

Реализация прогнозирования с градиентным бустингом:

Код ITЗагрузка примера кода…


Алгоритмы передачи обучения

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

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

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


Практические сценарии применения

Компьютерное зрение использует предобученные свёрточные сети в качестве экстракторов признаков. Слои, обученные на ImageNet, эффективно выделяют иерархические визуальные признаки — от простых форм до сложных объектов. Замена выходного слоя позволяет адаптировать сеть к новым классам изображений при ограниченном объёме размеченных данных.

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


Пример реализации на Python

Тонкая настройка свёрточной сети для классификации изображений:

Код ITЗагрузка примера кода…

Адаптация языковой модели для классификации текста:

Код ITЗагрузка примера кода…


Генеративные состязательные сети

Архитектура генератора и дискриминатора

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

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


Эволюция архитектур и стабилизация обучения

Иан Гудфеллоу и коллеги представили базовую архитектуру GAN в 2014 году. Ранние реализации страдали от проблем режимного коллапса, когда генератор производил ограниченное разнообразие выходов, и нестабильности сходимости. Архитектура DCGAN (Deep Convolutional GAN), предложенная в 2015 году, ввела свёрточные слои с конкретными правилами проектирования: использование свёрток вместо пулинга, пакетной нормализации во всех слоях кроме выходного генератора и входного дискриминатора, применение активации ReLU в генераторе и LeakyReLU в дискриминаторе.

Wasserstein GAN, представленный в 2017 году, заменил функцию потерь на расстояние Вассерштейна. Критически важным усовершенствованием стало применение градиентного штрафа вместо весового клиппирования для обеспечения липшицевости дискриминатора. Эта модификация обеспечила стабильную сходимость и коррелирующую с визуальным качеством метрику обучения.


Пример реализации на Python

Реализация базовой GAN для генерации рукописных цифр с использованием TensorFlow 2.15:

Код ITЗагрузка примера кода…

Реализация генератора условных изображений (cGAN):

Код ITЗагрузка примера кода…


Вариационные автокодировщики

Вероятностная интерпретация кодирования

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

Функция потерь VAE объединяет реконструкционную ошибку и регуляризационный член Кульбака-Лейблера. Реконструкционная ошибка измеряет качество восстановления исходных данных. Дивергенция Кульбака-Лейблера ограничивает отклонение предсказанного распределения от стандартного нормального, обеспечивая непрерывность и полноту латентного пространства. Этот баланс позволяет генерировать новые объекты путём выборки из любых точек латентного пространства.


Архитектурные особенности и применения

Первые вариационные автокодировщики описаны Дарио Кингма и Максом Веллингом в 2013 году. Ключевым техническим приёмом стала репараметризация — вместо прямой выборки из нормального распределения с параметрами μ и σ, генерируется шум из стандартного нормального распределения, который преобразуется как μ + σ·ε. Этот приём обеспечивает дифференцируемость операции выборки относительно параметров μ и σ.

Бета-VAE вводит гиперпараметр β для усиления регуляризации латентного пространства. Увеличение β приводит к более независимым и интерпретируемым латентным факторам, что полезно для задач дизентанглмента признаков. Иерархические VAE строят многоуровневые латентные представления, где каждый уровень кодирует признаки различной абстракции — от низкоуровневых деталей до высокоуровневых семантических концепций.


Пример реализации на Python

Реализация вариационного автокодировщика для изображений MNIST:

Код ITЗагрузка примера кода…


Алгоритмы онлайн-обучения

Инкрементальное обновление моделей

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

Параметрические онлайн-алгоритмы поддерживают веса модели в памяти и обновляют их после каждого объекта. Непараметрические методы сохраняют подмножество обучающих примеров для последующего использования в прогнозировании. Окно скольжения ограничивает объём хранимых данных фиксированным размером, удаляя старейшие примеры при поступлении новых.


Алгоритмы стохастического градиентного спуска

Стохастический градиентный спуск является основой большинства онлайн-алгоритмов. На каждом шаге вычисляется градиент функции потерь по одному объекту и веса корректируются в обратном направлении. Адаптивные варианты алгоритма, такие как AdaGrad и Adam, регулируют скорость обучения для каждого веса на основе истории градиентов.

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


Пример реализации на Python

Реализация онлайн-классификатора с использованием scikit-learn версии 1.4:

Код ITЗагрузка примера кода…

Реализация адаптивного окна для обработки концепт-дрейфа:

Код ITЗагрузка примера кода…


Алгоритмы активного обучения

Стратегии выбора информативных объектов

Активное обучение минимизирует затраты на разметку данных путём выбора наиболее информативных объектов для запроса меток у эксперта. Модель обучается на небольшом начальном наборе размеченных данных и последовательно запрашивает метки для объектов, которые максимально улучшат её качество.

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


Применение в реальных сценариях

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

Цикл активного обучения включает этапы — обучение модели на текущем размеченном наборе, оценка неопределённости для неразмеченных объектов, выбор объектов для запроса, получение меток от эксперта, добавление размеченных объектов в обучающий набор. Процесс повторяется до достижения целевого качества или исчерпания бюджета разметки.


Пример реализации на Python

Реализация активного обучения с несколькими стратегиями выбора:

Код ITЗагрузка примера кода…


Алгоритмы самообучения

Принципы использования неразмеченных данных

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

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


Ко-обучение с множественными представлениями

Ко-обучение применяется когда данные допускают естественное разделение на два независимых представления. Два классификатора обучаются на разных представлениях одних и тех же объектов. Классификаторы поочерёдно размечают наиболее уверенные объекты из неразмеченного пула и передают их партнёру для обучения. Независимость представлений снижает вероятность совместных ошибок классификаторов.

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


Пример реализации на Python

Реализация самообучения с адаптивным порогом:

Код ITЗагрузка примера кода…


Алгоритмы обработки последовательностей

Рекуррентные нейронные сети и их модификации

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

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

Сети с гейтами обновления упрощают архитектуру LSTM, объединяя входной и забывающий вентили в единый механизм обновления. Два гейта — обновления и сброса — контролируют комбинацию предыдущего состояния с новой информацией. Упрощённая структура снижает вычислительную сложность и количество параметров при сохранении способности моделировать долгосрочные зависимости.


История развития архитектур для последовательностей

Джон Элман представил простейшую рекуррентную сеть с контекстными единицами в 1990 году. Сеть Элмана сохраняла выход скрытого слоя для использования на следующем шаге, создавая краткосрочную память. Майкл Манжард и Йорген Шмидхубер в 1997 году предложили архитектуру LSTM как решение проблемы экспоненциального затухания градиентов в глубоких рекуррентных сетях.

Кёнг-Хью Чо и коллеги представили сеть с гейтами обновления в 2014 году как упрощённую альтернативу LSTM. Эксперименты показали сопоставимое качество при меньших вычислительных затратах. Параллельно развивался подход к обработке последовательностей через свёрточные сети с дилатацией, предложенный Шоу-Ченг Ваном в 2016 году. Дилатированные свёртки увеличивают рецептивное поле без увеличения глубины сети, обеспечивая эффективную обработку длинных последовательностей.


Пример реализации на Python

Реализация классификации текста с использованием LSTM в TensorFlow 2.15:

Код ITЗагрузка примера кода…

Реализация обработки временных рядов с использованием GRU:

Код ITЗагрузка примера кода…


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

Методы изменения распределения классов

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

Алгоритм SMOTE создаёт синтетические примеры миноритарного класса через интерполяцию между ближайшими соседями. Для каждого примера миноритарного класса выбираются k ближайших соседей из того же класса. Синтетический пример генерируется на отрезке между исходным примером и случайно выбранным соседом. Коэффициент генерации определяет количество создаваемых синтетических примеров. Расширенная версия Borderline-SMOTE фокусируется на примерах, расположенных на границе раздела классов, что повышает качество синтетических данных.

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


Взвешивание классов и пороговая оптимизация

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

Оптимизация порога классификации корректирует стандартное значение 0.5 для бинарной классификации. Кривая точность-полнота анализирует баланс между этими метриками при различных пороговых значениях. Оптимальный порог выбирается по максимальному значению F-меры или по бизнес-критериям, учитывающим стоимость ложноположительных и ложноотрицательных решений. В задачах медицинской диагностики предпочтение отдаётся максимизации полноты даже ценой снижения точности.


Пример реализации на Python

Реализация обработки несбалансированных данных с использованием imbalanced-learn версии 0.12:

Код ITЗагрузка примера кода…

Реализация на C# с использованием ML.NET версии 3.0 для обработки несбалансированных данных:

Код ITЗагрузка примера кода…


Алгоритмы интерпретируемости моделей

Методы объяснения прогнозов отдельных объектов

Метод LIME аппроксимирует сложную модель локально интерпретируемой моделью в окрестности конкретного объекта. Алгоритм генерирует синтетические примеры путём небольших возмущений признаков исходного объекта. Сложная модель выдаёт прогнозы для синтетических примеров. Линейная модель обучается предсказывать эти прогнозы на основе возмущённых признаков. Коэффициенты линейной модели интерпретируются как важность признаков для конкретного прогноза.

Метод SHAP основан на теории кооперативных игр и концепции значения Шепли. Алгоритм оценивает вклад каждого признака в отклонение прогноза от среднего значения по всему набору данных. Для каждого признака вычисляется средний вклад при добавлении признака в различные комбинации других признаков. Сумма значений Шепли всех признаков равна разнице между прогнозом модели и средним прогнозом по обучающей выборке.


Глобальная интерпретируемость моделей

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

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


Пример реализации на Python

Реализация интерпретации прогнозов с использованием SHAP версии 0.44:

Код ITЗагрузка примера кода…

Реализация метода LIME для интерпретации текстовых классификаторов:

Код ITЗагрузка примера кода…


Алгоритмы многоклассовой классификации

Стратегии декомпозиции задачи

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

Стратегия один-против-одного обучает бинарный классификатор для каждой пары классов. Количество классификаторов растёт квадратично с числом классов по формуле N×(N-1)/2. При прогнозировании каждый классификатор голосует за один из двух классов своей пары. Объект относится к классу, набравшему наибольшее количество голосов. Эта стратегия эффективна для алгоритмов, плохо масштабирующихся на многоклассовые задачи напрямую.

Многоклассовая логистическая регрессия обобщает бинарную версию через функцию softmax. Линейная комбинация признаков вычисляется для каждого класса. Функция softmax преобразует эти значения в вероятности, суммирующиеся в единицу. Обучение выполняется минимизацией кросс-энтропийной функции потерь. Этот подход обеспечивает калиброванные вероятности прогнозов и интерпретируемость коэффициентов.


Иерархическая классификация

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

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


Пример реализации на Python

Реализация многоклассовой классификации с различными стратегиями:

Код ITЗагрузка примера кода…

Реализация иерархической классификации для таксономии товаров:

Код ITЗагрузка примера кода…


Алгоритмы сегментации изображений

Семантическая и экземплярная сегментация

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

Архитектура U-Net применяет энкодер-декодерную структуру с пропускными соединениями между соответствующими слоями энкодера и декодера. Энкодер извлекает иерархические признаки через свёрточные блоки с понижающей дискретизацией. Декодер восстанавливает пространственное разрешение через транспонированные свёртки. Пропускные соединения передают детальные пространственные признаки из энкодера в декодер, сохраняя границы объектов при восстановлении разрешения.


История развития архитектур сегментации

Оливер Роннебергер, Филипп Фишер и Томас Брок представили архитектуру U-Net в 2015 году для биомедицинской сегментации клеток. Ключевым нововведением стали пропускные соединения, решающие проблему потери пространственной информации в глубоких сетях. FCN (Fully Convolutional Сеть), предложенная Джонатаном Лонгом и коллегами в 2014 году, заменила полносвязные слои свёртками, обеспечив обработку изображений произвольного размера.

Mask R-CNN расширил архитектуру Faster R-CNN добавлением параллельной ветви для предсказания масок сегментации. Метод предсказывает ограничивающую рамку, класс объекта и бинарную маску для каждого экземпляра. Пирамида признаков обеспечивает обработку объектов различных масштабов. Версия 2.0 библиотеки Detectron2 от Facebook AI Research реализует оптимизированные версии этих архитектур с поддержкой распределённого обучения.


Пример реализации на Python

Реализация семантической сегментации с использованием библиотеки segmentation_models_pytorch версии 0.3:

Код ITЗагрузка примера кода…


Алгоритмы детекции объектов

Двухступенчатые и одноступенчатые детекторы

Двухступенчатые детекторы разделяют процесс обнаружения на генерацию предложений регионов и их классификацию. Faster R-CNN использует региональную свёрточную сеть для предложения потенциальных областей объектов. Каждое предложение преобразуется в фиксированный размер через пространственное пирамидальное пулирование и классифицируется полносвязным слоем. Архитектура обеспечивает высокую точность при умеренной скорости обработки.

Одноступенчатые детекторы предсказывают ограничивающие рамки и классы напрямую с карты признаков без этапа предложения регионов. YOLO (You Only Look Once) разделяет изображение на сетку ячеек и предсказывает несколько рамок в каждой ячейке. Алгоритм обрабатывает изображение единожды через свёрточную сеть, обеспечивая высокую скорость работы в реальном времени. RetinaNet решает проблему дисбаланса между фоновыми и объектными примерами через фокальную функцию потерь, усиливающую вклад трудных примеров в обучение.


Эволюция архитектур детекции

Росс Гиршик представил архитектуру R-CNN в 2014 году, комбинирующую селективный поиск для генерации регионов с классификацией через свёрточную сеть. Fast R-CNN в 2015 году ускорил обработку через общее вычисление признаков для всего изображения. Faster R-CNN в 2015 году заменил внешний алгоритм селективного поиска на обучаемую региональную сеть, завершив переход к полностью свёрточным детекторам.

Джозеф Редмон представил YOLO в 2016 году как радикально отличающийся подход к детекции. Версия YOLOv3 в 2018 году ввела пирамидальную обработку признаков для обнаружения объектов различных масштабов. Современная версия YOLOv8 от Ultralytics поддерживает задачи детекции, сегментации и классификации в единой архитектуре с оптимизацией для промышленного развёртывания.


Пример реализации на Python

Реализация детекции объектов с использованием библиотеки Ultralytics YOLOv8 версии 8.2:

Код ITЗагрузка примера кода…

Реализация кастомного детектора на базе PyTorch:

Код ITЗагрузка примера кода…


Алгоритмы обработки графов

Представление графовых структур

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

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


Графовые нейронные сети

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

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

Архитектура GAT (Graph Attention Сеть) вводит механизм внимания для взвешивания вклада соседей при агрегации. Каждое ребро получает вес внимания, вычисляемый на основе совместимости представлений соединённых узлов. Многоголовое внимание параллельно вычисляет несколько независимых представлений внимания, повышая выразительную способность модели. Механизм внимания адаптируется к структуре конкретного графа без необходимости ручной настройки.


Пример реализации на Python

Реализация графовой нейронной сети с использованием библиотеки PyTorch Geometric версии 2.4:

Код ITЗагрузка примера кода…


Алгоритмы контрастного обучения

Принципы обучения через различение

Контрастное обучение формирует представления данных через задачу различения положительных и отрицательных пар примеров. Положительные пары содержат разные преобразования одного и того же объекта — например, два разных аугментированных изображения одного предмета. Отрицательные пары содержат примеры разных объектов. Модель обучается сближать представления положительных пар и раздвигать представления отрицательных пар в пространстве признаков.

Функция потерь контрастного обучения измеряет косинусное сходство между представлениями примеров. Для каждого запроса вычисляется сходство с положительным примером и со всеми отрицательными примерами в пакете. Логарифмическая функция потерь максимизирует вероятность выбора положительного примера среди всех кандидатов. Большое количество отрицательных примеров критично для качества обучения — современные методы используют механизм очереди для накопления отрицательных примеров за пределами текущего мини-пакета.


Архитектурные решения и методы аугментации

Симметричная архитектура SimCLR применяет идентичные энкодеры для обработки двух аугментированных версий одного изображения. Голова проекции преобразует выходы энкодера в пространство сравнения меньшей размерности. Аугментации включают случайные обрезки, изменения цвета, повороты и искажения. Комбинация нескольких аугментаций создаёт разнообразные положительные пары, обучая модель инвариантности к преобразованиям.

Архитектура MoCo (Momentum Contrast) поддерживает динамическую очередь отрицательных примеров фиксированного размера. Энкодер ключей обновляется через экспоненциальное скользящее среднее весов энкодера запросов, обеспечивая стабильность представлений ключей. Очередь позволяет использовать десятки тысяч отрицательных примеров без увеличения потребления памяти, что критично для эффективного контрастного обучения.


Пример реализации на Python

Реализация базового контрастного обучения с использованием PyTorch версии 2.1:

Код ITЗагрузка примера кода…


Содержание