Basado en el código de Andrej Karpathy https://github.com/karpathy/char-rnn y el artículo de Samy Bengio http://arxiv.org/abs/1506.03099
Hacer que el código pueda procesar los caracteres ingleses y chinos. Este es mi primer toque de Lua, por lo que el proceso de cadena parece una tontería, pero funciona bien.
También agrego una opción llamada 'Min_freq' porque el tamaño de vocabulario en chino es muy grande, lo que hace que el número de parámetros aumente mucho. Así que eliminar un personaje raro puede ayudar.
El artículo de Samy Bengio programó el muestreo para la predicción de la secuencia con redes neuronales recurrentes en NIPS15 propone un método de energía simple pero de poder para impulsar RNN.
En mi experimento, encuentro que ayuda mucho a evitar el sobreajuste y hacer que la pérdida de prueba sea más profunda. Solo uso la descomposición lineal.
Use -use_ss para encender o apagar el muestreo programado, el valor predeterminado está encendido. -start_ss es el inicio de datos reales, sugiero usar 1 porque nuestro modelo debe aprender datos sin ruido al principio. -min_ss también es muy importante ya que demasiado ruido dañará el rendimiento. Finalmente, -decay_ss es la tasa de descomposición lineal.
Agrego un script para convertir un archivo modelo entrenado por GPU a modelo de CPU. Puedes probarlo de la siguiente manera:
$ th convert.lua gpu_model cpu_modelSe agrega una demostración web para que otros prueben el modelo fácilmente, basado en sub/pub de Redis. Utilizo Redis porque no puedo encontrar un buen RPC o servidor web funcionan bien integrado con la antorcha. Debe notar que la demostración es asíncrata de Ajax. Para configurar la demostración en Ubuntu: instalar Redis y comenzarlo
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &Luego instale Flask y el complemento Redis:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-luaColocar su archivo modelo en en línea_model, renombrarlo como 'model.t7', el script de inicio del backend y fontend:
$ nohup th web_backend.lua &
$ nohup python web_server.py & Siga esto para configurar su experimento.
Este código implementa la red neuronal recurrente de múltiples capas (RNN, LSTM y Gru) para el entrenamiento/muestreo de los modelos de lenguaje a nivel de personaje. El modelo aprende a predecir la probabilidad del siguiente personaje en una secuencia. En otras palabras, la entrada es un solo archivo de texto y el modelo aprende a generar texto como este.
El contexto de esta base de código se describe en detalle en mi publicación de blog. La página del proyecto que tiene algunos consejos para algunos conjuntos de datos.
Este código se basó originalmente en la Clase de aprendizaje automático de la Universidad de Oxford, la práctica 6, que a su vez se basa en aprender a ejecutar el código de Wojciech Zaremba. Los trozos de este también se desarrollaron en colaboración con mi compañero de laboratorio Justin Johnson.
Este código está escrito en Lua y requiere antorcha. Además, debe instalar los paquetes nngraph y optim utilizando Luarocks que podrá hacer después de instalar la antorcha:
$ luarocks install nngraph
$ luarocks install optim Si desea utilizar la computación CUDA GPU, primero deberá instalar el kit de herramientas CUDA, entonces los paquetes cutorch y cunn :
$ luarocks install cutorch
$ luarocks install cunn Si desea utilizar la computación de GPU OpenCL, primero deberá instalar los paquetes cltorch y clnn , y luego usar la opción -opencl 1 durante el entrenamiento:
$ luarocks install cltorch
$ luarocks install clnn Todos los datos de entrada se almacenan dentro de los data/ directorio. Notará que hay un conjunto de datos de ejemplo incluido en el repositorio (en data/tinyshakespeare ) que consiste en un subconjunto de obras de Shakespeare. Proporciono algunos conjuntos de datos más en la página del proyecto.
Sus propios datos : si desea usar sus propios datos, cree un solo archivo input.txt y colóquelo en una carpeta en data/ . Por ejemplo, data/some_folder/input.txt . La primera vez que ejecuta el script de capacitación, escribirá dos archivos de conveniencia más en data/some_folder .
Tenga en cuenta que si sus datos son demasiado pequeños (1 MB ya se considera muy pequeño), el RNN no aprenderá de manera muy efectiva. Recuerde que tiene que aprender todo completamente desde cero.
Por el contrario, si sus datos son grandes (más de aproximadamente 2 MB), siéntase seguro de aumentar rnn_size y capacitar a un modelo más grande (vea los detalles de la capacitación a continuación). Funcionará significativamente mejor . Por ejemplo, con 6MB, puede subir fácilmente a rnn_size 300 o incluso más. El más grande que se ajusta a mi GPU y que he entrenado con este código es rnn_size 700 con num_layers 3 (2 es predeterminado).
Comience a entrenar el modelo con train.lua , por ejemplo:
$ th train.lua -data_dir data/some_folder -gpuid -1
La bandera -data_dir es más importante ya que especifica el conjunto de datos que se utilizará. Tenga en cuenta que en este ejemplo también estamos estableciendo gpuid en -1, lo que le dice al código que entrene usando CPU, de lo contrario, por defecto en GPU 0. Hay muchas otras banderas para varias opciones. Consulte $ th train.lua -help para configuraciones integrales. Aquí hay otro ejemplo:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
Mientras el modelo está entrenando, escribirá periódicamente archivos de punto de control en la carpeta cv . La frecuencia con la que se escriben estos puntos de control se controla con el número de iteraciones, como se especifica con la opción eval_val_every (por ejemplo, si esto es 1, entonces se escribe un punto de control cada iteración). El nombre de archivo de estos puntos de control contiene un número muy importante: la pérdida . Por ejemplo, un punto de control con nombre de archivo lm_lstm_epoch0.95_2.0681.t7 indica que en este punto el modelo estaba en la época 0.95 (es decir, casi ha realizado un pase completo sobre los datos de entrenamiento), y la pérdida de los datos de validación fue 2.0681. Este número es muy importante porque cuanto más bajo sea, mejor será el punto de control. Una vez que comience a generar datos (discutidos a continuación), querrá usar el punto de control del modelo que tenga la pérdida de validación más baja. Tenga en cuenta que este podría no ser necesariamente el último punto de control al final de la capacitación (debido al posible sobreajuste).
Otras cantidades importantes a tener en cuenta son batch_size (llamarlo B), seq_length (llamarlo S) y la configuración train_frac y val_frac . El tamaño del lote especifica cuántas flujos de datos se procesan en paralelo a la vez. La longitud de la secuencia especifica la longitud de cada fragmento, que también es el límite en el que se recortan los gradientes. Por ejemplo, si seq_length es 20, entonces la señal de gradiente nunca retrocortará más de 20 pasos de tiempo, y el modelo podría no encontrar dependencias más largas que esta longitud en número de caracteres. En tiempo de ejecución, su archivo de texto de entrada tiene n caracteres, estos primero se dividen en trozos de tamaño BXS. Estos trozos se asignan a tres divisiones: tren/val/prueba de acuerdo con la configuración frac . Si sus datos son pequeños, es posible que con la configuración predeterminada solo tenga muy pocos fragmentos en total (por ejemplo 100). Esto es malo: en estos casos, es posible que desee disminuir el tamaño del lote o la longitud de la secuencia.
También puede iniciar parámetros desde un punto de control previamente guardado utilizando init_from .
Podemos usar estos puntos de control para generar texto (discutido a continuación).
Dado un archivo de punto de control (como los escritos en cv ) podemos generar texto nuevo. Por ejemplo:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
Asegúrese de que si su punto de control fue entrenado con GPU, también se muestreó con GPU, o viceversa. De lo contrario, el código (actualmente) se quejará. Al igual que con el script del tren, consulte $ th sample.lua -help para opciones completas. Uno importante es (por ejemplo) -length 10000 que generaría 10,000 caracteres (predeterminado = 2000).
Temperatura . Un parámetro importante que desee jugar con mucho es -temperature , que toma un número en el rango [0, 1] (aviso 0 no incluido), predeterminado = 1. La temperatura está dividiendo las probabilidades de registro predichas antes del Softmax, por lo que la temperatura más baja hará que el modelo haga más probable, pero también más aburridas y conservadoras predicciones. Las temperaturas más altas hacen que el modelo tenga más oportunidades y aumente la diversidad de resultados, pero a un costo de más errores.
Cebado . También es posible preparar el modelo con algún texto inicial usando -primetext . Esto comienza el RNN con algunos caracteres codificados para calentarlo con algún contexto antes de que comience a generar texto.
¡Feliz muestreo!
Si es algo nuevo en el aprendizaje automático o las redes neuronales, puede necesitar un poco de experiencia para obtener buenos modelos. La cantidad más importante para realizar un seguimiento es la diferencia entre su pérdida de entrenamiento (impreso durante el entrenamiento) y la pérdida de validación (impresa de vez en cuando cuando el RNN se ejecuta en los datos de validación (por defecto cada 1000 iteraciones)). En particular:
Los dos parámetros más importantes que controlan el modelo son rnn_size y num_layers . Aconsejaría que siempre uses num_layers de cualquiera de los 2/3. El rnn_size se puede ajustar en función de la cantidad de datos que tiene. Las dos cantidades importantes para realizar un seguimiento de aquí son:
Estos dos deberían estar aproximadamente al mismo orden de magnitud. Es un poco difícil de contar. Aquí hay algunos ejemplos:
rnn_size sea más grande.La estrategia ganadora para obtener modelos muy buenos (si tiene el tiempo de cálculo) es siempre errar al hacer que la red sea más grande (tan grande como está dispuesto a esperar a que se calcule) y luego pruebe diferentes valores de abandono (entre 0,1). Cualquiera que sea el modelo que tenga el mejor rendimiento de validación (la pérdida, escrita en el nombre de archivo de punto de control, Low Is Good) es el que debe usar al final.
Es muy común en el aprendizaje profundo para ejecutar muchos modelos diferentes con muchas configuraciones de hiperparameter diferentes, y al final toma cualquier punto de control que dio el mejor rendimiento de validación.
Por cierto, el tamaño de sus divisiones de entrenamiento y validación también son parámetros. Asegúrese de tener una cantidad decente de datos en su conjunto de validación o de otra manera el rendimiento de validación será ruidoso y no muy informativo.
MIT