Содержание:
Введение
Базовый сценарий: Простой логический элемент в схеме
Цель
Стратегия №1: Произвольный локальный поиск
Стратегия №2: Числовой градиент
Стратегия №3: Аналитический градиент
Схемы с несколькими логическими элементами
Обратное распространение ошибки
Шаблоны в «обратном» потоке
Пример "Один нейрон"
Становимся мастером обратного распространения ошибки
В последней главе мы рассматривали схемы с реальными значениями, которые вычисляли сложные выражения своих исходных значений (проход вперед), а также мы смогли рассчитать градиенты этих выражений по оригинальным исходным значениям (обратный проход). В этой главе мы поймем, насколько полезным может быть этот довольно простой механизм в обучении машины.
Бинарная классификация
Как и раньше, давайте начнем с простого. Наиболее простой, стандартной и при этом довольно распространенной проблемой машинного обучения является бинарная классификация. К ней можно свести множество очень интересных и важных проблем. Например, нам дан набор данных из 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) и продолжаем подталкивать их каждый раз, когда мы измеряем точку ввода данных. Со временем натяжение в отношении этих параметров подстроит эти значения таким образом, что функция выдаст высокие значения для положительных примеров и низкие – для отрицательных.
Автор: Irina_Ua