¿Cómo implementar el algoritmo de descenso de gradiente estocástico lineal multivariante en tensorflow?

Comencé con la implementación simple de un descenso de gradiente lineal de una sola variable, pero ¿no sé cómo extenderlo al algoritmo de descenso de gradiente estocástico multivariado?

Regresión lineal de una sola variable

import tensorflow as tf import numpy as np # create random data x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.5 # Find values for W that compute y_data = W * x_data W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) y = W * x_data # Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss) # Before starting, initialize the variables init = tf.initialize_all_variables() # Launch the graph. sess = tf.Session() sess.run(init) # Fit the line. for step in xrange(2001): sess.run(train) if step % 200 == 0: print(step, sess.run(W)) 

Tienes dos partes en tu pregunta:

  • Cómo cambiar este problema a un espacio de dimensión superior.
  • Cómo cambiar del descenso de gradiente de lote a un descenso de gradiente estocástico.

Para obtener una configuración dimensional más alta, puede definir su problema lineal y = . Luego, solo necesita cambiar la dimensión de su Variable W para que coincida con la de w y reemplazar la multiplicación W*x_data por un producto escalar tf.matmul(x_data, W) y su código debería funcionar tf.matmul(x_data, W) .

Para cambiar el método de aprendizaje a un descenso de gradiente estocástico, debe abstraer la entrada de su función de costo utilizando tf.placeholder .
Una vez que haya definido X e y_ para mantener su entrada en cada paso, puede construir la misma función de costo. Luego, debe llamar a su paso al alimentar el mini lote apropiado de sus datos.

Aquí hay un ejemplo de cómo podría implementar tal comportamiento y debería mostrar que W converge rápidamente a w .

 import tensorflow as tf import numpy as np # Define dimensions d = 10 # Size of the parameter space N = 1000 # Number of data sample # create random data w = .5*np.ones(d) x_data = np.random.random((N, d)).astype(np.float32) y_data = x_data.dot(w).reshape((-1, 1)) # Define placeholders to feed mini_batches X = tf.placeholder(tf.float32, shape=[None, d], name='X') y_ = tf.placeholder(tf.float32, shape=[None, 1], name='y') # Find values for W that compute y_data =  W = tf.Variable(tf.random_uniform([d, 1], -1.0, 1.0)) y = tf.matmul(X, W, name='y_pred') # Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y_ - y)) optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss) # Before starting, initialize the variables init = tf.initialize_all_variables() # Launch the graph. sess = tf.Session() sess.run(init) # Fit the line. mini_batch_size = 100 n_batch = N // mini_batch_size + (N % mini_batch_size != 0) for step in range(2001): i_batch = (step % n_batch)*mini_batch_size batch = x_data[i_batch:i_batch+mini_batch_size], y_data[i_batch:i_batch+mini_batch_size] sess.run(train, feed_dict={X: batch[0], y_: batch[1]}) if step % 200 == 0: print(step, sess.run(W)) 

Dos notas laterales:

  • La implementación a continuación se denomina descenso de gradiente de mini lotes, ya que en cada paso, el gradiente se calcula utilizando un subconjunto de nuestros datos de tamaño mini_batch_size . Esta es una variante del descenso del gradiente estocástico que se usa generalmente para estabilizar la estimación del gradiente en cada paso. El descenso del gradiente estocástico se puede obtener configurando mini_batch_size = 1 .

  • El conjunto de datos se puede barajar en cada época para obtener una implementación más cercana a la consideración teórica. Algunos trabajos recientes también consideran el uso de una sola pasada a través de su conjunto de datos, ya que evita el ajuste excesivo. Para una explicación más matemática y detallada, puedes ver Bottou12 . Esto se puede cambiar fácilmente de acuerdo con la configuración de su problema y la propiedad estadística que está buscando.