06 ноя 2016 г. | Дэниел Гэн и Шеннон Ши

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

«Считается, что компьютерная программа учится на собственном опыте E в отношении некоторого класса задач T и показателя производительности P , если ее производительность при выполнении задач в T , измеряемом P , улучшается с опытом E ».

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

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

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

Классификация

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

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

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

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

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

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

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

Регрессия

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

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

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

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

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

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

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

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

Предсказатель

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

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

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

Это уравнение, вероятно, более узнаваемо в такой форме:

y (x) - это наш результат, или в данном случае цена дома, а xx - наша характеристика, или в данном случае размер дома. c0c0 - точка пересечения оси y для расчета базовой цены дома.

Теперь возникает вопрос: как алгоритм машинного обучения выбирает c_2 и c_1, чтобы линия лучше всего предсказывала цены на жилье?

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

Функции затрат

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

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

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

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

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

Итак, для одной точки данных (x_i, y_i), где xixi - квадратный метр дома, а y_i - цена дома, а прогнозирующий фактор y (x) ошибка в квадрате:

В квадрате ошибки хорошо то, что все положительно. Таким образом мы можем минимизировать квадратичную ошибку. Теперь мы берем среднее или среднее значение по всем точкам данных, чтобы получить среднеквадратичную ошибку:

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

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

Когда мы построим график функции стоимости (всего с двумя переменными), это будет выглядеть примерно так:

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

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

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

Итак, что я только что узнал?

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

Другими словами, на самом деле машинное обучение - это просто распознавание образов. Алгоритмы машинного обучения изучают закономерности, рисуя линии через обучающие данные, а затем обобщают наблюдаемые закономерности на новые данные. Но возникает вопрос, действительно ли машинное обучение «учится»? Ну, кто может сказать, что обучение - это не просто распознавание образов?