TextCNN fácil de entender


Prefacio: Para entender TextCNN, es suficiente leer este artículo.

1. Explicación detallada de TextCNN

1. ¿Qué es TextCNN?

  Cuando mencionamos CNN antes, solemos pensar que pertenece al campo CV y ​​es un modelo utilizado para resolver problemas de dirección de visión por computadora, sin embargo, en 2014, Yoon Kim hizo algunas deformaciones para la capa de entrada de CNN y propuso un modelo de clasificación de texto. TextoCNN. En comparación con la red CNN de imágenes tradicionales, TextCNN no tiene cambios en la estructura de la red (aún más simple). En la Figura 1, se puede ver que TextCNN en realidad solo tiene una capa de convolución, una capa de agrupación máxima y finalmente conecta la salida a clasificación softmax.n.
Estructura de la red TextCNN

[Figura 1: Estructura de la red TextCNN]


  En comparación con la red CNN en la imagen, la mayor diferencia entre textCNN es la diferencia en los datos de entrada : la imagen son datos bidimensionales y el núcleo de convolución de la imagen se desliza de izquierda a derecha y de arriba a abajo para la extracción de características. El lenguaje natural son datos unidimensionales.Aunque se genera un vector bidimensional a través de la incrustación de palabras, no tiene sentido realizar una convolución en el vector de palabras deslizándolo de izquierda a derecha. Por ejemplo, para el vector [0, 0, 0, 0, 1] correspondiente a "hoy", deslice de izquierda a derecha según el tamaño de la ventana de 1*2 para obtener [0,0], [0,0] , [0,0], Los cuatro vectores [0, 1] corresponden a la palabra "hoy", y este tipo de deslizamiento no es útil.

  El éxito de TextCNN no es el éxito de la estructura de la red, sino el rendimiento más allá del punto de referencia en múltiples conjuntos de datos mediante la introducción de vectores de palabras entrenados, lo que demuestra aún más que construir mejores incrustaciones es la clave para mejorar varias tareas de nlp. Las capacidades clave serán se explica específicamente más adelante sobre los algoritmos de incrustación actualmente populares.

2. Ventajas de TextCNN

  • La mayor ventaja de TextCNN es su estructura de red simple.Con una estructura de red de modelo tan simple, todavía tiene un efecto muy bueno al introducir vectores de palabras entrenados, superando los puntos de referencia en múltiples conjuntos de datos.
  • La estructura de red simple conduce a una pequeña cantidad de parámetros , una pequeña cantidad de cálculo y una velocidad de entrenamiento rápida.En una máquina v100 con una sola máquina y una sola tarjeta, el entrenamiento de 1,65 millones de datos y la iteración de 260 000 pasos pueden converger en aproximadamente la mitad una hora.

3. Principio de computación en red de TextCNN

  • Capa de entrada (capa de incrustación)
    La función de la capa de entrada es segmentar el texto de entrada en palabras, luego vectorizar el texto a través del archivo de vector de palabra y la matriz de vector de palabra, y admitir operaciones posteriores como la agrupación de convolución. En concreto, se divide en los siguientes pasos:
    • Segmentación de texto
      Segmente el texto de entrada en varias palabras a través de herramientas como la segmentación de palabras jieba. Por ejemplo, " qué vas a comer esta noche ", después de la segmentación de palabras, se convierte en [" hoy ", " tarde ", " comer ", " qué ", " qué "]. Además de la segmentación de palabras al ingresar texto, el vector de palabras que se introducirá a continuación también debe segmentarse al crear un archivo de vectores de palabras.
    • Inicialización de matriz de vector de palabra
      Vamos a presentar brevemente el archivo de vector de palabra y la matriz de vector de palabra . La forma de expresión del archivo vectorial de palabras existe en forma de un archivo de configuración fuera de línea, generalmente un archivo json, y existe en forma de dictado después de cargarse en el código. Por ejemplo, la función del archivo vectorial de palabras es para segmentar el {"的": 1, "是": 2, ……}texto de entrada Para obtener la representación vectorial de cada palabra, primero obtenga el índice correspondiente a la palabra a través del archivo vectorial de palabras, y luego obtenga la representación vectorial de la palabra en la matriz vectorial de palabras a través del índice. En este momento, es mucho más sencillo entender la palabra matriz vectorial. La función de la palabra matriz vectorial es obtener la representación vectorial del texto de entrada. En pocas palabras, es expresar el texto con vectores para valores numéricos. cálculo en el modelo (como convolución posterior, agrupación, etc.). Cada fila de la matriz de vectores de palabras es el vector correspondiente a una palabra determinada, es decir, podemos obtener la representación vectorial de la palabra en la matriz de vectores de palabras a través del índice en el archivo de vectores de palabras. Luego, presente brevemente los dos métodos de matriz de vector de palabra y generación de archivo de vector de palabra.
      • Inicializar aleatoriamente la matriz de vectores de palabras : este método es fácil de entender. Consiste en utilizar self.embedding = torch.nn.Embedding(vocab_size, embed_dim)el comando para generar directamente una matriz de vectores de palabras inicializada aleatoriamente. En este momento, el valor del vector se ajusta a la distribución normal N(0,1), que vocab_sizesignifica que la matriz de vectores de palabras puede ser El número de palabras representadas, este valor es el número de palabras en el archivo de vectores de palabras más 1 (la razón para agregar 1 es que si una palabra no existe en el archivo de vectores de palabras, el índice no se puede obtener, y la palabra Obtener el vector correspondiente en la matriz vectorial En este momento, el índice de la palabra es 0 por defecto, es decir, la primera línea del vector de la palabra se usa como la representación vectorial de la palabra. Este método también es aplicable cuando se utiliza el archivo de vector de palabra previamente entrenado), lo que embed_dimsignifica que al representar cada palabra, la dimensión del vector (personalizable, como 256). Para el método de inicialización aleatoria de la matriz de vectores de palabras, el método de generación del archivo de vectores de palabras generalmente consiste en segmentar todos los datos de texto actuales (incluidos los datos de entrenamiento, los datos de verificación y los datos de prueba) y luego realizar estadísticas agregadas en todas las palabras, y retener el número de palabras Las palabras que superan cierto umbral (como 3) se indexan (el número comienza en 1 y 0 se utiliza como índice de otras palabras que no están en el archivo vectorial de palabras mencionado anteriormente), y luego se genera un archivo de vector de palabra. Por cierto, hay muchas formas de inicializar la matriz vectorial de palabras, como los métodos de inicialización de Xavier y Kaiming.
      • Inicialice la matriz de vectores de palabras usando el archivo de vectores de palabras previamente entrenado : Esencialmente, la función de la matriz de vectores de palabras es realizar la representación vectorial del texto. Por lo tanto, la forma de representar el texto con un vector más apropiado se ha vuelto gradualmente una dirección de investigación caliente. Los archivos de vectores de palabras preentrenados son uno de los resultados de la investigación. Por ejemplo, los archivos de vectores de palabras generados por modelos preentrenados como word2vec y guante generan representaciones de vectores de palabras a través de una gran cantidad de datos de entrenamiento. Tomando word2vec como ejemplo, el archivo de vector de palabra generado después del entrenamiento existe en forma de un archivo de configuración fuera de línea, que se puede gensimcargar a través del kit de herramientas. El comando específico es wvmodel = gensim.models.KeyedVectors.load_word2vec_format(word2vec_file, binary=False, encoding='utf-8', unicode_errors='ignore'), después de cargar, wvmodel.key_to_indexel archivo de vector de palabra se puede obtener mediante El índice es renumerado, el índice original comienza desde 0, ajustado para comenzar desde 1, 0 se usa como el índice de la palabra que no está en el archivo vectorial de palabras), al wvmodel.get_vector("xxx")obtener el vector correspondiente a cada palabra en el archivo vectorial de palabras, todas las palabras en el archivo de vector de palabra Después de agregar los vectores correspondientes (el método de agregación es que la representación de vector de cada palabra se llena en la posición correspondiente de la matriz de vector de palabra de acuerdo con el índice de la palabra), una matriz de vector de palabra preentrenada se genera, y luego weightse completa la inicialización de la matriz de vectores de palabras self.embedding = torch.nn.Embedding.from_pretrained(weight, freeze=False), la función del parámetro freezees indicar si se debe actualizar el valor de peso de la matriz de vectores de palabras durante el entrenamiento, Truesi no se actualiza, el valor predeterminado es True, igual a self.embedding.weight.requires_grad = False).

          Hay otro detalle que necesita ser introducido.Después de obtener el archivo de vector de palabra pre-entrenado, debido a que el archivo de vector de palabra pre-entrenado es muy grande, puede haber un error de memoria insuficiente durante el proceso de entrenamiento subsiguiente.En este momento, Se ajustan el archivo de vectores de palabras y la matriz de vectores de palabras previamente entrenada. Específicamente, primero realizamos estadísticas de segmentación de palabras en todos los datos de texto de nuestra propia tarea, y retenemos las palabras cuyo número excede un cierto umbral como archivos de vectores de palabras (es decir, cuando el la matriz de vector de palabra se inicializa aleatoriamente, método de generación de archivo de vector de palabra), y luego use este archivo de vector de palabra para cooperar wvmodel.get_vector("xxx")para obtener la matriz de vector de palabra previa al entrenamientoweight, y finalmente realizar el proceso de inicialización de matriz de vector de palabra subsiguiente. Después de esta operación, dado que se reduce la cantidad de palabras en el archivo de vector de palabra, se reduce la cantidad de filas de la matriz de vector de palabra y, en consecuencia, el uso de memoria se reducirá considerablemente. Además, hay muchos métodos de entrenamiento previo para generar vectores de palabras, consulte [Vectores de palabras fáciles de entender].
    • Vectorización del texto de entrada
      Después de los dos pasos anteriores, el texto de entrada se ha segmentado y la matriz de vectores de palabras también se ha inicializado. En este momento, el texto de entrada se puede vectorizar. En resumen, después de segmentar el texto, cada palabra en el palabra El índice en el archivo vectorial determina la posición de la palabra en la matriz vectorial de palabras, para obtener la representación vectorial de la palabra y, finalmente, combinar la representación vectorial del texto de entrada, es decir, la matriz vectorial correspondiente a la texto de entrada, el número de columnas de esta matriz y el vector de palabras El número de columnas de la matriz es el mismo, y el número de filas no es fijo, dependiendo del número de palabras después de la segmentación del texto.
  • Capa convolucional
    La capa convolucional no es muy diferente del módulo de procesamiento de convolución en el campo CV tradicional.Aquí nos enfocamos en algunos detalles que necesitan atención.
    • Canal : en el campo CV tradicional, (R, G, B) se pueden usar como canales diferentes, y el número de canales es generalmente 3. Cuando se utiliza TextCNN para la clasificación, el número de canales suele ser uno. De hecho, también se pueden usar múltiples canales para la entrada. Los múltiples canales de TextCNN suelen ser diferentes métodos de incrustación (como word2vec o guante). En la práctica, los vectores de palabras estáticos y los vectores de palabras de ajuste fino también se usan como canales diferentes. Sin embargo, los experimentos han demostrado que TextCNN de un solo canal funciona mejor que TextCNN de varios canales, como se muestra en la Figura 2.

      Aquí también presentamos las diferencias de los cuatro modelos:
      a) CNN-rand (vector de palabra aleatorio)
      Después de especificar la dimensión embedding_size del vector de palabra, el modelo de clasificación de texto inicializa aleatoriamente los vectores de diferentes palabras.En el proceso de aprendizaje supervisado posterior, pass El método BP actualiza los vectores de palabras correspondientes a cada vocabulario en la capa de entrada.
      b. CNN-static (vector de palabra estático)
      utiliza vectores de palabra preentrenados, es decir, utiliza herramientas de vector de palabra como word2vec, fastText o Glove, para realizar un aprendizaje no supervisado en datos de campo abierto y obtener representaciones específicas de vector de palabra del vocabulario. Take It se usa directamente como entrada de la capa de entrada, y el vector de palabra ya no se ajusta durante el proceso de entrenamiento del modelo TextCNN.Esta es una aplicación específica de transferencia de aprendizaje en el campo de la PNL. C. CNN-vector de palabra preentrenado no
      estático (vector de palabra no estático) + ajuste dinámico, es decir, inicializa el vector de palabra entrenado por word2vec y ajusta el vector de palabra durante el proceso de entrenamiento. D. El canal múltiple (multicanal) se basa en la idea de los tres canales RGB en la imagen, aquí también puede usar métodos de inicialización de vectores de palabras estáticos y no estáticos para construir dos canales.


    • Cálculo de convolución El
      cálculo de convolución de TextCNN es ligeramente diferente del cálculo de convolución en el campo CV, reflejado principalmente en la forma y el tamaño del kernel de convolución , el tamaño del kernel de convolución de TextCNN y la cantidad de líneas que se pueden personalizar (como como 2, 3, 4, etc.), el número de columnas debe ser el mismo que el de la matriz vectorial de palabras, porque cada fila de la matriz vectorial de palabras representa una palabra, y solo cuando las dos columnas tienen el mismo número de columnas, el kernel de convolución puede extraer la información completa de cada palabra. El número de columnas del núcleo de convolución es menor que el número de columnas de la matriz vectorial de palabras, y la información extraída está incompleta y sin sentido. El número de columnas del núcleo de convolución del CV tradicional también se puede personalizar. Además, de acuerdo con el CV tradicional, la cantidad de núcleos de convolución también se puede personalizar.

inserte la descripción de la imagen aquí

[Figura 2: Experimento de TextCNN]
  • Capa de agrupación
    La capa de agrupación también es fácil de entender, también presentamos algunos detalles. La entrada de la capa de agrupación es la salida de la capa convolucional.El número de canales m de salida de la capa convolucional es igual al número de núcleos de convolución, y cada canal es una columna. La operación de agrupación consiste en realizar cálculos de agrupación en estos canales de salida. Actualmente existen dos métodos de cálculo, agrupación media y agrupación máxima .

    • Agrupación promedio (agrupación promedio) : la agrupación promedio es promediar todos los valores de cada canal, y torch.nn.functional.avg_pool1del comando se puede realizar.
    • Agrupación máxima (agrupación máxima) : la agrupación máxima es encontrar el valor máximo de todos los valores de cada canal, y torch.nn.functional.max_pool1del comando se puede realizar.

  Ya sea una agrupación promedio o una agrupación máxima, los valores m se generarán al final y, después de empalmar estos valores m , ingresarán a la capa final completamente conectada.

  • Capa completamente conectada
    De acuerdo con el resultado de la capa de agrupación y el número de categorías de clasificación, se construye la capa completamente conectada y luego se obtiene el resultado final de la clasificación a través de softmax, y se puede definir la capa completamente conectada, donde es la torch.nn.Linear(input_num, num_class)dimensión input_numde la salida de la capa de agrupación, es decir, m , num_classes el número de categorías para las tareas de clasificación.

Supongo que te gusta

Origin blog.csdn.net/qq_39439006/article/details/126760701
Recomendado
Clasificación