2017-10-09 4 views
1

Le modèle suivant:Adagrad les variables implicites

import tensorflow as tf 
import numpy as np 

BATCH_SIZE = 3 
VECTOR_SIZE = 1 
LEARNING_RATE = 0.1 

x = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE], 
        name='input_placeholder') 
y = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE], 
        name='labels_placeholder') 

W = tf.get_variable('W', [VECTOR_SIZE, BATCH_SIZE]) 
b = tf.get_variable('b', [VECTOR_SIZE], initializer=tf.constant_initializer(0.0)) 

y_hat = tf.matmul(W, x) + b 
predict = tf.add(tf.matmul(W, x), b, name='predict') 
total_loss = tf.reduce_mean(y-y_hat, name='total_loss') 
train_step = tf.train.AdagradOptimizer(LEARNING_RATE).minimize(total_loss) 
X = np.ones([BATCH_SIZE, VECTOR_SIZE]) 
Y = np.ones([BATCH_SIZE, VECTOR_SIZE]) 
all_saver = tf.train.Saver() 

A la liste suivante des variables:

for el in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES): 
    print(el) 


<tf.Variable 'W:0' shape=(1, 3) dtype=float32_ref> 
<tf.Variable 'b:0' shape=(1,) dtype=float32_ref> 
<tf.Variable 'W/Adagrad:0' shape=(1, 3) dtype=float32_ref> 
<tf.Variable 'b/Adagrad:0' shape=(1,) dtype=float32_ref> 

tenseurs W:0 et b:0 sont évidents, mais où W/Adagrad:0 et b/Adagrad:0 viennent ne sont pas complètement clair. Je ne les vois pas non plus sur tensorboard: enter image description here

Répondre

1

Ces variables sont définies au moment où vous appelez le AdagradOptimizer. Tous les optimiseurs utilisent un certain nombre de variables pour stocker les valeurs dont ils ont besoin pour faire leur travail.

Pour ce qui concerne Adagrad, permettez-moi de rappeler ce que une étape standard de mise à jour de descente de gradient ressemble:

theta(t+1) = theta(t) - eta * grad_theta(t) 

theta est un paramètre générique (comme votre W ou b), eta est un taux constant d'apprentissage et grad_theta est le gradient de votre fonction de perte par rapport à theta à l'itération t.

Souvent, les gens utilisent un calendrier particulier pour le taux d'apprentissage eta parce qu'ils ont besoin d'un eta plus grande dans la phase initiale d'apprentissage, tandis qu'un plus petit eta dans la phase finale (lorsque vous êtes très proche du minimum et que vous voulez évitez d'osciller autour d'elle). Adagrad essaie de le faire automatiquement en utilisant l'idée suivante: "Je stocke la racine carrée des gradients de theta jusqu'à l'itération t et je l'échelle eta proportionnellement". En d'autres termes, étant donné:

adagrad_theta(t) = sum(grad_theta(tau)) for tau=1,.., t 

la règle de mise à jour id Adagrad les éléments suivants:

theta(t+1) = theta(t) - eta * grad_theta(t)/(sqrt(adagrad_theta(t)+ eps)) 

Comme vous pouvez le constater, le taux d'apprentissage est redimensionné w.r.t. la valeur adagrad_theta. Ici, eps est une petite constante (par exemple 1e-12) pour éviter la division par zéro. Une autre caractéristique de cette règle de mise à jour est que plus vous mettez à jour un paramètre jusqu'à un certain point, moins vous le ferez dans les étapes suivantes.

W/Adagrad:0 et b/Adagrad:0 sont rien de plus que la adagrad_theta pour vos variables W et b, respectivement. Là, la somme des gradients de ces variables est accumulée. Tensorboard sait qu'il s'agit de variables particulières (liées non pas au modèle mais à la stratégie d'optimisation) et ensuite ne les attache pas à votre graphique actuel. Cependant, vous êtes toujours capable de les voir dans le coin supérieur droit de l'écran. Si vous voulez les voir dans votre graphique actuel, cliquez simplement dessus et, dans le coin supérieur droit, vous avez la possibilité de les joindre à votre graphique.

+1

Merci pour l'explication. Je comprends pourquoi Tensorflow a besoin de stocker «W» et «b», mais quel est le point de stockage de Hessian? – user1700890

+0

J'étais générique dans cette réponse. Adagrad est un algorithme d'optimisation assez simple. Je modifie la réponse et essaie de t'expliquer –