Qu'est-ce que la contrainte maxnorm? Quelle est son utilité dans les réseaux de neurones convolutifs?

12

Voici un exemple de code keras qui l'utilise:

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)))
Jatin
la source

Réponses:

16

Depuis http://cs231n.github.io/neural-networks-2/#reg :

Contraintes de norme max. Une autre forme de régularisation consiste à appliquer une limite supérieure absolue sur la magnitude du vecteur de poids pour chaque neurone et à utiliser la descente de gradient projetée pour appliquer la contrainte. En pratique, cela correspond à effectuer la mise à jour des paramètres normalement, puis à appliquer la contrainte en fixant le vecteur de poids de chaque neurone pour satisfaireLes valeurs typiques de sont de l'ordre de 3 ou 4. Certaines personnes signalent des améliorations lors de l'utilisation de cette forme de régularisation. L'une de ses propriétés attrayantes est que le réseau ne peut pas "exploser" même lorsque les taux d'apprentissage sont trop élevés car les mises à jour sont toujours limitées.ww2<c.c

Franck Dernoncourt
la source
8

J'ai trouvé une réponse de McLawrence dans une autre question très utile. Reproduit ci-dessous:

Que fait une contrainte de poids max_norm?

maxnorm(m)sera, si la norme L2 de vos poids dépasse m, mettre à l'échelle l'ensemble de votre matrice de poids par un facteur qui réduit la norme à m. Comme vous pouvez le trouver dans le code keras dans 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

De plus, maxnorma un axisargument, le long duquel la norme est calculée. Dans votre exemple, vous ne spécifiez pas d'axe, donc la norme est calculée sur toute la matrice de poids. Si, par exemple, vous souhaitez contraindre la norme de chaque filtre convolutionnel, en supposant que vous utilisez tfl'ordre des dimensions, la matrice de poids aura la forme (rows, cols, input_depth, output_depth). Le calcul de la norme sur axis = [0, 1, 2]contraindra chaque filtre à la norme donnée.

Pourquoi le faire?

Contraindre directement la matrice de poids est un autre type de régularisation. Si vous utilisez un simple terme de régularisation L2, vous pénalisez les poids élevés avec votre fonction de perte. Avec cette contrainte, vous régularisez directement. Comme également lié dans le kerascode, cela semble fonctionner particulièrement bien en combinaison avec une dropoutcouche. Plus d'informations voir le chapitre 5.1 de ce document

jeremysprofile
la source
Bonne réponse, mais attention: "Dans votre exemple, vous ne spécifiez pas d'axe, donc la norme est calculée sur toute la matrice de poids." - Cela ne semble pas être vrai (du moins pour l'instant). Au lieu de cela, la norme est ensuite calculée sur la valeur par défaut axis=0.
Bobson Dugnutt
Je suis d'accord, la norme max est prise comme la longueur des poids qui se fanent dans un nœud dans une couche cachée, c'est-à-dire . De plus, avez-vous remarqué que pour la régularisation du décrochage, max-norm a été utilisé pour toutes les exécutions (voir le dernier paragraphe à la page 1934 de cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf ). ||w||
wrktsj