Мой отец однажды сказал мне, что «компьютер - это тупая машина - он делает именно то, что ему говорят, и не более того». - он был прав: компьютер просто выполняет набор инструкций, закодированных программистом. Так как же компьютер может быть «умным» или «обучающимся»? Хотя основные математические концепции, лежащие в основе машинного обучения (ML), довольно просты, большинство постов содержат много жаргона и отпугивают неспециалистов. Я решил написать этот пост как введение для людей, которые не имеют математического образования, но хотели бы понять, что на самом деле происходит в машинном обучении.

В поисках волшебной машины

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

Все числа

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

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

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

Тест!

Теперь, когда мы сузили проблему до цифр, давайте сделаем небольшое упражнение - если вы посмотрите на диаграмму ниже и предположите, что вам известны результаты на левой стороне, можете ли вы «предсказать», каков будет результат для 5?

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

Шаг 0: Получите некоторые данные: набор входных данных, для которых мы знаем соответствующие выходные данные. (Примечание: я сделал этот шаг за вас 😊 )

Шаг 1. Предположим, функция имеет "знакомую" форму. (Примечание: в тесте вы, вероятно, предположили, что здесь задействовано некоторое базовое умножение или сложение)

Шаг 2. Просмотрите данные и найдите функцию, которая кажется работающей. (Примечание. В викторине вы нашли функцию «Выход = 2 * Ввод, также известная как f (x) = 2 * x»)

Шаг 3. Протестируйте функцию на остальных данных, чтобы убедиться, что она действительно работает для всех входных данных.

Шаг 4: примените функцию к новому входу (5), чтобы предсказать результат. (Примечание: f (5) = 2 * 5 = 10)

Давайте сделаем паузу и определимся с жаргоном: данные, которые вы получили на шаге 0, называются «обучающими данными». Шаги 2 и 3 называются «модельным обучением». Обучение модели - это в основном та часть, где вы ищете общую функцию, которая, кажется, воспроизводит данные обучения - это та часть, которая может быть автоматизирована - вызывается автоматизированный процесс поиска и поиска нужной функции "алгоритм машинного обучения".

Два типа машинного обучения: классификация и регрессия

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

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

Регрессия - это когда выходные данные могут принимать непрерывный набор значений, например, мы хотим предсказать, сколько потратит клиент, на основе его демографических данных (возраст, заработок и т. д.). На выходе может быть 10 долларов США, 10,1 доллара США, 10,11 доллара США, 10,12 доллара США или 20 долларов США и т. Д.

Может ли компьютер сам найти нужную функцию?

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

Подход 1: Хотите классифицировать? Проведите толстую линию! (он же SVM)

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

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

С графической точки зрения данные обучения можно представить следующим образом:

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

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

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

Подход 2: покажи мне своего соседа, я скажу тебе, кто ты

Вернемся к нашей викторине. Вот довольно простой алгоритм машинного обучения, который мы могли бы использовать для его решения: чтобы найти результат, соответствующий 5, мы смотрим на данные обучения, находим ближайшее число к 5 (в данном случае это 4) и предполагаем, что результат для 5 точно такой же, как вывод для его ближайшего соседа. Это означает f (5) = f (4) = 8. Звучит довольно глупо, правда? Да, но вроде работает (8 примерно равно 10). Чтобы усложнить задачу, мы можем взять среднее из двух ближайших входов к 5, в данном случае это 4 и 7. Это будет означать f (5) = average (8,14) = 11. . Фактически это можно обобщить, чтобы взять "k" ближайших соседей. Этот алгоритм называется k-ближайших соседей (a.k.a k-NN).

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

Подход 3: линейная регрессия

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

В линейной регрессии мы предполагаем, что для любого ввода x вывод имеет форму f (x) = a * x + b , где a и b - числа, которые нам неизвестны (пока). Обратите внимание, что здесь мы предполагаем (прежде чем фактически выполнять какие-либо вычисления или что-то еще), что наша функция должна выглядеть именно так. Затем мы ищем «лучшие» a и b, т. Е. те, которые копируют данные обучения (или, по крайней мере, максимально приближены к ним).

Попутное замечание с некоторым жаргоном: когда мы предположили, что функция должна «выглядеть определенным образом», мы ввели новые переменные, которые мы назвали a и b. В машинном обучении эти переменные a и b называются параметрами. Много времени в ML уходит на поиск лучших параметров. У некоторых моделей миллионы параметров!

Чтобы найти наилучшие a, b, для каждой пары (a, b) мы определяем Ошибка (a, b), которая в основном измеряет, насколько плохо функция реплицирует данные обучения. Математически Ошибка (a, b) - это разница между тем, что функция должна была предсказать (согласно данные обучения) и то, что он фактически предсказывает (согласно формуле).

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

Еще одна викторина - Как найти максимум?

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

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

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

Подход 4. Давайте воспроизведем мозг - нейронные сети.

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

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

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

То, что я только что описал выше, представляет собой однослойную нейронную сеть. Многослойная нейронная сеть представляет собой последовательность однослойных нейронных сетей: выход уровня N является входом уровня N + 1. Результат последнего слоя - это фактический результат, который мы ищем.

Контролируемое и неконтролируемое обучение

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

Заключение

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