[Перевод] Руководство хакера по нейронным сетям. Глава 2: Машинное обучение. Бинарная классификация

Содержание: Глава 1: Схемы реальных значений Часть 1: Введение Базовый сценарий: Простой логический элемент в схеме Цель Стратегия №1: Произвольный локальный поиск Часть 2: Стратегия №2: Числовой градиент Часть 3: Стратегия №3: Аналитический градиент Часть 4: Схемы с несколькими логическими элементами Обратное распространение ошибки Часть 5: Шаблоны в «обратном» потоке Пример «Один нейрон» Часть 6: Становимся мастером обратного распространения ошибки Глава 2: Машинное обучение Часть 7: Бинарная классификация В последней главе мы рассматривали схемы с реальными значениями, которые вычисляли сложные выражения своих исходных значений (проход вперед), а также мы смогли рассчитать градиенты этих выражений по оригинальным исходным значениям (обратный проход). В этой главе мы поймем, насколько полезным может быть этот довольно простой механизм в обучении машины.Бинарная классификация

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

--------------- [1.2, 0.7] → +1 [-0.3, 0.5] → -1 [-3, -1] → +1 [0.1, 1.0] → -1 [3.0, 1.1] → -1 [2.1, -3] → +1 Здесь у нас N = 6 точек ввода данных, где у каждой точки есть две характеристики (D = 2). Три точки данных имеют метку +1, а остальные три — метку -1. Это простейший пример, но на практике набор данных +1/-1 может оказаться действительно полезным: например, определение спама/не спама среди электронных писем, в котором векторы каким-то образом оценивают различные характеристики содержимого писем, такие как количество упоминаний определенного волшебного средства.

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

Протокол обучения

Мы наконец-то начнем строить целые нейронные сети и сложные выражения, но давайте начнем с простого, и обучим линейный классификатор, очень похожий на один нейрон, который мы рассматривали в конце Главы 1. Единственное отличие заключается в том, что мы откажемся от сигмоиды, так как она все излишне усложняет (я использовал ее только в качестве примера в Главе 1, так как исторически сигмоидные нейроны популярны, хотя современные нейронные сети крайне редко используют нелинейности сигмоиды). В любом случае, давайте возьмем простую линейную функцию: f (x, y)=ax+by+c

В этом выражении мы рассматриваем x и y в качестве исходных значений (двухмерных векторов), а a, b, c — в качестве параметров функции, которые нам нужно узнать. Например, если a = 1, b = -2, c = -1, тогда функция примет первую точку ввода данных ([1.2, 0.7]) и результат будет 1×1.2 + (-2) * 0.7 + (-1) = -1.2. Вот каким образом будет действовать обучение:

1. Мы выбираем произвольную точку ввода данных и проводим ее через схему.

2. Мы интерпретируем результат схемы, чтобы убедиться, что точка ввода данных имеет класс +1 (т.е. очень высокие значения: схема абсолютно уверена, что точка ввода данных имеет класс +1, а очень низкие значения: схема абсолютно уверена, что точка ввода данных имеет класс -1).

3. Мы измеряем, насколько хорошо прогноз выстраивает представленные метки. Чтобы показать наглядно — например, если положительный пример выдает очень низкие значения, нам нужно будет подтянуть его в положительном направлении по схеме, требуя, чтобы он выдал более высокое значение для этой точки ввода данных. Обратите внимание, что это пример для первой точки ввода данных: она имеет метку +1, но наша функция прогнозирования назначает ей значение -1.2. Поэтому мы подтолкнем ее по схеме в положительном направлении. Нам нужно, чтобы значение было выше.

4. Схема примет толчок и ответит обратным распространением ошибки, чтобы рассчитать толчки на исходные значения a, b, c, x, y.

5. Так как мы рассматриваем x, y в качестве (фиксированных) точек ввода данных, мы будем игнорировать натяжение в отношении x, y. Если вам нравятся мои физические аналогии, то представьте себе эти исходные значения в виде колышков, вбитых в землю.

6. С другой стороны, мы возьмем параметры a, b, c и заставим их реагировать на их толчок (т.е. мы выполним так называемое обновление параметров). Это, конечно, может привести к тому, что схема выдаст немного более высокие значения по этой конкретной точке ввода данных в будущем.

7. Повторяем! Возвращаемся к шагу 1.

Схема обучения, которую я описал выше, в целом относится к Стохастическому градиентному спуску. Интересный момент, который мне хотелось бы повторить еще раз, это то, что a, b, c, x, y состоят из одинаковых элементов, насколько это может обеспечивать схема: они представляют собой исходные значения схемы, и схема будет толкать их все в определенном направлении. Она не знает разницы между параметрами и точками ввода данных. Однако, после завершения обратного прохода, мы игнорируем все толчки на точки ввода данных (x, y) и продолжаем загружать и выгружать их по мере повторения наших примеров в наборе данных. С другой стороны, мы сохраняем параметры (a, b, c) и продолжаем подталкивать их каждый раз, когда мы измеряем точку ввода данных. Со временем натяжение в отношении этих параметров подстроит эти значения таким образом, что функция выдаст высокие значения для положительных примеров и низкие — для отрицательных.

© Habrahabr.ru