J'essaie juste de découvrir comment je peux utiliser Caffe . Pour ce faire, je viens de jeter un œil aux différents .prototxt
fichiers dans le dossier d'exemples. Il y a une option que je ne comprends pas:
# The learning rate policy
lr_policy: "inv"
Les valeurs possibles semblent être:
"fixed"
"inv"
"step"
"multistep"
"stepearly"
"poly"
Quelqu'un pourrait-il expliquer ces options?
Si vous regardez à l'intérieur du /caffe-master/src/caffe/proto/caffe.proto
fichier (vous pouvez le trouver en ligne ici ) vous verrez les descriptions suivantes:
// The learning rate decay policy. The currently implemented learning rate
// policies are as follows:
// - fixed: always return base_lr.
// - step: return base_lr * gamma ^ (floor(iter / step))
// - exp: return base_lr * gamma ^ iter
// - inv: return base_lr * (1 + gamma * iter) ^ (- power)
// - multistep: similar to step but it allows non uniform steps defined by
// stepvalue
// - poly: the effective learning rate follows a polynomial decay, to be
// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
// - sigmoid: the effective learning rate follows a sigmod decay
// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
//
// where base_lr, max_iter, gamma, step, stepvalue and power are defined
// in the solver parameter protocol buffer, and iter is the current iteration.
Il est courant de diminuer le taux d'apprentissage (lr) à mesure que le processus d'optimisation/d'apprentissage progresse. Cependant, on ne sait pas exactement comment le taux d'apprentissage devrait être diminué en fonction du nombre d'itérations.
Si vous utilisez CHIFFRES comme interface pour Caffe, vous pourrez voir visuellement comment les différents choix affectent le taux d'apprentissage.
fixe: le taux d'apprentissage est maintenu fixe tout au long du processus d'apprentissage.
inv: le taux d'apprentissage diminue comme ~ 1/T
étape: le taux d'apprentissage est constant par morceaux, en laissant tomber toutes les X itérations
multi-étapes: constante par morceaux à intervalles arbitraires
Vous pouvez voir exactement comment le taux d'apprentissage est calculé dans la fonction SGDSolver<Dtype>::GetLearningRate
( solveurs/sgd_solver.cpp ligne ~ 30).
Récemment, je suis tombé sur une approche intéressante et non conventionnelle du réglage du taux d'apprentissage: Le travail de Leslie N. Smith "No More Pesky Learning Rate Guessing Games" . Dans son rapport, Leslie suggère d'utiliser lr_policy
qui alterne entre décroissant et croissant le taux d'apprentissage. Son travail suggère également comment mettre en œuvre cette politique à Caffe.