Вот пример кода keras, который использует его:
from keras.constraints import max_norm
model.add(Convolution2D(32, 3, 3, input_shape=(3, 32, 32),
border_mode='same', activation='relu', kernel_constraint=max_norm(3)))
Вот пример кода keras, который использует его:
from keras.constraints import max_norm
model.add(Convolution2D(32, 3, 3, input_shape=(3, 32, 32),
border_mode='same', activation='relu', kernel_constraint=max_norm(3)))
С http://cs231n.github.io/neural-networks-2/#reg :
Максимальные ограничения нормы. Другой формой регуляризации является установление абсолютной верхней границы величины вектора веса для каждого нейрона и использование спроецированного градиентного спуска для усиления ограничения. На практике это соответствует выполнению обновления параметра в обычном режиме, а затем обеспечению соблюдения ограничения путем зажима вектора весовых коэффициентов каждого нейрона для удовлетворенияТипичные значения имеют порядки 3 или 4. Некоторые люди сообщают об улучшениях при использовании этой формы регуляризации. Одним из его привлекательных свойств является то, что сеть не может «взорваться», даже если скорость обучения установлена слишком высоко, потому что обновления всегда ограничены.
Я нашел ответ Маклауренса в другом вопросе очень полезным. Воспроизведено ниже:
Что делает ограничение веса
max_norm
?
maxnorm(m)
будет, если L2-норма ваших весов превыситm
, масштабировать всю матрицу весов с коэффициентом, который уменьшает норму доm
. Как вы можете найти в коде keras вclass MaxNorm(Constraint)
:def __call__(self, w): norms = K.sqrt(K.sum(K.square(w), axis=self.axis, keepdims=True)) desired = K.clip(norms, 0, self.max_value) w *= (desired / (K.epsilon() + norms)) return w
Кроме того,
maxnorm
естьaxis
аргумент, по которому вычисляется норма. В вашем примере вы не указываете ось, поэтому норма рассчитывается по всей весовой матрице. Например, если вы хотите ограничить норму каждого сверточного фильтра, предполагая, что вы используетеtf
упорядочение размеров, матрица весов будет иметь форму(rows, cols, input_depth, output_depth)
. Вычисление нормыaxis = [0, 1, 2]
будет ограничивать каждый фильтр данной нормой.Зачем это делать?
Ограничение матрицы весов напрямую является еще одним видом регуляризации. Если вы используете простой термин регуляризации L2, вы штрафуете большие веса своей функцией потерь. С этим ограничением вы упорядочиваете напрямую. Как также указано в
keras
коде, это работает особенно хорошо в сочетании соdropout
слоем. Подробнее см. Главу 5.1 в этом документе.
axis=0
.