Локальная скорость обучения весов нейронов в алгоритме обратного распространения ошибки

от автора

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

Теория

Начнем с теории, для начала вспомним чему равно изменение одного веса, в данном случае с регуляризацией, но сути это не меняет:
image

  • эта (η) — скорость обучения
  • m — размер обучающего множества
  • n — номер слоя
  • полная нотация тут

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

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

На первом батче обучения все модификаторы скорости обучения приравниваются к единице, далее динамическая настройка модификаторов в процессе обучения происходит следующим образом:
image

  • image — значение градиента в определенный момент времеи
  • тау τ — текущий момент времени или текущий батч обучения
  • b — аддитивный бонус, который получает модификатор, если направление градиента по определенной размерности не меняется
  • p — мультипликативный штраф, в случае смены направления вектора градиента

Имеет смысл бонус делать очень маленьким числом меньшим единицы, а пенальти image, таким образом b + p = 1. Например a = 0.05, p = 0.95. Такая настройка гарантирует, что в случае осцилляции направления вектора градиента, значение модификатора будет стремиться обратно к начальной единице. Если не вдаваться в математику, то можно сказать так, что алгоритм поощряет те веса (рост в рамках какой то размерности пространства весов) которые сохраняют свое направление относительно предыдущего момента времени, и штрафует тех, кто начинает метаться.

Автор этого метода Geoffrey Hinton (он кстати один из первых предложил использовать градиентный спуск для обучения нейронной сети) так же советует учесть следующие вещи:

  • во-первых стоит задать разумные пределы роста для модификаторов
  • во-вторых не стоит использовать этот прием для онлайн обучения, или для маленьких батчей; нужно что бы в процессе батча аккумулировался достаточно общий градиент; а иначе увеличивается частота осцилляции направления, и тем самым теряется смысл в модификаторе

Эксперименты

Все эксперименты проводились на множестве картинок 29 на 29 пикселей, на которых нарисованы английские буквы. Использовался один скрытый слой из 100 нейронов с сигмоиндной функцией активации, на выходе softmax слой, а минимизировалась перекрестная энтропия. Итого легко подсчитать что всего в сети 100 * (29*29 + 1) + 26 * (100 + 1) = 86826 весов (учитывая смещения). Начальные значения весов были взяты из равномерного распределения image. Во всех трех экспериментах использовалась одна и та же инициализация весов. Так же используется полный батч.

Первый

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

  • красный — без использования модификатора
  • зеленый — bonus = 0.05, penalty = 0.95, limit = [0.1, 10]
  • синий — bonus = 0.1, penalty = 0.9, limit = [0.01, 100]

Видно что на очень простом множестве положительный эффект модификатора есть, но он не велик.

Второй

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

  • красный — без использования модификатора
  • синий — bonus = 0.05, penalty = 0.95, limit = [0.1, 10]

Полный провал! Модификатор не только не улучшил качество, а напротив, он усилил осцилляцию, в то время как без модификатора, ошибка в среднем падает.

Третий

В этом эксперименте я использую то же множество, что и во втором, но глобальная скорость обучения равна 0.001.

  • красный — без использования модификатора
  • синий — bonus = 0.005, penalty = 0.995, limit = [0.01, 100]

В данном случае мы получаем очень существенный прирост к качеству. И если после 300 эпох прогнать распознавание на обучающем множестве и тестовом:

  • красный: на обучающем множестве 94.74%, на тестовом 67.18%
  • синий: на обучающем множестве 100%; на тестовом 74.4%

Вывод

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

ссылка на оригинал статьи http://habrahabr.ru/post/157179/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *