Datos de cadena de análisis de red neuronal?

28

Entonces, estoy empezando a aprender cómo una red neuronal puede operar para reconocer patrones y categorizar entradas, y he visto cómo una red neuronal artificial puede analizar datos de imágenes y categorizar las imágenes ( demostración con convnetjs ), y la clave allí consiste en reducir la imagen y cada píxel estimula una neurona de entrada en la red.

Sin embargo, ¿estoy tratando de entender si esto se puede hacer con entradas de cadena? El caso de uso que tengo es un "motor de recomendaciones" para las películas que un usuario ha visto. Las películas tienen muchos datos de cadena (título, trama, etiquetas), y podría imaginarme "reducir el muestreo" del texto a unas pocas palabras clave que describan esa película, pero incluso si analizo las cinco palabras principales que describen esta película, yo ¿Crees que necesitaría neuronas de entrada para cada palabra en inglés para comparar un conjunto de películas? Podría limitar las neuronas de entrada solo a las palabras utilizadas en el set, pero ¿podría crecer / aprender agregando nuevas películas (el usuario ve una nueva película, con nuevas palabras)? ¿La mayoría de las bibliotecas que he visto no permiten agregar nuevas neuronas después de que el sistema ha sido entrenado?

¿Existe una forma estándar de asignar datos de cadena / palabra / carácter a entradas en una red neuronal? ¿O una red neuronal realmente no es la herramienta adecuada para el trabajo de analizar datos de cadena como este (qué es una mejor herramienta para la coincidencia de patrones en datos de cadena)?

Medianoche
fuente

Respuestas:

19

El uso de una red neuronal para la predicción de datos en lenguaje natural puede ser una tarea difícil, pero existen métodos probados y verdaderos para hacerlo posible.

En el campo Procesamiento del lenguaje natural (PNL), el texto a menudo se representa usando el modelo de bolsa de palabras. En otras palabras, tiene un vector de longitud n , donde n es el número de palabras en su vocabulario, y cada palabra corresponde a un elemento en el vector. Para convertir texto en datos numéricos, simplemente cuente el número de apariciones de cada palabra y coloque ese valor en el índice del vector que corresponde a la palabra. Wikipedia hace un excelente trabajo al describir este proceso de conversión. Debido a que la longitud del vector es fija, es difícil lidiar con nuevas palabras que no se asignan a un índice, pero hay formas de ayudar a mitigar este problema ( hashing de función de búsqueda ).

Este método de representación tiene muchas desventajas: no preserva la relación entre palabras adyacentes y da como resultado vectores muy dispersos. Mirar n-gramas ayuda a solucionar el problema de preservar las relaciones entre palabras, pero por ahora centrémonos en el segundo problema, la escasez.

Es difícil tratar directamente con estos vectores dispersos (muchas bibliotecas de álgebra lineal hacen un mal trabajo al manejar entradas dispersas), por lo que a menudo el siguiente paso es la reducción de la dimensionalidad. Para eso podemos referirnos al campo de modelado de temas : Técnicas como la asignación de Dirichlet latente (LDA) y el análisis semántico latente (LSA) permiten la compresión de estos vectores dispersos en vectores densos al representar un documento como una combinación de temas. Puede corregir el número de temas utilizados y, al hacerlo, corregir el tamaño del vector de salida producido por LDA o LSA. Este proceso de reducción de dimensionalidad reduce drásticamente el tamaño del vector de entrada al intentar perder una cantidad mínima de información.

Finalmente, después de todas estas conversiones, puede alimentar los resultados del proceso de modelado de temas en las entradas de su red neuronal.

Madison May
fuente
1
Avíseme si tiene más preguntas y haré todo lo posible para brindarle más detalles.
Madison May
¡Gracias, eso me da algunos términos geniales para seguir explorando!
MidnightLightning
Por cierto, puedo relacionarme con el "hashing de funciones" ya que parece muy similar a un filtro de floración , con el que estoy familiarizado al trabajar con código de criptomonedas. Me pregunto si es más efectivo tener una función hash que relacione una función de entrada con múltiples posiciones de índice (estilo de filtro de floración) en lugar de necesitar una segunda función hash para establecer el signo de un índice ...
MidnightLightning
6

Tanto las respuestas de @Emre como @Madison May hacen buenos puntos sobre el tema en cuestión. El problema es uno de representar su cadena como un vector de características para la entrada al NN.

Primero, el problema depende del tamaño de la cadena que desea procesar. Las cadenas largas que contienen tokens de mayo (generalmente palabras) a menudo se denominan documentos en esta configuración. Existen métodos separados para tratar con tokens / palabras individuales.

Hay varias formas de representar documentos. Muchos de ellos hacen la suposición de la bolsa de palabras . Los tipos más simples representan el documento como un vector de los recuentos de palabras, o frecuencia de término (tf). Para eliminar los efectos de la longitud del documento, por lo general, las personas prefieren normalizar por la cantidad de documentos en los que aparece un término, la frecuencia del documento ( tf-idf ).

Otro enfoque es el modelado de temas, que aprende una representación latente de menor dimensión de los datos. LDA y LSI / LSA son opciones típicas, pero es importante recordar que esto no está supervisado. La representación aprendida no será necesariamente ideal para cualquier aprendizaje supervisado que esté haciendo con su NN. Si desea modelar temas, también puede probar modelos de temas supervisados .

Para palabras individuales, puede usar word2vec , que aprovecha NN para incrustar palabras en un espacio de tamaño arbitrario. La similitud entre dos vectores de palabras en este espacio aprendido tiende a corresponder a la similitud semántica.

Un enfoque pionero más reciente es el de los vectores de párrafo , que primero aprende un modelo de palabra similar a word2vec, luego se basa en esa representación para aprender una representación distribuida de conjuntos de palabras (documentos de cualquier tamaño). Esto ha mostrado resultados de vanguardia en muchas aplicaciones.

Cuando se usan NN en PNL, las personas a menudo usan diferentes arquitecturas, como Redes Neuronales Recurrentes (como las redes de Memoria a Corto Plazo ). En algunos casos, las personas incluso han utilizado redes neuronales convolucionales en el texto.

jamesmf
fuente
Creo que word2Vec es realmente la respuesta más precisa a la pregunta. Hay un tutorial de Kaggle realmente agradable sobre cómo entrenar y usar uno: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner
Gracias, olvidé el enlace word2vec, agregaré uno (¡además del que
enumeras
3

Este no es un problema sobre las redes neuronales per se, sino sobre la representación de datos textuales en el aprendizaje automático. Puede representar las películas, el elenco y el tema como variables categóricas. La trama es más complicada; probablemente quieras un modelo de tema para eso, pero lo dejaría fuera hasta que te acostumbres a las cosas. Hace precisamente ese "muestreo descendente" textual que mencionaste.

Eche un vistazo a este tutorial para aprender a codificar variables categóricas para redes neuronales. ¡Y buena suerte!

Emre
fuente
Vale la pena señalar que esto no es explícitamente un problema en todo el aprendizaje automático, sino solo un problema cuando se trata de generar vectores de características, que no son ubicuos en el aprendizaje automático.
Slater Victoroff
¿Qué tipo de aprendizaje automático no utiliza funciones?
Emre
El bosque aleatorio es un buen ejemplo de algo para lo que no es un problema obtener un vector de características del tipo que se ve en las redes neuronales. Muchos métodos no supervisados ​​también funcionan en palabras crudas en lugar de vectores de características. Nota: No dije que hay métodos que no usan características, solo que hay métodos que no se basan en vectores estrictamente estructurados.
Slater Victoroff
No sé a qué te refieres con "estrictamente estructurado".
Emre
estrictamente estructurado es un vector 1d de unint8 en lugar de una lista que contiene un diccionario, una matriz de peso y una serie de cadenas
Slater Victoroff
0

He intentado las siguientes 2 formas para la implementación de prueba y prueba de redes neuronales con texto. El último funciona bastante bien, pero con limitaciones.

  1. Cree vocabulario usando word2vect o NLTK / tokens de palabras personalizados y asigne un índice a cada palabra. Es este índice el que representa la palabra como número.

    Desafíos:

    • Los índices deben "normalizarse" mediante el escalado de características.
    • Si la salida de la red neuronal tiene incluso una ligera variación, entonces la salida puede ser un índice de palabra inesperada (por ejemplo, si la salida esperada es 250; pero NN produce 249 o 251, entonces podría ser una salida cercana del contexto numérico; pero son índices de diferentes palabras). Aquí se puede aprovechar NN recurrente para generar el índice de salida.
    • Si se agregan nuevas palabras al vocabulario, entonces los índices de los tokens se deben volver a escalar. El modelo entrenado con valores previamente escalados puede volverse inválido y debe volverse a entrenar.
  2. Use la matriz de identidad, por ejemplo, para palabras "n", use la matriz "nx n" o (n-1 x n-1) donde cada fila y columna representa una palabra. Ponga "1" en la celda de intersección y "0" en los lugares de descanso. ( referencia )

    Desafíos:

    • Cada valor de entrada y salida es el vector "nx 1". Para un vocabulario de gran tamaño es un cálculo voluminoso y más lento.
    • Si se agregan nuevas palabras al vocabulario, entonces la matriz de identidad (es decir, el vector de palabras) se debe volver a calcular. El modelo entrenado con vectores previamente calculados puede volverse inválido y debe volverse a entrenar.
ak2205
fuente