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

  • Что такое машинное обучение?
  • Модели обучения машинного обучения.
  • Оптимизация параметров.
  • Нейронные сети.

Не волнуйтесь, если вы не эксперт - единственные знания, которые вам понадобятся для этого сообщения в блоге, - это базовая математика в средней школе.

Что такое машинное обучение?

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

«Способность компьютера учиться на собственном опыте»

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

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

Но есть проблема. Программирование этих правил вручную означает, что они могут быстро стать довольно сложными и ограничены стратегиями, которые мы, как программисты, можем придумать. Лучшее решение - создать алгоритмы машинного обучения. Машинное обучение может научить играть в Го на примерах и опыте, как и люди. Это то, что DeepMind сделала со своей программой AlphaGo, машинным алгоритмом, основанным на глубоком обучении, который оказался настолько хорош, что победил чемпиона мира по го (человеческого).

Модели обучения машинного обучения

Алгоритмы машинного обучения обучают модели на примерах помеченных данных. Алгоритм машинного обучения обычно определяет модель с настраиваемыми параметрами и алгоритмом оптимизации, как показано ниже. Модель принимает входные данные в виде данных (x) и генерирует выходные данные (y) на основе входных данных и их параметров. Алгоритм оптимизации пытается найти наилучшую комбинацию параметров, чтобы в примере x выходные данные модели y были как можно ближе к ожидаемым выходным данным. Обученная модель будет представлять конкретную функцию f, которая при заданном x производит вывод y. Итак: y = f (x).

Оптимизация

Есть много способов найти наилучшую комбинацию параметров, чтобы выходные данные y модели f были как можно ближе к ожидаемым выходным данным для входных данных x . Один из способов - попробовать все возможные комбинации параметров и выбрать комбинацию, которая дает наилучшие результаты. Это может сработать, если количество комбинаций параметров ограничено, но для типичных моделей машинного обучения с тысячами или даже миллионами параметров это совершенно непрактично. К счастью (и благодаря изобретению математика 17 века Ньютона), есть гораздо лучший способ найти оптимальное решение для некоторых типов моделей.

Это изобретение Ньютона является производной (также известной как градиент). Производная функции представляет, как функция изменяется по отношению к одному из ее параметров, и указывает в направлении увеличения функции. Если у нас есть функция f с параметром p, то изменение df функции f на в отношении изменения dp параметра p отмечается как df (p) / dp.

Итак, как можно использовать эту производную для повышения эффективности оптимизации модели? Предположим, что у нас есть некоторые данные (x, t), так что вход x соответствует целевому t. Эти данные отображаются следующим образом:

Если теперь мы хотим создать модель, которая наилучшим образом приближает целевой t для заданного ввода x для всех данных примеров, то мы можем попытаться провести прямую линию через начало координат (это также известна как линейная регрессия). Эта прямая линия может быть представлена ​​функцией y = f (x) с f (x) = p⋅x, где p - единственный параметр модели (обратите внимание, что p представляет собой наклон линии). Визуально эту модель можно представить как:

Чтобы найти параметр p так, чтобы y = x⋅p был как можно ближе к t для всех приведенных примеров (x, t) мы должны математически определить меру близости. Эта мера также известна как функция стоимости. Типичная функция стоимости для этой проблемы состоит в суммировании квадратов значений всех абсолютных различий между целевым t и выходными данными модели y: | ty | ² для всех примеров (x, t). Окончательная функция стоимости становится ∑ | t - (x⋅p) | ², где сигма представляет сумму. Поскольку этот пример довольно прост, мы можем легко визуализировать эту функцию стоимости для всех параметров p:

Чтобы найти лучший параметр p, нам нужно минимизировать функцию стоимости. Помните, что наша модель имеет параметр p, принимает входные данные x и производит выходные y. Мы можем записать эту модель как y = x⋅p. Поскольку стоимость равна ∑ | ty | ², мы можем заменить y, а также записать функцию стоимости как ∑ | t - (x⋅p) | ² . Если мы хотим минимизировать эту функцию и сделать выходные данные y как можно ближе к целевым t, мы можем попробовать все возможные значения p для каждой входной выборки (x, t) и выберите значение p, при котором сумма стоимости по всем входным выборкам является наименьшей. Испытание всех возможных значений p в этом случае было бы возможно, но вскоре стало бы невозможным, чем больше параметров будет у модели. Здесь в игру вступает производная. Используя производную, мы можем просто выбрать случайное начальное значение параметра для p и начать следовать производной в противоположном направлении, чтобы найти самую низкую точку на функции стоимости. Этот процесс спуска вниз по производной (градиенту) также известен как градиентный спуск. Процесс проиллюстрирован ниже, где мы начинаем с p = 0,3 и следуем градиенту в течение 12 шагов, улучшая соответствие модели данным (линия на правом рисунке). Мы прекращаем подбирать модель, когда стоимость больше не уменьшается, поэтому последний найденный параметр p равен 1,94 с ценой 0,451. Обратите внимание, что последняя строка соответствует данным (x, t) намного лучше, чем начальная строка.

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

По сути, именно это и происходит, если мы обучаем модель нейронной сети. Однако более типичные модели нейронных сетей состоят из гораздо более сложных функций, чем наша модель y = x⋅p. Существует большое количество моделей нейронных сетей, но обычно все они дифференцируемы и могут быть оптимизированы с помощью градиентного спуска, как мы проиллюстрировали в этом сообщении в блоге.

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

Если вы хотите поиграть с небольшими примерами нейронных сетей, попробуйте Google's Tensorflow Playground, или, если вы более технически подкованы и хотите узнать больше, вы можете попробовать реализовать свои собственные модели с помощью моего руководства по Как реализовать нейронные сети.