Алгоритмы с нуля

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

Шаги к минимуму

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

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

Как мы выступаем?

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

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

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

Вот определение функции потерь из Википедии:

Функция, которая сопоставляет событие или значения одной или нескольких переменных с действительным числом, интуитивно представляющим некоторую «стоимость», связанную с событием. Задача оптимизации направлена ​​на минимизацию функции потерь».

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

В каком направлении будем двигаться?

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

Технически цель градиентного спуска — минимизировать потери J(θ), где θ — параметры модели.

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

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

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

Насколько большим должен быть шаг?

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

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

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

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

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

Шаги для реализации градиентного спуска следующие:

  1. Произвольно инициализируйте веса
  2. Рассчитать потери
  3. Сделайте шаг, обновив градиенты
  4. Повторяйте, пока градиентный спуск не сойдется.
def gradient_descent(X, y, params, alpha, n_iter): 
    """
    Gradient descent to minimize cost function
    __________________ 
    Input(s)
    X: Training data
    y: Labels
    params: Dictionary contatining random coefficients
    alpha: Model learning rate
    __________________
    Output(s)
    params: Dictionary containing optimized coefficients
    """
    W = params["W"] 
    b = params["b"]
    m = X.shape[0] # number of training instances 

    for _ in range(n_iter): 
        # prediction with random weights
        y_pred = np.dot(X, W) + b
        # taking the partial derivative of coefficients
        dW = (2/m) * np.dot(X.T, (y_pred - y)) 
        db = (2/m) * np.sum(y_pred -  y)
        # updates to coefficients
        W -= alpha * dW
        b -= alpha * db 
    
    params["W"] = W
    params["b"] = b
    return params

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

Спасибо, что прочитали.

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

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



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

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение наших еженедельных информационных бюллетеней (Еженедельник глубокого обучения и Информационный бюллетень Comet), присоединиться к нам в Slack и следить за Comet в Twitter и LinkedIn, чтобы получать ресурсы, события и многое другое, что поможет вам быстрее создавать лучшие модели машинного обучения.