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

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

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

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

Как видно из формулы, функция стоимости представляет собой кривую параболы. Чтобы минимизировать его, нам нужно найти его вершину. Ее можно решить аналитически или с помощью алгоритмов программирования. В этом блоге я сосредоточусь на одном из самых популярных программных решений, Градиентный спуск, чтобы пройти через процесс оптимизации. Градиентный спуск широко применяется в различных моделях, которые предпринимают шаги в зависимости от скорости обучения α, перемещаясь к вершине параболы, чтобы найти глобальный минимум для линейной регрессии, который также известен как точка с наклоном, равным 0. Итак, чтобы Чтобы получить наклон, возьмем производную функции стоимости при каждом коэффициенте θ.

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

Теперь помните об этих концепциях, давайте воспользуемся реальными данными (данные Boston Housing из UCI Machine Learning Repository). Поскольку в этом блоге я демонстрирую только часть оптимизации, я пропущу все процессы, такие как исследовательский анализ данных, разработка функций и т. Д., И сразу перейду к нормализации данных, готовой для прогнозирования. Давайте посмотрим на первые несколько строк данных.

Для простоты объяснения я выбрал 2 характеристики (RM: среднее количество комнат на жилище, AGE: доля квартир, занимаемых владельцами, построенных до 1940 года), чтобы сделать прогноз, и целевой переменной является MEDV (среднее значение домов, занимаемых владельцами в 1000 долларов). Для эффективности вычислений я перевел все вычисления в матричный формат. Ниже приведены матрицы для гипотез, функции стоимости, производной функции стоимости и запроса Python для вычисления матрицы.

# Instantiate a hypothesis
hypothesis = X@theta - y
# Calculate cost function
def cost(theta, X=X, y=y, m=m):
    cost = np.transpose((X@theta - y))@(X@theta - y)
    cost = (1/(2*m))*cost
    return cost
# Calculate derivative of cost function
def cost_dev(j, theta, X=X, y=y, m=m):
    dev = X[:, j]@(X@theta - y)
    dev = (1/m)*dev
    return dev

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

# Assign a learning rate
a = 0.001
cost_list = []
theta_temp = np.zeros(theta.shape)
theta_list = []
for i in range(100000):
    
    for j in range(len(theta)):
        theta_temp[j] = theta[j] - a*cost_dev(j, theta)
    
    theta = theta_temp        
    
    theta_list.append(list(theta))
    cost_val = cost(theta)
    cost_list.append(cost_val)

Можем ли мы улучшить эту тенденцию и с большей уверенностью сказать, что минимум действительно достигнут? Что произойдет, если мы изменим скорость обучения до 0,0005 с 1 000 000 итераций.

Тенденция выглядит сумасшедшей. На самом деле это не очень хорошая демонстрация функции стоимости, но мы можем быть очень уверены в результате оптимизации, предполагая, что при текущих настройках достигается минимум MSE. Давайте сравним коэффициенты, только что полученные из алгоритма градиентного спуска вручную, с коэффициентами, полученными из Scikit-learn LinearRegression () с тем же набором данных.

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

Продолжение следует……