with tutorial seq2seq neural network machine learning guide for experts neural-network tensorflow

neural network - tutorial - Entrenamiento TensorFlow



tensorflow text classification (2)

Suponiendo que tengo una red neuronal muy simple, como perceptrón multicapa. Para cada capa, la función de activación es sigmoide y la red está completamente conectada.

En TensorFlow, esto podría definirse así:

sess = tf.InteractiveSession() # Training Tensor x = tf.placeholder(tf.float32, shape = [None, n_fft]) # Label Tensor y_ = tf.placeholder(tf.float32, shape = [None, n_fft]) # Declaring variable buffer for weights W and bias b # Layer structure [n_fft, n_fft, n_fft, n_fft] # Input -> Layer 1 struct_w = [n_fft, n_fft] struct_b = [n_fft] W1 = weight_variable(struct_w, ''W1'') b1 = bias_variable(struct_b, ''b1'') h1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1) # Layer1 -> Layer 2 W2 = weight_variable(struct_w, ''W2'') b2 = bias_variable(struct_b, ''b2'') h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2) # Layer2 -> output W3 = weight_variable(struct_w, ''W3'') b3 = bias_variable(struct_b, ''b3'') y = tf.nn.sigmoid(tf.matmul(h2, W3) + b3) # Calculating difference between label and output using mean square error mse = tf.reduce_mean(tf.square(y - y_)) # Train the Model # Gradient Descent train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)

El objetivo de diseño para este modelo es mapear un espectrograma de fft de puntos n_fft a otro n_fft objetivo n_fft . Supongamos que tanto los datos de entrenamiento como los datos objetivo son de tamaño [3000, n_fft] . Se almacenan en las variables spec_train y spec_target .

Ahora aquí viene la pregunta. Para TensorFlow, ¿hay alguna diferencia entre estos dos entrenamientos?

Entrenamiento 1:

for i in xrange(200): train_step.run(feed_dict = {x: spec_train, y_: spec_target})

Entrenamiento 2:

for i in xrange(200): for j in xrange(3000): train = spec_train[j, :].reshape(1, n_fft) label = spec_target[j, :].reshape(1, n_fft) train_step.run(feed_dict = {x: train, y_: label})

¡Muchas gracias!


En la primera versión de entrenamiento, está entrenando todo el lote de datos de entrenamiento a la vez, lo que significa que el primer y el elemento 3000 de spec_train se procesarán usando los mismos parámetros de modelo en un solo paso. Esto se conoce como Descenso de gradiente (por lotes) .

En la segunda versión de entrenamiento, está entrenando un solo ejemplo de los datos de entrenamiento a la vez, lo que significa que el elemento 3000 de spec_train se procesará utilizando los parámetros del modelo que se han actualizado 2999 veces desde que se procesó el primer elemento más recientemente. Esto se conoce como Descenso Gradual Estocástico (o lo sería si el elemento se seleccionara al azar).

En general, TensorFlow se usa con conjuntos de datos que son demasiado grandes para procesar en un lote, por lo que se favorece el SGD de mini lotes (donde un subconjunto de los ejemplos se procesa en un solo paso). Procesar un solo elemento a la vez es teóricamente deseable, pero es intrínsecamente secuencial y tiene altos costos fijos porque las multiplicaciones de la matriz y otras operaciones no son tan densas desde el punto de vista computacional. Por lo tanto, procesar un pequeño lote (por ejemplo, 32 o 128) de ejemplos a la vez es el enfoque habitual, con múltiples réplicas entrenando en diferentes lotes en paralelo.

Consulte esta pregunta StatsExchange para una discusión más teórica sobre cuándo debe usar un enfoque frente al otro.


Sí, hay una diferencia. Creo que la función de pérdida de la segunda vía puede ser un poco desordenada. Es más parecido a la capacitación en línea. Para cada punto de datos en todo el lote, actualiza todos sus parámetros. Pero de la primera manera se llama gradiente de lotes donde toma un lote a la vez y toma la pérdida promedio luego actualiza los parámetros.

Consulte este enlace https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent La primera respuesta es realmente buena en este enlace