Настройка параметров для Perceptron Learning Algorithm

У меня возникла проблема, пытающаяся выяснить, как настроить параметры для моего алгоритма персептрона, чтобы он относительно хорошо относился к невидимым данным.

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

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

Что касается количества итераций, я не совсем уверен, как определить идеальное число.

В любом случае любая помощь будет оценена. Спасибо.

Ответ 1

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

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

Скорость обучения, с которой вы начинаете, не должна быть слишком тонкой или слишком грубой (очевидно, субъективная, но, надеюсь, у вас есть грубый смысл того, что является большой и небольшой скоростью обучения).

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

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

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

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

Уровень обучения (обычно это доля от 0,01 до 0,2), безусловно, скажется на быстром обучении сети - т.е. он может быстрее перейти на локальный минимум. Это также может заставить вас перепрыгнуть через него. Итак, закодируйте цикл, который обучает сеть, скажем пять раз, используя фиксированное количество эпох (и одну и ту же начальную точку) каждый раз, но изменяя скорость обучения, например, от 0,05 до 0,2, каждый раз, увеличивая скорость обучения на 0.05.

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

Ответ 2

О скорости обучения, не влияющей на сходимость персептрона - Это не так. Если вы выберете слишком высокий уровень обучения, вы, вероятно, получите сеть расходящихся. Если вы меняете скорость обучения во время обучения, и он падает слишком быстро (т.е. Сильнее 1/n), вы также можете получить сеть, которая никогда не сходится (это потому, что сумма N (t) по t от 1 до inf конечна. это означает, что вектор весов может только изменяться на конечную величину).

Теоретически для простых случаев можно показать, что изменение n (скорость обучения) в соответствии с 1/t (где t - количество представленных примеров) должно работать хорошо, но на самом деле я обнаружил, что в практика, лучший способ сделать это - найти хорошее высокое значение n (наивысшее значение, которое не приводит к расхождению вашего обучения) и низкому значению n (это сложно понять, действительно зависит от данных и проблемы), а затем пусть n меняет линейно со временем от высоких n до низких n.

Ответ 3

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

Нормализация данных до нулевого среднего, дисперсия единицы или между 0-1 или любой другой стандартной формой может помочь в выборе значения скорости обучения. Как отметил Дуг, скорость обучения от 0,05 до 0,2 обычно хорошо работает.

Также это поможет ускорить сближение алгоритма.

Источник: Juszczak, P.; D. M. J. Tax и R. P. W. Dui (2002). "Масштабирование функций в описаниях векторных данных поддержки". Proc. 8-я Анну. Conf. Adv. School Comput. Изображения: 95-10.