5 votos

¿Debo escalar y normalizar los datos al entrenar el LSTM basado en caracteres?

Estoy trabajando en un clasificador de secuencias que clasifica secuencias de caracteres. Hay 100 clases. La solución simple que hice es asignar un valor int diferente a cada carácter y luego entrenar el LSTM con eso. Así, por ejemplo, 'a' se convierte en '1', 'b' se convierte en '2', etc. Funciona muy bien hasta ahora en mi conjunto ficticio, pero me pregunto si hay algún beneficio en la escala de esos valores al intervalo [0, 1] y la normalización?

2voto

Loren Pechtel Puntos 2212

Para responder directamente a su pregunta: no no debe escalar sus valores de entrada, que son de naturaleza categórica. Utilizará algo como ' '=1, 'a'=2, 'b'=3, ... como entrada, y en algún momento esto se convertirá en una codificación de un solo golpe - ya sea por usted o por el software que está utilizando. (Dependiendo del software que estés utilizando, el 0 puede tener un significado especial, por lo que empiezo con el 1).

Esta codificación de un solo punto es muy escasa por definición. Una incrustación ( https://en.wikipedia.org/wiki/Word_embedding ) se utiliza habitualmente para convertir codificaciones dispersas y discretas en codificaciones densas y continuas en las que las relaciones entre el vocabulario se reflejan en relaciones espaciales. Una incrustación será de menor dimensión que el vocabulario, lo que la hace más densa. Estas incrustaciones han sido históricamente para las palabras, pero la misma idea se aplica a cualquier entrada, que en su caso son los caracteres individuales.

Personalmente, no creo que sea necesario incrustar sus docenas de cartas en cientos de dimensiones. Las codificaciones Word2vec de millones de palabras suelen tener sólo 300 dimensiones, y hay una lote de información en las palabras a codificar. (Incrustar en una dimensión superior a la de su codificación de un solo punto sería contraproducente, por lo que veo).

EDIT: Mi contexto -- dado como ejemplo, abajo -- es un modelo secuencia-a-secuencia que tiene una salida para cada entrada. Algunos modelos secuencia a secuencia, como la traducción de idiomas, pueden dar una salida para varias entradas o varias salidas para una entrada, y utilizan una arquitectura codificador-decodificador.

EDIT: Resulta que la salida del codificador también se llama incrustación. No en el sentido de Word2Vec de elementos de entrada (palabras o caracteres), sino en el sentido de resumir toda la entrada. En este caso de uso, el "embedding" debe ser grande, ya que es la única pieza de información que pasa del codificador al decodificador y tiene que resumir bien la entrada. Es todo lo que el descodificador tiene para trabajar.

EDIT: Creo que aquí es donde @Sycorax y yo hemos estado mal comunicados.

Las RNN tendrán cientos o miles de unidades LSTM (o GRU, etc.) en una capa, pero no hay que confundir eso con la dimensionalidad de la entrada, es decir, la incrustación de palabras/caracteres. Estas capas recurrentes son muy amplias porque hay muchas cosas que recordar y eso es lo que hacen las LSTM. Si no tienes suficientes LSTMs (o GRUs, etc) en una capa para recordar lo que necesitas recordar mientras te mueves por el texto, tu modelo no lo hará bien.

Ver el excelente página recomendada por @Sycorax ( http://karpathy.github.io/2015/05/21/rnn-effectiveness ) para obtener algunas ideas interesantes sobre lo que una RNN podría estar tratando de recordar. La cantidad de cosas que el modelo tiene que "tener en cuenta" en cualquier momento es, en cierto modo, la contrapartida de utilizar RNN a nivel de caracteres: el vocabulario es mucho más pequeño y de tamaño fijo, pero el modelo tiene muchas más cosas que tiene que tener implícitamente en cuenta.

Como ejemplo, estoy trabajando en una RNN basada en caracteres, secuencia a secuencia, utilizando nodos LSTM. Sólo dispongo de varios cientos de documentos de entrenamiento, lo que es una desventaja. Utilicé la herramienta de Keras embedding capa para incrustar mi vocabulario de 90 caracteres en 2 dimensiones. (Así, una matriz de 90 caracteres de ancho, escasa y de un solo punto se convierte en una matriz de 2 dimensiones, densa y de valor continuo. Una fila por carácter).

Cuando trazo cada carácter por su incrustación, las dos dimensiones están muy correlacionadas, lo que creo que significa que no hay una información completa de dos dimensiones en mis datos/tarea. Puedo ver que los números se han agrupado en un extremo del gráfico, lo cual es agradable, pero otros signos de puntuación y letras están mezclados a lo largo de la diagonal. (Quizá nunca se agrupen, según mi tarea, o quizá las agrupaciones no tengan sentido para los humanos, pero mi teoría actual es que no hay mucha información -que resuelva mi tarea- en los distintos signos de puntuación o letras).

Es sólo una prueba anecdótica, pero pensé que lo diría.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X