Risposte:
Da http://cs231n.github.io/neural-networks-2/#reg :
Vincoli della norma massima. Un'altra forma di regolarizzazione è quella di imporre un limite superiore assoluto alla grandezza del vettore del peso per ogni neurone e usare la discesa gradiente proiettata per imporre il vincolo. In pratica, ciò corrisponde all'esecuzione normale dell'aggiornamento dei parametri e quindi all'applicazione del vincolo bloccando il vettore di peso di ogni neurone per soddisfareI valori tipici di sono negli ordini di 3 o 4. Alcune persone segnalano miglioramenti quando utilizzano questa forma di regolarizzazione. Una delle sue proprietà interessanti è che la rete non può "esplodere" anche quando i tassi di apprendimento sono troppo alti perché gli aggiornamenti sono sempre limitati.
Ho trovato molto utile una risposta di McLawrence in un'altra domanda . Di seguito riprodotto:
Che cosa fa un vincolo di peso
max_norm
?
maxnorm(m)
se la norma L2 dei tuoi pesi superam
, ridimensiona l'intera matrice del peso di un fattore che riduce la norma am
. Come puoi trovare nel codice keras inclass 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
Adizionale,
maxnorm
ha unaxis
argomento, lungo il quale viene calcolata la norma. Nel tuo esempio non specifichi un asse, quindi la norma viene calcolata sull'intera matrice di peso. Se ad esempio vuoi vincolare la norma di ogni filtro convoluzionale, supponendo che tu stia utilizzando l'tf
ordinamento dimensionale, la matrice del peso avrà la forma(rows, cols, input_depth, output_depth)
. Il calcolo della norma sopraaxis = [0, 1, 2]
vincolerà ciascun filtro alla norma data.Perché farlo
Vincolare direttamente la matrice dei pesi è un altro tipo di regolarizzazione. Se usi un semplice termine di regolarizzazione L2, penalizzi i pesi elevati con la tua funzione di perdita. Con questo vincolo, regolarizzi direttamente. Come anche collegato nel
keras
codice, questo sembra funzionare particolarmente bene in combinazione con undropout
livello. Maggiori informazioni vedi capitolo 5.1 in questo documento
axis=0
.