machine - lstm keras example
¿Cuándo reinicia Keras un estado LSTM? (5)
Al hacer algunas pruebas, llegué a la siguiente conclusión, que está de acuerdo con la documentación y la respuesta de Nassim:
Primero, no hay un solo estado en una capa, sino un estado por muestra en el lote.
Hay estados paralelos de
batch_size
en dicha capa.
Con estado = falso
En un caso
stateful=False
, todos los
estados se restablecen juntos después de cada lote
.
-
Un lote con
10 sequences
crearía10 states
, y los 10 estados se restablecen automáticamente después de procesarse. -
El próximo lote con
10 sequences
creará10 new states
, que también se restablecerán después de que se procese este lote
Si todas esas secuencias tienen
length (timesteps) = 7
, el resultado práctico de estos dos lotes es:
20 secuencias individuales, cada una con longitud 7
Ninguna de las secuencias está relacionada. Pero, por supuesto: los pesos (no los estados) serán únicos para la capa y representarán lo que la capa ha aprendido de todas las secuencias.
- Un estado es: ¿Dónde estoy ahora dentro de una secuencia? ¿Qué paso de tiempo es? ¿Cómo se comporta esta secuencia en particular desde su inicio hasta ahora?
- Un peso es: ¿Qué sé sobre el comportamiento general de todas las secuencias que he visto hasta ahora?
Stateful = True
En este caso, también existe el mismo número de estados paralelos, pero simplemente no se restablecerán en absoluto .
-
Un lote con
10 sequences
creará10 states
que permanecerán como están al final del lote. -
El siguiente lote con
10 sequences
(se requiere que sea 10, ya que el primero fue 10) reutilizará los mismos10 states
que se crearon antes.
El resultado práctico es: las 10 secuencias en el segundo lote simplemente continúan con las 10 secuencias del primer lote, como si no hubiera habido ninguna interrupción.
Si cada secuencia tiene
length (timesteps) = 7
, entonces el significado real es:
10 secuencias individuales, cada una con longitud 14
Cuando vea que alcanzó la longitud total de las secuencias, llamará a
model.reset_states()
, lo que significa que ya no continuará con las secuencias anteriores, ahora comenzará a alimentar nuevas secuencias.
Leí todo tipo de textos al respecto, y ninguno parece responder a esta pregunta tan básica. Siempre es ambiguo:
En una capa
stateful = False
LSTM, ¿reinicia los estados de keras después de:
- Cada secuencia; o
- ¿Cada lote?
Supongamos que tengo X_train en forma de (1000,20,1), lo que significa 1000 secuencias de 20 pasos de un solo valor. Si hago:
model.fit(X_train, y_train, batch_size=200, nb_epoch=15)
¿Restablecerá los estados para cada secuencia (restablece los estados 1000 veces)?
¿O restablecerá los estados para cada lote (restablece los estados 5 veces)?
Ampliando la respuesta de @ Nassim_Ben, es cierto que cada secuencia se considera independiente para cada instancia del lote. Sin embargo, debe tener en cuenta que el estado oculto de los RNN y la memoria de la celda se transmiten a la siguiente celda durante 20 pasos. El estado oculto y la memoria de la celda generalmente se establece en cero para la primera celda en las 20 celdas.
Después de la vigésima celda, y después de que el estado oculto (solo, no la memoria de la celda) se pasa a las capas por encima del RNN, el estado se restablece. Voy a suponer que se refieren a memoria celular y estado oculto aquí.
Entonces, sí, se restablece para las 1000 instancias, sin embargo, teniendo en cuenta que su
batch_size=200
, se restablece 5 veces, y cada lote se restablece después de que hayan terminado de pasar la información a través de esos 20 pasos.
Espero que hayas entendido esto.
Here''s un proyecto que hice donde tenía la misma pregunta. Preste especial atención a la celda 15 y su explicación en el blob después de la celda 11. Seguí agregando cartas porque de lo contrario el estado se restablecía.
En Keras hay dos modos para mantener los estados: 1) El modo predeterminado
(stateful = False)
donde el estado se restablece después de cada lote.
AFAIK el estado aún se mantendrá entre diferentes muestras dentro de un lote.
Entonces, para su estado de ejemplo, se restablecería 5 veces en cada época.
2) El modo con estado donde el estado nunca se restablece. Depende del usuario restablecer el estado antes de una nueva época, pero Keras no restablecerá el estado. En este modo, el estado se propaga de la muestra "i" de un lote a la muestra "i" del siguiente lote. En general, se recomienda restablecer el estado después de cada época, ya que el estado puede crecer demasiado y volverse inestable. Sin embargo, en mi experiencia con conjuntos de datos de pequeño tamaño (20,000-40,000 muestras) restablecer o no restablecer el estado después de una época no hace mucha diferencia en el resultado final. Para conjuntos de datos más grandes puede hacer la diferencia.
El modelo con estado será útil si tiene patrones que abarcan más de 100s de pasos de tiempo. De lo contrario, el modo predeterminado es suficiente. En mi experiencia, también es útil establecer el tamaño del lote aproximadamente equivalente al tamaño (pasos de tiempo) de los patrones en los datos.
La configuración con estado podría ser bastante difícil de entender al principio. Uno esperaría que el estado se transfiera entre la última muestra de un lote a la primera muestra del siguiente lote. Pero el estado en realidad se propaga a través de lotes entre las mismas muestras numeradas. Los autores tenían dos opciones y eligieron la última. Lea sobre esto here . Consulte también la sección relevante de preguntas frecuentes de Keras sobre RNN con estado
En el documento del código RNN puedes leer esto:
Nota sobre el uso de la capacidad de estado en RNN:
Puede establecer que las capas RNN sean ''con estado'', lo que significa que los estados calculados para las muestras en un lote se reutilizarán como estados iniciales para las muestras en el siguiente lote. Esto supone un mapeo uno a uno entre muestras en diferentes lotes sucesivos.
Sé que esto no responde directamente a su pregunta, pero para mí confirma lo que estaba pensando: cuando un LSTM no tiene estado, el estado se restablece después de cada muestra. No funcionan por lotes, la idea en un lote es que cada muestra sea independiente entre sí.
Entonces tiene 1000 reinicio del estado para su ejemplo.
Todo el mundo parece hacerlo demasiado confuso. Keras LSTM restablece el estado después de cada lote.
Aquí hay un buen blog: https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/
Lea
LSTM State Within A Batch
and
Stateful LSTM for a One-Char to One-Char Mapping
temas de
Stateful LSTM for a One-Char to One-Char Mapping
en este blog.
Muestra por qué debe restablecerlo solo después del lote.