Это база машинного обучения

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

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

Можно, конечно, попытаться обойтись и без машинного обучения. Самый простой подход — проанализировать данные и составить понятный набор правил формата if-else (если-то). Между прочим, это применяется в реальной жизни, например, при анализе потребительской корзины. Составляется набор ассоциативных правил вида {хлеб, чай} → {молоко}. Это означает, что если покупатель приобретает хлеб и чай, то, скорее всего, он также купит молоко. Вуаля — мы сделали прогноз на будущее. 

У такого подхода есть очевидные проблемы:  

  • Не существует простого способа объективно измерить эффективность правил;

  • Прописывать правила вручную — неблагодарное дело.

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

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

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

y̅ = ax + b

y̅ — это предсказанная цена дома, которую мы будем сравнивать с реальной ценой y.

x — это площадь дома. 

a и b — это коэффициенты, которые надо подобрать. 

Давайте пока сделаем вид, что мы уже подобрали a и b и получили готовое уравнение. Будем с его помощью предсказывать цену для каждого дома и считать разности между y и y̅. Эти разности, возведённые в квадрат, будут выступать в качестве ошибок. Чтобы узнать ошибку по всем домам, суммируем и усредним:

\text{ошибка} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

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

Что мы хотим от ошибок? Чтобы их не было. Поэтому наша цель теперь — уменьшить разность между предсказанным y̅ и реальным y. Или минимизировать функцию потерь. Добиться этого позволит подбор оптимальных коэффициентов a и b.

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

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

Давайте опишем алгоритм:

  • Задаём какие-то значения для параметров a и b (можно случайные);

  • Считаем градиент функции потерь по текущим значениям параметров;

  • Обновляем параметры, сдвигая их немного в направлении антиградиента. Величина шага, с которой корректируются параметры, регулируется скоростью обучения (learning rate);

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

В итоге мы получаем конкретную функцию, например y = 3.67x + 6.54. Подставляя значения площадей вместо иксов, будем вычислять цены. 

Вот как это может выглядеть в коде на Python:

```
import numpy as np

areas = np.array([50, 80, 65, 45, 95])  # площади домов
prices = np.array([300000, 480000, 390000, 270000, 570000])  # цены домов

# Начальные значения коэффициентов
a = 0.1  
b = 100000  

learning_rate = 0.0001  # скорость обучения
iterations = 1000  # количество итераций

# Функция для предсказания
def predict(area, a, b):
    return a * area + b

# Функция потерь
def loss_function(actual_prices, predicted_prices):
    return ((actual_prices - predicted_prices) ** 2).mean()

# Градиентный спуск
for i in range(iterations):
    predictions = predict(areas, a, b)
    loss = loss_function(prices, predictions)
    
    dL_da = -2 * np.mean((prices - predictions) * areas)
    dL_db = -2 * np.mean(prices - predictions)
    
    a -= learning_rate * dL_da
    b -= learning_rate * dL_db    
```

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

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

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

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

Habrahabr.ru прочитано 2808 раз