Невозможно обучить/настроить PReLU в кафе

Я работаю над распознаванием лиц с помощью глубокой нейронной сети. Я использую базу данных CASIA-webface, содержащую 10575 классов. для обучения глубокой CNN (используемой CASIA, подробности см. в статье) раздела 10 Convolution, 5 Pooling and 1 полностью связанный слой. Для активации используется функция "ReLU". Мне удалось успешно обучить его с помощью caffe и получили желаемую производительность.

Моя проблема в том, что я не могу обучить/настроить ту же CNN, используя "PReLU" активацию. Сначала я думал, что простая замена "ReLU" на "PReLU" сработает. Однако ни одна из стратегий тонкой настройки (из caffemodel, которая была изучена с помощью "ReLU") и обучения с нуля не сработала.

Чтобы упростить задачу обучения, я значительно сократил обучающий набор данных только до 50 классов. Тем не менее, CNN все еще не могла учиться с "PReLU", тогда как она могла учиться с "ReLU".

Чтобы понять, что мой caffe отлично работает с "PReLU", я проверил его, запустив простые сети (и с "ReLU", и с "PReLU") с использованием данных cifar10, и это сработало.

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


person Hasnat    schedule 26.05.2016    source источник
comment
Изменили ли вы какие-либо параметры тренировки? Например, скорость обучения или конвергенция эпсилон? Тонкая настройка модели иногда требует тонкой настройки одного или двух параметров. Кроме того, я не уверен, где вставлены функции P/ReLU: статья не называет их, поэтому я предполагаю, что они находятся в обычных местах (рядом с POOL).   -  person Prune    schedule 26.05.2016
comment
Да, я пробовал с другим диапазоном параметров тренировки, как вы упомянули. P/ReLU вставляется после слоя Conv.   -  person Hasnat    schedule 26.05.2016


Ответы (3)


Основное различие между активацией "ReLU" и "PReLU" заключается в том, что последняя функция активации имеет ненулевой наклон для отрицательных значений ввода, и этот наклон можно узнать из данных. Было замечено, что эти свойства делают обучение более устойчивым к случайной инициализации весов.
Я использовал активацию "PReLU" для точной настройки сетей, которые изначально обучались с помощью "ReLU", и я добился более быстрой и надежной сходимости.

Я предлагаю заменить "ReLU" следующей конфигурацией

layer {
  name: "prelu"
  type: "PReLU"
  bottom: "my_bottom"
  top: "my_bottom" # you can make it "in-place" to save memory
  param { lr_mult: 1 decay_mult: 0 }
  prelu_param { 
    filler: { type: "constant" val: 0 } 
    channel_shared: false
  }
}

Обратите внимание, что при инициализации отрицательного наклона на 0 активация "PReLU" на самом деле такая же, как "ReLU", поэтому вы начинаете точную настройку точно с того же места, что и исходная сеть.

Также обратите внимание, что я явно установил коэффициенты скорости обучения и скорости затухания (1 и 0 соответственно) — вам может потребоваться немного настроить эти параметры, хотя я считаю, что установка decay_weight на любое значение, кроме нуля, неразумно.

person Shai    schedule 27.05.2016

Я смог хорошо тренироваться, используя PReLu для своей сети, хотя и с немного меньшей точностью, чем с использованием ReLu. И да, я просто заменил ReLu на PReLu.

Однако я почти постоянно замечал, что PReLU сходится намного быстрее, чем ReLu. Итак, может быть, вам нужно снизить скорость обучения?

person Prophecies    schedule 26.05.2016
comment
Я пробовал разные скорости обучения от 0,1 до 0,00001. Я использую решатель SGD по умолчанию. - person Hasnat; 26.05.2016
comment
У меня такой же опыт: используя сеть, обученную с помощью ReLU, тонкая настройка ее на другую БД с использованием PReLU работает намного лучше. - person Shai; 27.05.2016

Два основных наблюдения:

  • Не гарантируется, что PReLU даст более точные результаты, чем ReLU. Он работал лучше с AlexNet на ImageNet, но это просто предполагает дальнейшие исследования и уточнения; он не обязательно передается другим приложениям.
  • CIFAR, ImageNet и CASIA-webface не являются идентичными приложениями.

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

Измените размер входного пакета. Разрешено ли вам изменять топологию другими способами, например, изменять слой свертки? Вы можете увидеть, что вы получите с другим подходом к фильтрам CONV2.

person Prune    schedule 26.05.2016
comment
Несколько недавних работ дали лучшие результаты на тех же CNN и DB, заменив ReLU на PReLU. Поэтому моя цель - добиться лучшей производительности, следуя этому, а не изменять конфигурацию сети. Я могу изменить эпсилон сходимости, импульс и т. Д. Но вопрос в том, с какой скоростью обучения я должен их изменить? У меня есть некоторая неопределенность в отношении типа решателя. Любое предложение для этого? - person Hasnat; 26.05.2016
comment
Хорошо; который удаляет несколько моих предложений. Для остальных я бы попробовал с исходной скоростью обучения, изменив остальные в 1,5 раза в каждом направлении. Я не так хорошо знаком с основным шагом смены решателя, но ... вы используете SoftMax? - person Prune; 26.05.2016
comment
Да, СофтМакс. Я использую решатель SGD. Я не знаю, поможет ли изменение типа решателя (например, ADAM) или нет! - person Hasnat; 27.05.2016
comment
Что ж, очевидный ответ :-) — попробовать другие решатели, чтобы посмотреть, что они делают. - person Prune; 27.05.2016