Skip to content

Latest commit

 

History

History
438 lines (292 loc) · 16 KB

chapter4.md

File metadata and controls

438 lines (292 loc) · 16 KB
title description prev next type id
Capítulo 4: Entrenando un modelo de red neuronal
En este capítulo aprenderás a actualizar los modelos estadísticos de spaCy para personalizarlos para tu caso - por ejemplo, para predecir un nuevo tipo de entidad en comentarios en internet. Entrenarás propio modelo desde cero y entenderás lo esencial de cómo funciona el entrenamiento, junto con consejos y trucos para hacer que tus proyectos de NLP sean más exitosos.
/chapter3
chapter
4

Para entrenar un modelo, generalmente necesitas datos de entrenamiento y datos de evaluación. ¿Para qué se utlizan los datos de evaluación?

Durante el entrenamiento, el modelo solo se actualizará con los datos de entrenamiento. Los datos de evaluación se usan para evaluar el modelo al comparar sus predicciones sobre ejemplos que no han sido vistos contra las anotaciones correctas. Esto se refleja en un puntaje de presición.

Los datos de desarrollo se usan para evaluar el modelo y comparar sus predicciones sobre ejemplos antes no vistos contra las anotaciones correctas. Esto se refleja en el puntaje de presición.

The development data is used to evaluate the model by comparing its predictions on unseen examples to the correct annotations. This is then reflected in the accuracy score.

El Matcher basado en reglas de spaCy es una manera excelente de crear datos de entrenamiento rápidamente para modelos de entidades nombradas. Una lista de frases está disponible en la variable TEXTS. Puedes imprimirla en pantalla para inspeccionarla. Queremos encontrar todas las menciones de los diferentes modelos de zapatillas adidas, así que creamos datos de entrenamiento para enseñarle al modelo a reconocerlas como "ROPA".

  • Escribe un patrón para dos tokens que en minúsculas encuentran "adidas" y "zx"
  • Escribe un patrón para dos tokens: un token que en minúsculas encuentra "adidas" y un dígito.
  • Para encontrar la forma en minúsculas de un token puedes usar el atributo "LOWER". Por ejemplo: {"LOWER": "apple"}.
  • Para encontrar un token con un dígito puedes usar el flag "IS_DIGIT". Por ejemplo: {"IS_DIGIT": True}.

Después de crear los datos para nuestro corpus, necesitamos guardar el resultado a un archivo .spacy. El código del ejemplo anterior está disponible.

  • Crea un objeto DocBin con la lista de docs.
  • Guarda el DocBin a un archivo llamado train.spacy.
  • Puedes inicializar el DocBin con una lista de docs al pasarlos como keyword arguments docs.
  • El método to_disk de DocBin toma un solo argumento: la ruta del archivo en el que se van a guardar los datos binarios. Asegúrate de usar la extensión de archivo .spacy.

El archivo config.cfg es la única "fuente de verdad" para entrenar un pipeline con spaCy. ¿Cuál de las siguientes respuestas acerca del archivo config es incorrecta?

El archivo de configuración incluye todos los ajustes para el proceso de entrenamiento, incluyendo los hiperparámetros.

Debido a que config incluye todos los ajustes y no hay ajustes por defecto escondidos, puede ayudar a hacer tus experimentos más replicables y otras personas podrán volver a correr tus experimentos con exactamente los mismos ajustes.

El archivo config incluye todos los ajustes relacionados con el entrenamiento y con la configuración del pipeline, pero no lo guarda en un paquete. Para crear un paquete instalable de Python, puedes usar el comando spacy package.

El bloque de [components] del archivo config incluye todos los componentes del pipeline y sus ajustes, incluyendo el las implementaciones del modelo utilizado.

El comando init config auto-genera un archivo config para entrenamiento con los ajustes por defecto. Nosotros queremos entrenar un named entity recognizer, así que vamos a genera un archivo config para un componente de pipeline de tipo ner. Debidlo a que estamos ejecutando el comando desde un entorno de Jupyter en este curso, vamos a utilizar el prefijo !. Si ejecutas el comando en tu terminal local, puedes omitir el prefijo.

Parte 1

  • Usa el comando init config de spaCy para auto-generar la configuración de un pipeline en español.
  • Guarda la configuración a un archivo config.cfg.
  • Usa el argumento --pipeline para especificar un componente de pipeline tipo ner.
  • El argumento --lang define la clase del lenguahe, p. ej. es para español.

Parte 2

¡Echemos un vistazo a la configuración que spaCy acaba de generar! Puedes correr el comando siguiente para imprimir el archivo config a la terminal e inspeccionarlo.

¡Utilicemos el nuevo archivo config que generamos en el ejercicio anterior así como el corpus que creamos para entrenar un named entity recognizer!

El comando train te permite entrenar un modelo utilizando un archivo "config". Un archivo config_gadget.cfg ya está listo en el directorio exercises/es, así como el archivo train_gadget.spacy que contiene ejemplos de entrenamiento y un archivo llamado dev_gadget.spacy que contiene los datos de evaluación. Debido a que estamos ejecutando el comando en un entorno de Jupyter en este curso, usaremos el prefijo !. Si planeas correr el comando en tu terminal local, puedes omitir este prefijo.

  • Invoca el comando train con el archivo exercises/es/config_gadget.cfg.
  • Guarda el pipeline entrenado en el directorio de nombre output.
  • Pasa también las rutas de archivo exercises/es/train_gadget.spacy y exercises/es/dev_gadget.spacy.
  • El primer argumento del comando spacy train command es la ruta del archivo config.

¡Miremos cómo se desempeña el modelo con datos que no ha visto antes! Para acelerar las cosas ya corrimos un modelo entrenado para el label "GADGET" sobre unos textos. Aquí tenemos algunos de los resultados:

Texto Entidades
Apple está ralentizando el iPhone 8 y el iPhone X - cómo pararlo (iPhone 8, iPhone X)
Finalmente entiendo para qué es el 'notch' del iPhone X 'notch' (iPhone X,)
Todo lo que necesitas saber sobre el Samsung Galaxy S9 (Samsung Galaxy,)
¿Quieres comparar modelos de iPad? Aquí comparamos los modelos del 2018 (iPad,)
El iPhone 8 y el iPhone 8 Plus son smartphones diseñados, desarrollados y vendidos por Apple (iPhone 8, iPhone 8)
cuál es el ipad más barato, especialmente el ipad pro??? (ipad, ipad)
Samsung Galaxy son una serie de aparatos electrónicos móviles diseñados, desarrollados y vendidos por Samsung Electronics (Samsung Galaxy,)

De todas las entidades en los textos, ¿cuántas tuvo correctas el modelo? ¡Ten en cuenta que los spans de entidades incompletos cuentan como errores también! Consejo: cuenta el número de entidades que el modelo debía haber predicho. Luego cuenta el número de entidades que realmente predijo y divídelo por el número total de entidades correctas.

Intenta contar el número de entidades que el modelo predijo correctamente y divídelo por el número total de entidades correctas que el modelo debía haber predicho.

Intenta contar el número de entidades que el modelo predijo correctamente y divídelo por el número total de entidades correctas que el modelo debía haber predicho.

El modelo tuvo una precisión del 70% con nuestros datos de prueba.

Intenta contar el número de entidades que el modelo predijo correctamente y divídelo por el número total de entidades correctas que el modelo debía haber predicho.

Aquí tenemos un fragmento de los datos de entrenamiento del tipo de entidad DESTINO_TURISTICO en comentarios de viajeros.

doc1 = nlp("El año pasado fuí a Venecie y los canales estaban hermosos")
doc1.ents = [Span(doc1, 5, 6, label="DESTINO_TURISTICO")]

doc2 = nlp("Deberías visitar Madrid una vez en tu vida, "
           "pero el museo prado es aburrido")
doc2.ents = [Span(doc2, 2, 3, label="DESTINO_TURISTICO"),
             Span(doc2, 11, 13, label="DESTINO_TURISTICO")]

doc3 = nlp("Yo sé que también hay un Madrid en Colombia, jaja")
doc3.ents = []

doc4 = nlp("Una ciudad como Berlín es perfecta para las vacaciones de verano: "
           "muchos, parques, gran vida nocturna, cerveza barata!")
doc4.ents = [Span(doc4, 3, 4, label="DESTINO_TURISTICO")]

Parte 1

¿Por qué son problemáticos estos datos y su esquema de labels?

Una estrategia mejor sería tener únicamente el label "LOC" o "LOCATION" y luego usar un sistema basado en reglas para determinar si una entidad es un destino turístico en este contexto. Por ejemplo, puedes resolver los tipos de entidades en relación con un knowledge base o buscarlas en un wiki de viajes.

La ciudad de Madrid en Colombia podrí también ser una atracción turística. Esto solo resalta lo subjetivo que es el esquema de etiquetado y lo difícil que será decidir si el label aplica o no. Como resultado esta distinción también será muy difícil de aprender para el entity recognizer.

Las palabras muy raras o mal deletreadas también pueden ser marcadas como entidades. De hecho, ser capaz de predecir categorías en texto mal deletreado en contexto es una de las grandes ventajas del reconocimiento estadístico de entidades nombradas.

Parte 2

  • Reescribe el TRAINING_DATA para que solo use el label "LOC" en vez de "DESTINO_TURISTICO".
  • No te olvides de añadir tuples para las entidades "LOC" que no fueron marcadas con un label en los datos viejos.
  • Para los spans que ya estaban marcados con labels, solo tienes que cambiar el label de "DESTINO_TURISTICO" a "LOC".
  • On texto incluye una ciudad y un país que aún no han sido etiquetados. Para añadir los spans correspondientes, cuenta los tokens para encontrar en dónde comenzan y terminan. ¡Recuerda que el último token es excluyente! Después, agrega los nuevos Span a doc.ents.
  • ¡Cuidado con la tokenización! Imprime los tokens en el Doc si tienes dudas.

Aquí tenemos una pequeña muestra de un dataset creado para entrenar un nuevo tipo de entidad "WEBSITE". El dataset original contiene unas cuantas miles de frases. En este ejercicio estarás marcando con labels a mano. En la vida real, probablemente quieras automatizar esto y usar una herramienta para marcar con labels - por ejemplo, Brat, una popular solución de código libre, o Prodigy, nuestra propia herramienta de anotación que se integra con spaCy.

Parte 1

  • Completa los índices de los tokens para las entidades "WEBSITE" en los datos.
  • La posición de inicio y del final de un span de entidad son las posiciones de los caracteres en el texto. Por ejemplo, si una entidad comienza en la posición 5, entonces su posición de inicio es 5. Recuerda que las posiciones del final son excluyentes así que 10 significa hasta el carácter 10.

Parte 2

Un modelo fue entrenado con los datos que acabas de marcar con labels, más unos miles de ejemplos similares. Después de entrenar está haciéndolo muy bien con "WEBSITE", pero ahora no reconoce a "PER". ¿Por qué podría estar pasando esto?

Definitivamente es posible que un modelo aprenda sobre varias categorías diferentes. Por ejemplo, los modelo pre-entrenados de español de spaCy pueden reconocer personas, pero también organizaciones o lugares.

Si las entidades "PER" ocurren en los datos de entrenamiento, pero no están marcadas con etiquetas, el modelo aprenderá que éstas no deben ser predichas. Del mismo modo, si un tipo de entidad existente no está presente en los datos de entrenamiento el modelo puede "olvidar" y dejar de predecirlo.

A pesar de que los hiperparámetros pueden influenciar la precisión de un modelo, es probable que este no sea el problema aquí.

Parte 3

  • Actualiza los datos de entrenamiento para incluir anotaciones para las entidades "PER", "PewDiePie" y "Alexis Ohanian".
  • To add more entities, add another Span to the doc.ents.
  • Keep in mind that the end token of a span is exclusive. So an entity that starts at token 2 and ends at token 3 will have a start of 2 and an end of 3.