CNN ксавье инициализация веса

14

В некоторых уроках я обнаружил, что было указано, что инициализация весов «Ксавье» (статья: Понимание сложности обучения глубоких нейронных сетей с прямой связью ) является эффективным способом инициализации весов нейронных сетей.

Для полностью связанных слоев в этих уроках было практическое правило:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

где - дисперсия весов для слоя, инициализированного с нормальным распределением, а , - количество нейронов в родительском и текущем слоях.п я п п о у тVar(W)ninnout

Существуют ли аналогичные эмпирические правила для сверточных слоев?

Я изо всех сил пытаюсь выяснить, что было бы лучше для инициализации весов сверточного слоя. Например, в слое, где форма весов имеет (5, 5, 3, 8)размер ядра, то есть 5x5фильтрация трех входных каналов (вход RGB) и создание 8карт объектов ... будет 3считаться количеством входных нейронов? Или, скорее 75 = 5*5*3, потому что входные данные являются 5x5патчи для каждого цветового канала?

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

daniel451
источник

Ответы:

13

В этом случае количество нейронов должно быть 5*5*3.

Я нашел это особенно полезным для сверточных слоев. Часто равномерное распределение по интервалу работает. [c/(in+out),c/(in+out)]

Он реализован как опция практически во всех библиотеках нейронных сетей. Здесь вы можете найти исходный код реализации Keras инициализации Xavier Glorot.

dontloo
источник
1
Хм .. у вас есть дополнительные советы? Например, одна из моих сетей имеет полностью связанный слой с 480 000 нейронов. Если я применяю инициализацию Xavier, я получаю дисперсию примерно и моя сеть просто запоминает некоторые странные помехи. Я предполагаю, что это падает в некоторый локальный минимум. Я имею в виду, вес тогда очень мал. В основном я испытываю разумное обучение с чем-то в интервале . Есть идеи по этому поводу? Я думаю, что инициализация Xavier не распространяется на действительно большие слои? [ 0,1 , 0,01 ]1106[0.1,0.01]
daniel451
@ascenator Извините, я мало знаю о том, как меняется вес во время тренировок. иногда странные результаты могут быть получены из-за слишком больших / малых показателей обучения.
января
Многие библиотеки DL используют стандартное отклонение, а не дисперсию, в качестве параметра для своих методов генерации случайных чисел. Таким образом, для дисперсии вам потребуется стандартное отклонение , которое может объяснить ваши результаты. 10 - 3106103
eric.mitchell
0

Я второй ответ Эрика здесь. Я также принимаю «квадратный» термин, а не только этот термин. Несмотря на это, когда вы подключаете сигмоид глубоко в своей сети к выходу "RelU" .... это может привести к остановке тренировки. Это из-за неограниченного выхода "Relu", который может заставить градиент в сигмоиде падать до 0, и обучение не происходит. Таким образом, в этих случаях у меня есть коэффициент «scaleDown» для моей сети, который будет уменьшать отклонение инициализации на этот коэффициент. Я продолжаю эмпирически настраивать веса, пока не произойдет обучение. Простой способ найти - сохранить модель сразу после 1 итерации и взглянуть на вывод RELU (который связан с сигмоидом). Продолжайте настраивать веса, пока этот выход RELU не станет разумным. А затем использовать эти веса для обучения. Это хорошее начало. Если он все еще рушится после нескольких итераций, немного утяжелите их, пока не достигнете стабильности. Это просто взлом, который я использовал. Это сработало для меня для моей настройки. Так что делюсь своим опытом. Разные вещи работают для разных установок.

Удачи!

Сарнатх К
источник