Réponses:
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.
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épassem
, 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 dansclass 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,
maxnorm
a unaxis
argument, 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 utiliseztf
l'ordre des dimensions, la matrice de poids aura la forme(rows, cols, input_depth, output_depth)
. Le calcul de la norme suraxis = [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
keras
code, cela semble fonctionner particulièrement bien en combinaison avec unedropout
couche. Plus d'informations voir le chapitre 5.1 de ce document
axis=0
.