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

http://karpathy.github.io/neuralnets/
  • Перевод
Содержание:
Глава 1: Схемы реальных значений
Часть 1:
   Введение   
      Базовый сценарий: Простой логический элемент в схеме
      Цель
         Стратегия №1: Произвольный локальный поиск

Часть 2:
         Стратегия №2: Числовой градиент

Часть 3:
         Стратегия №3: Аналитический градиент

Часть 4:
      Схемы с несколькими логическими элементами
         Обратное распространение ошибки

Часть 5:
         Шаблоны в «обратном» потоке 
      Пример "Один нейрон"

Часть 6:
      Становимся мастером обратного распространения ошибки


Глава 2: Машинное обучение
Часть 7:
      Бинарная классификация

Часть 8:
      Обучение сети на основе метода опорных векторов (SVM)

Часть 9:
      Обобщаем SVM до нейронной сети

Часть 10:
      Более традиционный подход: Функции потерь



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

Бинарная классификация

Как и раньше, давайте начнем с простого. Наиболее простой, стандартной и при этом довольно распространенной проблемой машинного обучения является бинарная классификация. К ней можно свести множество очень интересных и важных проблем. Например, нам дан набор данных из 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) и продолжаем подталкивать их каждый раз, когда мы измеряем точку ввода данных. Со временем натяжение в отношении этих параметров подстроит эти значения таким образом, что функция выдаст высокие значения для положительных примеров и низкие – для отрицательных.
  • +11
  • 12,8k
  • 4
PAYSTO 38,25
Компания
Поделиться публикацией
Комментарии 4
  • 0
    очень полезно, спасибо. Во время учебы в ВУЗе не очень повезло с преподавателем по нейросетям, приходится сейчас осваивать.
    • 0
      но вот как раз в этой статье хотелось бы кода-примера) в теории и так все ясно, а ваш цикл нравится именно наличием примеров доступных
      • 0
        Обязательно будет в продолжении, не хватает времени, но скоро выложим следующую часть
    • 0
      Имеет смысл вставить в перевод дополнительные пояснения к примеру «Поэтому мы подтолкнем ее по схеме в положительном направлении...» имеется в виду изменение весов связей и это тоже не самая тривиальная задача.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое