implementando un clasificador de perceptron

Hola, soy bastante nuevo en Python y en la PNL. Necesito implementar un clasificador de perceptron. Busqué en algunos sitios web pero no encontré suficiente información. Por ahora tengo varios documentos que agrupé según la categoría (deportes, entretenimiento, etc.). También tengo una lista de las palabras más utilizadas en estos documentos junto con sus frecuencias. En un sitio web en particular se declaró que debo tener algún tipo de función de decisión que acepte los argumentos x y w. X aparentemente es algún tipo de vector (no sé qué es w). Pero no sé cómo usar la información que tengo para construir el algoritmo de percepción y cómo usarla para clasificar mis documentos. ¿Tienes algunas ideas? Gracias 🙂

Cómo se ve un perceptrón

Desde el exterior, un perceptrón es una función que toma n argumentos (es decir, un vector n dimensional) y produce m salidas (es decir, un vector m -dimensional).

En el interior, un perceptrón consiste en capas de neuronas , de manera que cada neurona en una capa recibe información de todas las neuronas de la capa anterior y usa esa entrada para calcular una sola salida. La primera capa consiste en n neuronas y recibe la entrada. La última capa consiste en m neuronas y mantiene la salida después de que el perceptrón haya terminado de procesar la entrada.

Cómo se calcula la salida a partir de la entrada

Cada conexión de una neurona i a una neurona j tiene un peso w(i,j) (explicaré más adelante de dónde provienen). La total input de una neurona p de la segunda capa es la sum de la salida ponderada de las neuronas de la primera capa. Asi que

 total_input(p) = Σ(output(k) * w(k,p)) 

donde k recorre todas las neuronas de la primera capa. La activación de una neurona se calcula a partir de la entrada total de la neurona aplicando una función de activación . Una función de activación de uso frecuente es la función Fermi, por lo que

 activation(p) = 1/(1-exp(-total_input(p))). 

La salida de una neurona se calcula a partir de la activación de la neurona aplicando una output function . Una función de salida de uso frecuente es la identidad f(x) = x (y, de hecho, algunos autores ven la función de salida como parte de la función de activación). Solo asumiré que

 output(p) = activation(p) 

Cuando se calcula la salida de todas las neuronas de la segunda capa, use esa salida para calcular la salida de la tercera capa. Iterar hasta llegar a la capa de salida.

De donde vienen los pesos

Al principio los pesos son elegidos al azar. Luego seleccionas algunos ejemplos (de los cuales conoces la salida deseada). Alimente cada ejemplo al perceptrón y calcule el error , es decir, a qué distancia de la salida deseada está la salida real. Utilice ese error para actualizar los pesos. Uno de los algoritmos más rápidos para calcular los nuevos pesos es la propagación resistente .

Cómo construir un Perceptrón.

Algunas preguntas que necesita abordar son

  1. ¿Cuáles son las características relevantes de los documentos y cómo pueden codificarse en un vector n -dimansional?
  2. ¿Qué ejemplos se deben elegir para ajustar los pesos?
  3. ¿Cómo debe interpretarse la salida para clasificar un documento? Ejemplo: una salida única que produce la clase más probable frente a un vector que asigna probabilidades a cada clase.
  4. ¿Cuántas capas ocultas se necesitan y qué tan grandes deben ser? Recomiendo comenzar con una capa oculta con n neuronas.

Los puntos primero y segundo son muy críticos para la calidad del clasificador. El perceptrón puede clasificar los ejemplos correctamente pero fallar en nuevos documentos. Probablemente tendrás que experimentar. Para determinar la calidad del clasificador, elija dos conjuntos de ejemplos; Uno para entrenamiento, otro para validación. Desafortunadamente, no puedo darte consejos más detallados para responder estas preguntas debido a la falta de experiencia práctica.

Creo que tratar de resolver un problema de PNL con una neural network cuando no estás familiarizado con cualquiera de ellos puede ser un paso demasiado lejos. Que lo hagas en un nuevo idioma es la menor de tus preocupaciones.

Lo vincularé a las diapositivas de mi módulo de Computación Neural que se enseñan en mi universidad. Querrá las diapositivas de la sesión 1 y la sesión 2 en la semana 2. Justo en la parte inferior de la página hay un enlace sobre cómo implementar una neural network en C. Con algunas modificaciones, debería poder portarlo a Python. Debe tener en cuenta que detalla cómo implementar un perceptrón multicapa. Solo necesitas implementar un perceptrón de una sola capa, así que ignora todo lo que habla de capas ocultas.

Una explicación rápida de x y w . Tanto x como w son vectores. x es el vector de entrada x contiene frecuencias normalizadas para cada palabra que le preocupa. w contiene pesos para cada palabra que le interesa. El perceptrón funciona al multiplicar la frecuencia de entrada de cada palabra por su peso respectivo y resumirlas. Pasa el resultado a una función (típicamente una función sigmoide) que convierte el resultado en un valor entre 0 y 1. 1 significa que el perceptrón es positivo de que las entradas son una instancia de la clase que representa y 0 significa que está seguro de que Las entradas realmente no son un ejemplo de su clase.

Con la PNL, normalmente se aprende primero el modelo de bolsa de palabras, antes de pasar a otros modelos más complejos. Con una neural network, con suerte, aprenderá su propio modelo. El problema con esto es que la neural network no le dará una gran comprensión de la PNL, aparte de que los documentos se pueden clasificar por las palabras que contienen, y que generalmente la cantidad y el tipo de palabras en un documento contienen la mayoría de la información que usted contiene. Necesidad de clasificar un documento: el contexto y la gramática no agregan muchos detalles adicionales.

De todos modos, espero que le brinde un mejor lugar para comenzar su proyecto. Si todavía estás atrapado en una parte en particular, vuelve a preguntar y haré lo posible por ayudarte.

Debería echar un vistazo a este documento de encuesta sobre clasificación de texto de Frabizio Sebastiani. Te dice todas las mejores maneras de hacer clasificación de texto.

Ahora, no voy a molestarte para que lo leas todo, pero hay una mesa cerca del final, en la que compara cómo muchas técnicas de diferentes personas se combinan en un montón de cuerpos de prueba diferentes. Encuéntrelo, elija el mejor (el mejor de percepción, si su asignación es específicamente para aprender a hacer esto con el perceptrón), y lea el documento que cita que describe ese método en detalle.

Ahora sabes cómo construir un buen clasificador de texto de actualidad.

Convertir el algoritmo que Oswald te dio (y que publicaste en tu otra pregunta ) en un código es una pequeña cuestión de progtwigción (TM). Y si encuentra términos desconocidos como TF-IDF mientras está trabajando, pídale a su maestro que lo ayude explicando esos términos.

Perceptrones MultiLayer (una architecture NeuralNet específica para el problema de clasificación general). Ahora disponible para Python de la gente de GraphLab:

https://dato.com/products/create/docs/generated/graphlab.deeplearning.MultiLayerPerceptrons.html#graphlab.deeplearning.MultiLayerPerceptrons

Tuve la oportunidad de implementar algo similar el otro día. Hice un código para reconocer el texto en inglés frente al no inglés. No había hecho inteligencia artificial o estadísticas en muchos años, así que fue un bash de escopeta.

Mi código está aquí (no quiero inflar la publicación): http://cnippit.com/content/perceptron-statisticically-recognizing-english

Entradas:

  • Tomo un archivo de texto, lo divido en tres gramos (por ejemplo, “abcdef” => [“abc”, “bcd”, “cde”, “def”])
  • Calculo las frecuencias relativas de cada uno, y las alimento como entradas al perceptrón (por lo tanto, hay 26 ^ 3 entradas)

A pesar de no saber realmente lo que estaba haciendo, parece funcionar bastante bien. Sin embargo, el éxito depende en gran medida de los datos de entrenamiento. Estaba obteniendo malos resultados hasta que lo entrené en más texto en francés / español / alemán, etc.

Sin embargo, es un ejemplo muy pequeño, con muchas “conjeturas afortunadas” en los valores (por ejemplo, pesos iniciales, sesgo, umbral, etc.).

Múltiples clases: si tiene varias clases entre las que desea distinguir (es decir, no es tan simple como “es A o NOT-A”), entonces un enfoque es utilizar un perceptrón para cada clase. P.ej. Uno para el deporte, otro para las noticias, etc.

Entrene el deporte-perceptrón en datos agrupados como deporte o NO-deporte. Similar para noticias o No-noticias, etc.

Cuando clasificas datos nuevos, pasas tu entrada a todos los perceptrones, y cualquiera que sea verdadero (o “dispara”), esa es la clase a la que pertenecen los datos.

Usé este enfoque en la universidad, donde usamos un conjunto de perceptrones para reconocer caracteres escritos a mano. Es simple y funcionó con bastante eficacia (> 98% de precisión si recuerdo bien).