Interpretación de epoch_size, minibatch_size_in_samples y MinibatchSource.next_minibatch en CNTK
En este artículo, aclararemos la interpretación y el uso de los parámetros y funciones siguientes en Python:
epoch_size
Número de muestras de etiqueta (tensores a lo largo de un eje dinámico) en cada época. en epoch_size
CNTK es el número de muestras de etiqueta después de las cuales se realizan acciones adicionales específicas, incluidas las
- guardar un modelo de punto de control (el entrenamiento se puede reiniciar desde aquí)
- validación cruzada
- control de velocidad de aprendizaje
- minibatch-scaling
Tenga en cuenta que la definición del número de muestras de etiqueta es similar al número de muestras usadas para minibatch_size_in_samples. La definición de difiere de epoch_size
la definición de en el sentido de que epoch_size
es ejemplos de minibatch_size_in_samples
etiquetas, no muestras de entrada.
Por lo tanto, lo que es importante para los datos secuenciales, un ejemplo es un elemento individual de una secuencia.
Por lo tanto, CNTK epoch_size
no hace referencia a una serie de secuencias, sino al número de elementos de secuencia en las etiquetas de secuencia que constituyen el minibatch.
Igualmente importante, epoch_size
hace referencia a las muestras de etiqueta , no a las muestras de entrada y el número de etiquetas por secuencia no es necesariamente el número de muestras de entrada. Por ejemplo, es posible tener una etiqueta por secuencia y para cada secuencia tener muchas muestras (en cuyo caso epoch_size
actúa como el número de secuencias) y es posible tener una etiqueta por muestra en una secuencia, en cuyo caso epoch_size
actúa exactamente igual minibatch_size_in_samples
que en que cada muestra (no secuencia) se cuenta.
Para tamaños de conjunto de datos más pequeños, epoch_size
a menudo se establece igual al tamaño del conjunto de datos. En Python, puede especificar cntk.io.INFINITELY_REPEAT
para eso. Solo en Python, también puede establecerlo cntk.io.FULL_DATA_SWEEP
en , donde el procesamiento se detendrá después de un paso del tamaño de datos completo.
En el caso de conjuntos de datos de gran tamaño, es posible que desee guiar su elección por epoch_size
la creación de puntos de control. Por ejemplo, si desea perder como máximo 30 minutos de cálculo en caso de una interrupción del suministro eléctrico o un problema de red, querrá que se cree un punto de control cada 30 minutos (a partir del cual se puede reanudar el entrenamiento). Elija epoch_size
ser el número de muestras que tardan unos 30 minutos en calcularse.
minibatch_size_in_samples
Nota: Para los usuarios de BrainScript, el parámetro para el tamaño de minibatch es minibatchSize
; para los usuarios de Python, es minibatch_size_in_samples
.
CNTK tiene una definición muy específica del minibatch_size_in_samples
parámetro: denota el número de muestras entre las actualizaciones del modelo.
Aquí se define un ejemplo como un vector o tensor que fluye a través del sistema.
Por ejemplo, en una tarea de reconocimiento de imágenes, una imagen es una muestra.
El tamaño del minibatch para cada época se da en muestras (tensores a lo largo de un eje dinámico). El valor predeterminado es 256
. Puede usar valores diferentes para diferentes épocas; Por ejemplo, (en Python) significa usar un tamaño de minibatch de 128 para las dos primeras épocas y, a continuación, 128*2 + 1024
1024 para el resto.
Tenga en cuenta que "tamaño de minibatch" en CNTK significa el número de muestras procesadas entre las actualizaciones del modelo. Esta definición también se mantiene al paralelizar entre los trabajos (por ejemplo, para K
los trabajadores, el número de muestras que procesaría cada trabajo es minibatch_size_in_samples/K
).
En el caso de las entradas de longitud variable, minibatch_size_in_samples
hace referencia al número de elementos de estas secuencias, no al número de secuencias.
SGD intentará ajustar hasta tantas secuencias como sea posible en el minibatch que no supere las minibatch_size_in_samples
muestras totales.
Si se proporcionan varias entradas, los tensores se agregan al minibatch actual hasta que una de las entradas supera .minibatch_size_in_samples
Lo importante es que, para los datos secuenciales, un ejemplo es un elemento individual de una secuencia.
Por lo tanto, CNTK minibatch_size_in_samples
no hace referencia al número de secuencias en el minibatch, sino al número agregado de elementos o tokens de secuencia en las secuencias que constituyen el minibatch.
CNTK tiene compatibilidad nativa con secuencias de longitud variable, es decir, puede acomodar secuencias de longitudes muy variables dentro del mismo minibatch, sin necesidad de soluciones alternativas como la creación de depósitos.
Junto con la noción de CNTK de especificar la velocidad de aprendizaje por muestra (en lugar de un promedio de minibatch), cada elemento de secuencias de cualquier longitud contribuye igual al degradado, lo que conduce a una convergencia coherente.
(Muchos otros kits de herramientas definen el tamaño del minibatch para los datos secuenciales como el número de secuencias en el minibatch. Esto es problemático, especialmente si los degradados también se definen como promedios de minibatch en lugar de sumas de minibatch de CNTK, porque la contribución al degradado de cada token o paso de una secuencia sería inversamente proporcional a la longitud de la secuencia. CNTK enfoque evita esto).
Cuando se usan varias entradas, es posible que no todas las entradas tengan la misma longitud de secuencia.
Por ejemplo, en la clasificación de secuencia, la etiqueta de cada secuencia es un único token.
En este caso, la entrada con el mayor número de muestras controla el tamaño del minibatch. (Puede cambiar este comportamiento especificando defines_mb_size=True
para alguna entrada y, a continuación, el tamaño del minibatch se contará en función de las secuencias de esta entrada en particular. Cuando se especifican varias entradas, solo se puede establecer defines_mb_size
True
una sola en ).
A pesar de nuestra clara definición de minibatch_size_in_samples
ser el número de muestras entre las actualizaciones del modelo, hay dos ocasiones en las que debemos relajar la definición:
- datos secuenciales: por lo general, las secuencias de longitud variable no se suman exactamente al tamaño de minibatch solicitado. En este caso, tantas secuencias como sea posible se empaquetan en un minibatch sin superar el tamaño de minibatch solicitado (con una excepción: si la siguiente secuencia del corpus aleatorio supera la longitud del tamaño de minibatch, el tamaño del minibatch constará de esta secuencia).
- paralelismo de datos: aquí, el tamaño del minibatch es aproximado, ya que nuestro algoritmo de selección aleatoria basado en fragmentos no puede garantizar que cada trabajador reciba exactamente el mismo número de muestras.
Todas las consideraciones anteriores también se aplican a epoch_size
, pero epoch_size
tiene algunas diferencias, consulte anteriormente.
MinibatchSource.next_minibatch
El método MinibatchSource.next_minibatch() lee un minibatch que contiene datos para todos los flujos de entrada. Cuando se llame durante el entrenamiento, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map)
elegirá un subconjunto aleatorio de muestras del conjunto de k
datos de entrenamiento, donde k=minibatch_size_in_samples
.
La implementación garantiza que, cuando next_minibatch
se llama a N
los tiempos (donde N = number_of_training_samples/minibatch_size_in_samples
), todo el conjunto de datos de entrenamiento se cubre al final de las N
llamadas de next_minibatch
.
Esto también significa que, cuando next_minibatch
se llama a 2*N
veces, todo el conjunto de datos se cubre dos veces.
Información adicional:
- Cada ciclo a través de los datos tendrá un orden aleatorio diferente.
- Si duplica su tamaño de minibatch, un minibatch ahora contendrá exactamente las muestras que, antes, los dos minibaches consecutivos correspondientes habrían contenido (esto puede ser aproximado si tiene secuencias de longitud variable). Es decir, dos ejecuciones que solo difieren en el tamaño de minibatch procesan los datos en el mismo orden.
- Si interrumpe y reinicia desde el punto de control, obtendrá el mismo orden aleatorio que si no hubiera interrumpido el entrenamiento. Esto se implementa al basar el proceso de lectura y selección aleatoria en un eje de tiempo nominal, con este algoritmo simple:
- El entrenamiento continúa en un eje de tiempo infinito nominal. Si captura un minibatch de tamaño 256, el tiempo nominal progresa en 256.
- El corpus de entrenamiento se replica un número infinito de veces en este eje de tiempo. Si tiene
M
muestras, la primera réplica abarca el tiempo0..M-1
nominal ; el segundoM..2M-1
, etc. - Cada réplica se ordena aleatoriamente dentro, pero no a través de los límites de réplica. Es decir, una vez que haya procesado muestras precisamente, ha visto cada muestra exactamente
M
una vez. - La llamada
next_minibatch(K)
proporciona los siguientesK
ejemplos en esta escala de tiempo infinita reorganizada. Es lo mismo que llamar anext_minibatch(1)
horasK
. - Todo esto se hace diferir.
- Reiniciar desde el punto de control es tan sencillo como restablecer la hora nominal a la hora nominal en que se creó el punto de control.