Requisitos

Este código está escrito en Lua y requiere Torch.

Este código está escrito en el lenguaje de programación Lua y requiere la biblioteca Torch. Si está utilizando el sistema operativo Ubuntu, puede instalar Torch en su directorio de inicio siguiendo estos pasos:

  1. Abra una terminal.
  2. Ejecute el siguiente comando para descargar el último paquete de Torch:
wget https://github.com/torch/distro/archive/master.zip
  1. Extraiga el archivo descargado:
unzip master.zip
  1. Cambie a la carpeta Torch recién extraída:
cd torch-master
  1. Instale Torch:
./install.sh

Una vez que Torch esté instalado, puede ejecutar el código char-rnn simplemente escribiendo el siguiente comando en una terminal:

th train.lua

El código char-rnn tardará algún tiempo en entrenarse. Una vez que se haya entrenado, puede generar texto ejecutando el siguiente comando:

th sample.lua

¡Espero que esto sea útil!

Si está en Ubuntu, instalar Torch en su directorio de inicio puede verse así:

$ curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
$ git clone https://github.com/torch/distro.git ~/torch --recursive
$ cd ~/torch; 
$ ./install.sh      # and enter "yes" at the end to modify your bashrc
$ source ~/.bashrc

Consulte la documentación de instalación de Torch para obtener más detalles. Después de instalar Torch, necesitamos obtener algunos paquetes más usando LuaRocks (que ya venía con la instalación de Torch). En particular:

$ luarocks install nngraph 
$ luarocks install optim
$ luarocks install nn

Si desea entrenar en una GPU NVIDIA usando CUDA (esto puede ser aproximadamente 15 veces más rápido), por supuesto, necesitará la GPU y tendrá que instalar el kit de herramientas CUDA. Luego obtenga los paquetes y:cutorchcunn

$ luarocks install cutorch
$ luarocks install cunn

Si desea utilizar la GPU OpenCL en su lugar (por ejemplo, tarjetas ATI), deberá instalar los paquetes y luego usar la opción durante el entrenamiento (problemas de cltorch):cltorchclnn-opencl 1

$ luarocks install cltorch
$ luarocks install clnn

Uso

Datos

Todos los datos de entrada se almacenan dentro del directorio. Notará que hay un conjunto de datos de ejemplo incluido en el repositorio (en la carpeta) que consiste en un subconjunto de obras de Shakespeare. Estoy proporcionando algunos conjuntos de datos más en esta página.data/data/tinyshakespeare

Sus propios datos: Si desea utilizar sus propios datos, cree un solo archivo y colóquelo en una carpeta del directorio. Por ejemplo. La primera vez que ejecute el script de entrenamiento, realizará un preprocesamiento y escribirá dos archivos de caché de conveniencia más en .input.txtdata/data/some_folder/input.txtdata/some_folder

Tamaños de conjuntos de datos: 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. Recuerda 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 y entrenar un modelo más grande (consulte los detalles de la capacitación a continuación). Funcionará significativamente mejor. Por ejemplo, con 6MB puede llegar fácilmente hasta 300 o incluso más. El más grande que cabe en mi GPU y que he entrenado con este código es 700 con 3 (2 es el predeterminado).rnn_sizernn_sizernn_sizenum_layers

Adiestramiento

Comience a entrenar el modelo con . Como comprobación de cordura, para ejecutar el conjunto de datos de ejemplo incluido, simplemente intente:train.lua

$ th train.lua -gpuid -1

Tenga en cuenta que aquí estamos configurando la bandera en -1, que le dice al código que se entrene usando la CPU, de lo contrario, el valor predeterminado es GPU 0. Hay muchas otras banderas para varias opciones. Consulte para configuraciones completas. Aquí hay otro ejemplo que entrena una red más grande y también muestra cómo puede ejecutar su propio conjunto de datos personalizado (esto ya supone que existe):gpuid$ th train.lua -helpdata/some_folder/input.txt

$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5

Checkpoints. Mientras el modelo está entrenando, escribirá periódicamente archivos de punto de control en la carpeta. 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 (por ejemplo, si esto es 1, entonces se escribe un punto de control en 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 indica que en este punto el modelo estaba en la época 0.95 (es decir, casi ha hecho una pasada completa sobre los datos de entrenamiento), y la pérdida en los datos de validación fue 2.0681. Este número es muy importante porque cuanto más bajo sea, mejor funcionará el punto de control. Una vez que comience a generar datos (que se analizan a continuación), querrá utilizar el punto de control del modelo que informa de 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 del entrenamiento (debido a un posible sobreajuste).cveval_val_everylm_lstm_epoch0.95_2.0681.t7

Otras cantidades importantes a tener en cuenta son (llámalo B), (llámalo S) y la configuración y. El tamaño del lote especifica cuántas secuencias de datos se procesan en paralelo a la vez. La longitud de la secuencia especifica la longitud de cada flujo, que también es el límite en el que los gradientes pueden propagarse hacia atrás en el tiempo. Por ejemplo, si es 20, la señal de degradado nunca se propagará más de 20 pasos de tiempo, y es posible que el modelo no encuentre dependencias superiores a esta longitud en el número de caracteres. Por lo tanto, si tiene un conjunto de datos muy difícil donde hay muchas dependencias a largo plazo, querrá aumentar esta configuración. Ahora, si en tiempo de ejecución su archivo de texto de entrada tiene N caracteres, estos primero se dividen en trozos de tamaño. Estos trozos se asignan en tres divisiones: train/val/test de acuerdo con la configuración. Por defecto es 0.95 y es 0.05, lo que significa que el 95% de nuestros fragmentos de datos se entrenarán y el 5% de los fragmentos se utilizarán para estimar la pérdida de validación (y, por lo tanto, la generalización). 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.batch_sizeseq_lengthtrain_fracval_fracseq_lengthBxSfractrain_fracval_frac

Tenga en cuenta que también puede inicializar parámetros desde un punto de control guardado previamente mediante .init_from

Muestreo

Dado un archivo de punto de control (como los escritos en ) podemos generar nuevo texto. Por ejemplo:cv

$ th sample.lua cv/some_checkpoint.t7 -gpuid -1

Asegúrese de que si su punto de control se entrenó con GPU, también se muestree con GPU, o viceversa. De lo contrario, el código (actualmente) se quejará. Al igual que con el script de tren, consulte para ver las opciones completas. Uno importante es (por ejemplo) que generaría 10.000 caracteres (por defecto = 2000).$ th sample.lua -help-length 10000

Temperatura. Un parámetro importante con el que puede jugar es , que toma un número en el rango (0, 1] (0 no incluido), predeterminado = 1. La temperatura está dividiendo las probabilidades logarítmicas predichas antes del Softmax, por lo que una temperatura más baja hará que el modelo haga predicciones más probables, pero también más aburridas y conservadoras. Las temperaturas más altas hacen que el modelo se arriesgue más y aumente la diversidad de resultados, pero a costa de más errores.-temperature

Imprimación. También es posible preparar el modelo con algún texto inicial usando . Esto inicia el RNN con algunos caracteres codificados para calentarlo con un poco de contexto antes de que comience a generar texto. Por ejemplo, un texto primo divertido podría ser .-primetext-primetext "the meaning of life is "

Entrenamiento con GPU pero muestreo en CPU. En este momento, la solución es usar el script para convertir el punto de control de su GPU en un punto de control de CPU. En un futuro próximo no tendrás que hacer esto explícitamente. P. ej..:convert_gpu_cpu_checkpoint.lua

$ th convert_gpu_cpu_checkpoint.lua cv/lm_lstm_epoch30.00_1.3950.t7

creará un nuevo archivo que puede utilizar con el script de ejemplo y con el modo CPU.cv/lm_lstm_epoch30.00_1.3950.t7_cpu.t7-gpuid -1

¡Feliz muestreo!

Consejos y trucos

Supervisión de la pérdida de validación frente a la pérdida de formación

Si eres algo nuevo en el aprendizaje automático o las redes neuronales, puede requerir 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 (impresa 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 (de forma predeterminada cada 1000 iteraciones)). En particular:

  • Si su pérdida de entrenamiento es mucho menor que la pérdida de validación, esto significa que la red podría estar sobreadaptada. Las soluciones a esto son disminuir el tamaño de su red o aumentar la deserción. Por ejemplo, podría intentar la caída de 0.5 y así sucesivamente.
  • Si su pérdida de entrenamiento / validación es aproximadamente igual, entonces su modelo no se ajusta bien. Aumente el tamaño de su modelo (ya sea el número de capas o el número bruto de neuronas por capa)

Número aproximado de parámetros

Los dos parámetros más importantes que controlan el modelo son y . Le aconsejaría que siempre use cualquiera de los 2/3. Se puede ajustar en función de la cantidad de datos que tenga. Las dos cantidades importantes a tener en cuenta aquí son:rnn_sizenum_layersnum_layersrnn_size

  • El número de parámetros del modelo. Esto se imprime cuando comienzas a entrenar.
  • El tamaño del conjunto de datos. El archivo de 1 MB tiene aproximadamente 1 millón de caracteres.

Estos dos deben ser aproximadamente del mismo orden de magnitud. Es un poco difícil de decir. Estos son algunos ejemplos:

  • Tengo un conjunto de datos de 100 MB y estoy usando la configuración de parámetros predeterminada (que actualmente imprime 150 KB de parámetros). El tamaño de mis datos es significativamente mayor (100 mil >> 0.15 mil), por lo que espero que sea muy deficiente. Estoy pensando que puedo permitirme cómodamente hacer más grande.rnn_size
  • Tengo un conjunto de datos de 10 MB y ejecuto un modelo de 10 millones de parámetros. Estoy un poco nervioso y estoy monitoreando cuidadosamente mi pérdida de validación. Si es más grande que mi pérdida de entrenamiento, entonces es posible que desee intentar aumentar un poco la deserción y ver si eso elimina la pérdida de validación.

Mejor estrategia de modelos

La estrategia ganadora para obtener modelos muy buenos (si tiene el tiempo de cómputo) es errar siempre al hacer la red más grande (tan grande como esté dispuesto a esperar a que se calcule) y luego probar 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 del archivo del punto de control, bajo es bueno) es el que debe usar al final.

Es muy común en el aprendizaje profundo ejecutar muchos modelos diferentes con muchas configuraciones de hiperparámetros diferentes y, al final, tomar cualquier punto de control que le dé 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 lo contrario, el rendimiento de validación será ruidoso y no muy informativo.

Verificado por MonsterInsights