J'utilise TensorFlow pour former un réseau neuronal. Voici comment j'initialise le GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
Le problème ici est que je ne sais pas comment définir une règle de mise à jour pour le taux d'apprentissage ou une valeur de décroissance pour cela.
Comment puis-je utiliser un taux d'apprentissage adaptatif ici?
python
tensorflow
Afficher un nom
la source
la source
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Il semble que la définition d'un nouveau taux d'apprentissage nécessite d'initialiser le modèle avec les variables déjà entraînées. Mais je ne peux pas comprendre comment faire cela.Réponses:
Tout d'abord,
tf.train.GradientDescentOptimizer
est conçu pour utiliser un taux d'apprentissage constant pour toutes les variables dans toutes les étapes. TensorFlow fournit également des optimiseurs adaptatifs prêts à l'emploi, y compris letf.train.AdagradOptimizer
et letf.train.AdamOptimizer
, et ceux-ci peuvent être utilisés comme remplacements instantanés.Cependant, si vous souhaitez contrôler le taux d'apprentissage avec une descente de gradient autrement vanille, vous pouvez profiter du fait que l'
learning_rate
argument dutf.train.GradientDescentOptimizer
constructeur peut être unTensor
objet. Cela vous permet de calculer une valeur différente pour le taux d'apprentissage à chaque étape, par exemple:Vous pouvez également créer un scalaire
tf.Variable
contenant le taux d'apprentissage et l'attribuer à chaque fois que vous souhaitez modifier le taux d'apprentissage.la source
tf.clip_by_norm
n'accepte pas de tenseur pour la norme de clip, alors que diriez-vous de faire[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, oùct = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, la seule chose qui l'empêche d'accepter un tenseur comme entrée est leconstant_op.constant(1.0 / clip_norm)
. Remplacer cette expression par lamath_ops.inv(clip_norm)
ferait fonctionner avec une entrée d'espace réservé (ou tout autre tenseur).)Tensorflow fournit une op pour appliquer automatiquement une décroissance exponentielle à un tenseur de taux d'apprentissage:
tf.train.exponential_decay
. Pour un exemple d'utilisation, voir cette ligne dans l'exemple de modèle convolutif MNIST . Ensuite, utilisez la suggestion de @ mrry ci-dessus pour fournir cette variable comme paramètre learning_rate à l'optimiseur de votre choix.L'extrait clé à regarder est:
Notez le
global_step=batch
paramètre à minimiser. Cela indique à l'optimiseur d'incrémenter utilement le paramètre 'batch' pour vous chaque fois qu'il s'entraîne.la source
batch
est appeléeglobal_step
et il existe plusieurs fonctions pratiques, une pour la créertf.train.create_global_step()
(qui crée simplement un entiertf.Variable
et l'ajoute à latf.GraphKeys.GLOBAL_STEP
collection) ettf.train.get_global_step()
.L'algorithme de descente de gradient utilise le taux d'apprentissage constant que vous pouvez fournir lors de l'initialisation . Vous pouvez passer différents taux d'apprentissage de la manière indiquée par Mrry.
Mais au lieu de cela, vous pouvez également utiliser des optimiseurs plus avancés qui ont un taux de convergence plus rapide et s'adaptent à la situation.
Voici une brève explication basée sur ma compréhension:
Adam ou élan adaptatif est un algorithme similaire à AdaDelta. Mais en plus de stocker les taux d'apprentissage pour chacun des paramètres, il stocke également les changements d'élan pour chacun d'eux séparément
A quelques visualisations :
la source
À partir de la documentation officielle de tensorflow
la source
Si vous souhaitez définir des taux d'apprentissage spécifiques pour des intervalles d'époques comme
0 < a < b < c < ...
. Ensuite, vous pouvez définir votre taux d'apprentissage comme un tenseur conditionnel, conditionnel à l'étape globale, et le fournir normalement à l'optimiseur.Vous pouvez y parvenir avec un tas d'
tf.cond
instructions imbriquées , mais il est plus facile de construire le tenseur de manière récursive:Ensuite, pour l'utiliser, vous devez savoir combien d'étapes d'entraînement il y a dans une seule époque, afin que nous puissions utiliser l'étape globale pour basculer au bon moment, et enfin définir les époques et les taux d'apprentissage que vous souhaitez. Donc, si je veux les taux d'apprentissage
[0.1, 0.01, 0.001, 0.0001]
pendant les intervalles d'époque de[0, 19], [20, 59], [60, 99], [100, \infty]
respectivement, je ferais:la source