Cómo configurar el tamaño de mini lote en SGD en keras

10

Soy nuevo en Keras y necesito tu ayuda.

Estoy entrenando una red neuronal en Keras y mi función de pérdida es la salida cuadrada b / n de la red y el valor objetivo.

Quiero optimizar esto usando Gradient Descent. Después de pasar por algunos enlaces en la red, he llegado a saber que generalmente se utilizan 3 tipos de descensos de gradiente:

  1. Descenso de gradiente de muestra única : aquí, el gradiente se calcula a partir de una sola muestra cada iteración -> El gradiente puede ser ruidoso.
  2. Descenso de gradiente por lotes : aquí, el gradiente es el promedio de gradientes calculados a partir de TODAS las muestras en el conjunto de datos -> El gradiente es más general, pero intratable para grandes conjuntos de datos.
  3. Descenso de gradiente de mini lotes : similar a Batch GD. En lugar de usar un conjunto de datos completo, solo algunas de las muestras (determinadas por tamaño de lote) se usan para calcular el gradiente en cada iteración -> No muy ruidoso y manejable computacionalmente -> Lo mejor de ambos mundos.

Preguntas:

  1. Me gustaría realizar el Descenso de gradiente de mini lotes en Keras. ¿Cómo puedo hacer esto? ¿Debo usar el optimizador SGD?
  2. Si se va a utilizar SGD, ¿cómo configuro el batch_size? No parece haber un parámetro para la función SGD para establecer el tamaño del lote.

    optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
  3. Hay un parámetro batch_size en model.fit () en Keras.

    history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)

    ¿Es esto lo mismo que el tamaño del lote en Descenso de gradiente de mini-lote? Si no, ¿qué significa exactamente entrenar en un lote de entradas? ¿Significa que 'batch_size' no. de subprocesos se ejecutan en paralelo y actualizan los pesos del modelo en paralelo?

Si ayuda, aquí está el fragmento de código de Python que he escrito hasta ahora .

Iceflame007
fuente

Respuestas:

8

Sí, tiene usted razón. En Keras se batch_sizerefiere al tamaño del lote en Descenso de gradiente de mini-lote. Si desea ejecutar un Descenso de degradado por lotes, debe establecer batch_sizeel número de muestras de entrenamiento. Su código se ve perfecto, excepto que no entiendo por qué almacena la model.fitfunción en un historial de objetos.

Ernest S Kirubakaran
fuente
3
Se almacena en un objeto de historial porque en keras, la función "ajuste" devuelve no solo el modelo entrenado, sino un objeto de Historial que almacena el modelo entrenado, el historial de entrenamiento y muchas otras cosas. Hay algunos ejemplos en ejemplos de keras como ese.
Ygor de Mello Canalli
1

Dejando a un lado las consideraciones teóricas, dado el conjunto de datos de la vida real y el tamaño de la red neuronal moderna típica, por lo general tomaría demasiado tiempo entrenar en lotes de tamaño uno, y no tendrá suficiente memoria RAM o GPU para entrenar en todo el conjunto de datos En seguida. Por lo tanto, generalmente no es la pregunta "si" se debe usar un mini lote, sino "qué tamaño" de los lotes debe usar. El batch_sizeargumento es el número de observaciones para entrenar en un solo paso, por lo general, los tamaños más pequeños funcionan mejor porque tienen un efecto de regularización. Además, a menudo las personas usan optimizadores más complicados (por ejemplo, Adam, RMSprop) y otros trucos de regularización, lo que hace que la relación entre el rendimiento del modelo, el tamaño del lote, la tasa de aprendizaje y el tiempo de cálculo sea más complicada.

Tim
fuente
Gracias por aclarar esto. Pero, ¿cómo haría la normalización de datos de esta manera? Sé que podría normalizar todos los datos de entrenamiento y pruebas por completo, pero esto hará que los mini lotes no se normalicen más.
Mr.Robot
@ Mr.Robot, ¿por qué asumiría que cada lote necesita ser normalizado independientemente?
Tim
Anteriormente leí una publicación que decía que los datos de entrenamiento y prueba deben manejarse por separado (es decir, primero dividir la prueba de entrenamiento, luego procesarlos individualmente). Pensé que esto también se aplicaría al optimizar el uso de mini lotes. ¿Sospecho que esto podría ser bueno para la convergencia?
Mr.Robot
@ Mr.Robot reductio ad absurdum : con mini lotes de tamaño 1, ¿pasaría como datos solo 0's? Puede hacer una pregunta por separado si lo desea.
Tim
¡Gracias por señalar esto! Ahora ahora los problemas con mi razonamiento.
Mr.Robot