[Registro personal | Mecanismo de atención | Organizando]

【Leyendo lista】

Esta publicación es todo lo que necesitas(上卷) Transformador

Esta publicación es todo lo que necesitas(下卷) BERT

Un artículo para comprender Transformer and Attention   (texto original: The Illustrated Transformer  ) proporciona una introducción detallada a QKV

【Vídeo explicativo】

La esencia del mecanismo de atención|Autoatención|Transformador|QKV Matrix_bilibili

【Atención es todo lo que necesitas (Volumen 1)】

1. Punto de partida:

Modelo de secuencia: estructura de bucle, dependencia de tiempo/salida, no se puede paralelizar

=>Arquitectura transformadora (representación implícita de entrada y salida)

2. Autoatención y atención multicabezal

Autoatención: el peso de la oración en cada posición y luego calcule la representación vectorial oculta de la oración usando el método de suma de peso

Atención multicabezal:

①Self-A está demasiado concentrado en su propia posición

② Aumentar la capacidad de expresión del modelo (subdividir QKV con más métodos de asignación de peso de atención)

3 、 Transformador

Codificación posicional y codificación y decodificación:

incrustar

(1) incrustación de token: representación vectorial de texto: el texto se asigna a un espacio vectorial denso de baja dimensión a través de la capa de incrustación

↓Simplemente multiplique varias matrices de un lado a otro para realizar cambios lineales, perdiendo la información de secuencia original del texto↓(Se agrega PE adicional)

(2) Incrustación posicional: la información posicional no es constante (cambio de curva)

Estructura de red (6 módulos transformadores idénticos de una sola capa apilados)

Codificador: x2 [KV] atención de cabezales múltiples, avance de dos capas NN

        Estas dos partes tienen lo mismo: conexión residual + normalización, entrada agregada a Dropout

Decodificador: atención multicabezal enmascarada x3[Q], atención interactiva de memoria (KV) con En, avance de dos capas NN

        Proceso de decodificación de entrenamiento: En/De recibe información en todo momento a la vez (aumenta la velocidad de entrenamiento, envía gt no pre para un entrenamiento más preciso)

        máscara de atención (cubra la parte posterior; la secuencia se envía a De a su vez) + Incrustación posicional (mantenga el orden de las palabras de la declaración en sí)

        

Resumen sobre QKV:

Implementación del módulo básico

1. 6 En+6 Dn están apilados en el transformador

Dos máscaras:

①Máscara de atención: enmascara la información en todas las posiciones después del momento actual durante el proceso de entrenamiento (solo asegurando la secuencia de la entrada)

②Máscara de relleno: el mismo lote contiene varias secuencias de texto y las longitudes de diferentes secuencias de texto son inconsistentes => relleno con la misma longitud

2. Implementación de un mecanismo de atención de múltiples cabezales (para evitar que el peso del mecanismo de autoatención único se concentre demasiado en la posición de codificación actual)

Preste atención a los cambios en las dimensiones, varias variables importantes y varias operaciones lineales.

Implementación de la estructura de la red de transformadores.

Incluyendo: incrustación de tokens (vector de dirección de caracteres), incrustación posicional, codificador y decodificador, etc.

Token se refiere a la unidad más pequeña del texto , generalmente palabras, signos de puntuación, números, etc. En el procesamiento del lenguaje natural, segmentamos el texto en una serie de tokens y luego analizamos y procesamos estos tokens. Cada token generalmente se representa como un vector que contiene la información semántica del token. La dimensionalidad de este vector puede ser arbitraria y generalmente se determina en función de las necesidades de la tarea y las limitaciones de los recursos informáticos. Por ejemplo, en una tarea de clasificación de sentimientos, podríamos usar un vector de 100 dimensiones para representar cada palabra, mientras que en una tarea de traducción automática, podríamos usar un vector de 512 dimensiones para representar cada palabra. "emb_size" indica el tamaño de dimensión de cada token cuando se incrusta como un vector en el modelo.

position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1): la función torch.arange(start, end, step) devuelve un tensor que contiene los valores de principio a fin (excluyendo el final) .step es una serie de valores para intervalos . Aquí, usamos la función torch.arange() para generar un tensor unidimensional de 0 a max_len-1 que representa la codificación posicional de cada posición en la secuencia de entrada. Usamos dtype=torch.float para especificar el tipo de datos del tensor como punto flotante para cálculos posteriores. Luego, usamos el método unsqueeze(1) para expandir este tensor unidimensional a un tensor bidimensional , donde la primera dimensión representa la posición de la secuencia y la segunda dimensión es 1 para el cálculo posterior de la matriz de codificación de posición (aquí en la dimensión 1 Agregue una dimensión. Si el parámetro dentro es 0, significa agregar una dimensión a la dimensión 0).

pe[:,0::2] =torch.sin(posición * div_term) # [max_len, d_model/2]

pe[:, 1::2] = antorcha.cos(posición * div_term)

Las funciones torch.sin() y torch.cos() se utilizan para calcular el elemento sin y el elemento cos en la matriz de codificación de posición respectivamente, y asignarlos a las columnas pares e impares de pe, es decir, pe[:, 0 :: 2] y pe[:, 1::2]. Esto se debe a que en la matriz de codificación de posición, los valores de codificación en posiciones adyacentes se codifican utilizando la función sin en los bits pares y la función cos en los bits impares . Esto se debe a que las funciones sin y cos tienen diferentes propiedades periódicas. para expresar mejor la relación entre diferentes ubicaciones. Este método de codificación puede hacer que la codificación entre diferentes posiciones tenga un cierto grado de distinción en el espacio vectorial, mejorando así la capacidad de expresión del modelo. Específicamente, los períodos de las funciones sin y cos son 2π y π respectivamente, lo que significa que sus cambios de valor son más diversos en diferentes posiciones, lo que ayuda al modelo a aprender mejor la relación de posición relativa entre diferentes posiciones.

codificación

El EncoderLayer en la imagen de la derecha es el codificador correspondiente a la imagen de la izquierda.

Combinémoslo con la estructura de red de transformadores de una sola capa mencionada al principio.

 descodificación

Preste atención a varias máscaras (tgt_mask, Memory_mask) y al relleno para garantizar que la longitud de la secuencia dentro del lote sea coherente.

La codificación y decodificación se implementan primero en una sola capa y luego se apilan.

Transformador

Si desea tener una comprensión más profunda de un modelo de red, la mejor manera es revisarlo usted mismo en su totalidad, desde el preprocesamiento de datos hasta el entrenamiento del modelo.
Modelo de traducción basado en transformador (principalmente preprocesamiento y carga): cree un modelo de traducción para traducir del alemán al inglés. 

1. Construcción del conjunto de datos

(1) Segmentación de texto tokenizado: la mayor parte se puede segmentar directamente por espacios. También es necesario segmentar las abreviaturas, lo que se puede lograr con la ayuda del método get_tokenizer en torchtext . Lo que obtienes son 2 tokenizadores serializados en alemán e inglés.

(2) Cree un vocabulario : cree un diccionario mediante el método Vocab en torchtext.vocab y obtenga dos objetos instanciados de la clase Vocab.

Lista de personajes especiales especiales

<unk>Representa palabras desconocidas. Por lo general, al procesar datos de texto, las palabras que aparecen con menos frecuencia, no se pueden reconocer o no están en el vocabulario<unk> se reemplazarán para evitar errores del modelo causados ​​por palabras desconocidas.

<pad>Representa caracteres de relleno . Por lo general, cuando se procesan datos de secuencia en tensores de igual longitud, <pad>se necesita relleno para que todas las secuencias tengan la misma longitud, lo que hace que la longitud de la secuencia sea consistente y conveniente para el procesamiento por lotes.

<bos>Representa el símbolo de inicio de secuencia . Generalmente, cuando se procesan datos de texto, <bos>se agrega un símbolo al comienzo de cada oración.

<eos>Representa el final de la secuencia . Por lo general, cuando se procesan datos de texto, <eos>se agregan símbolos al final de cada oración. El uso de <bos>y <eos>puede hacer que el modelo comprenda mejor el principio y el final de la secuencia de texto.

Iterar a través de cada muestra en el archivo (una por línea) y tokenizar y contar

counter.update(tokenizer(string_)) : si string_ es "hola mundo, hola", tokenizer(string_) devolverá ["hola", "mundo", "hola"] y counter.update(tokenizer(string_)) cuente "hola" como 2 y "mundo" como 1, y finalmente obtenga un objeto contador, donde contador["hola"] es 2 y contador["mundo"] es 1

(3) Convertir a secuencia de token : convierta el conjunto de entrenamiento, el conjunto de verificación y el conjunto de prueba en secuencia de token (convierta a formato de índice según el diccionario)

Una línea constituye una muestra, la ficha original izquierda y la ficha objetivo derecha; tensor

(4) Procesamiento de relleno : durante el proceso de entrenamiento, el modelo solo necesita garantizar que todas las secuencias originales en el mismo lote tengan la misma longitud y que todas las secuencias objetivo tengan la misma longitud, es decir, todas las muestras en el No es necesario que todo el conjunto de datos tenga la misma longitud.
Rellene otras muestras basándose en la muestra más larga de cada lote.
(5) Construya un vector de máscara : genere una matriz de máscara de atención con una forma de [sz, sz] (la máscara de atención enmascara la posición después de la posición actual durante el proceso de decodificación )
(6) Construya y use DataLoader : convierta el conjunto de entrenamiento, el conjunto de verificación y el conjunto de prueba en secuencias de tokens, y luego construya tres DataLoaders respectivamente, donde generate_batch se pasará como parámetro para procesar las muestras de cada lote.

2. Modelo de traducción
(1) Estructura de red : la parte de incrustación está separada: debido a los diferentes modelos de generación de texto, la parte de incrustación será diferente (por ejemplo, en el escenario de generación de poesía, el codificador y el decodificador comparten un TokenEmbedding, mientras que en el modelo de traducción requiere dos), por lo que los dos se dividieron. Al mismo tiempo, una vez completado el entrenamiento del modelo, el codificador solo necesita ejecutarse una vez en el proceso de inferencia, por lo que el codificador y el decodificador en el transformador también deben usarse por separado durante este proceso [aquí están position_embedding y token_embedding (src /tgt)]
        Preste atención a la definición y uso de parámetros comunes.
(2) Entrenamiento del modelo : (Escriba los parámetros de configuración en config)
Carga del conjunto de datos,
Definición del modelo/creación de instancias e inicialización de pesos.
pérdida/lr dinámico/optimizador,
Empezar a entrenar
(3) Predicción del modelo :
Modelo de clasificación basado en transformador (modelo de clasificación de texto AG_News)
Para ser precisos, debería ser solo un modelo de clasificación de texto basado en Encoder en Transformer . Esto se debe a que no existe un proceso de decodificación en la tarea de clasificación de texto, por lo que solo necesitamos ingresar el vector codificado por el codificador en el clasificador para la clasificación.
De hecho, la estructura de red del modelo BERT es esencialmente equivalente a la que se muestra en la Figura 6-1.

1. Preprocesamiento de datos

Conjunto de datos AG_News: todas las muestras utilizan comas como delimitadores;
Construcción del conjunto de datos:
        Defina tokenize, defina la cadena claramente ( hay muchos caracteres extraños en el corpus original ), establezca un vocabulario (método Vocab) y conviértalo en una secuencia Token ( convierta cada palabra en cada oración en una forma de índice de acuerdo con el diccionario, Al mismo tiempo, devuelve la longitud de la muestra más larga entre todas las muestras ), relleno, construcción de DataLoade y ejemplos de uso.

2. Modelo de clasificación de texto

Finalmente, la salida del codificador debe enviarse a un clasificador softmax para completar la tarea de clasificación.

Entrenamiento de modelos: carga de conjuntos de datos, definición/creación de instancias del modelo e inicialización de pesos, pérdida/lr dinámico/optimizador, inicio de entrenamiento

Reponer:

softmax

Abandonar

La tarea de clasificación solo requiere la operación argma en la salida final de la red.

Explicación detallada de atención y máscara con múltiples imágenes: desde la red neuronal recurrente, el transformador hasta GPT2_attention mask_CSDN de Shen Luohua

Revisión rápida: notas

[Notas de lectura: esta publicación es todo lo que necesita (Volumen 2) - Paso a paso en BERT]

Modelo de capacidad de aprendizaje de codificación bidireccional BERT (Representaciones de codificador bidireccional de Transformers): para permitir que el modelo aprenda de manera efectiva la capacidad de codificación bidireccional, BERT utiliza un modelo de lenguaje enmascarado (MLM) durante el proceso de capacitación, es decir, pares aleatorios Ciertas posiciones en La secuencia de entrada se enmascara y luego se pasa a través del modelo para predecirla . La tarea de predicción de MLM permite que los resultados obtenidos mediante la codificación del modelo también contengan información de contexto, lo que resulta beneficioso para entrenar unmodelo de red BERT más profundo. Además, en el proceso de entrenamientoBERTel autor también agregó la siguiente tarea de predicción de oración (Next Sentence Prediction, NSP ), es decir, ingresar dos oraciones en el modelo al mismo tiempo y luego predecirsi la segunda oración es la primeraoración Siguiente oración.

"BERT en su conjunto está apilado por múltiples capas de Transformer Encoder; al mismo tiempo, se agrega una incrustación de segmento adicional a la parte de incrustación . "El llamado "bidireccional" en realidad se refiere al mecanismo de autoatención en Transformer. Al mismo tiempo, lo que realmente hace que BERT funcione bien es el proceso de capacitación previa basado en las dos tareas de MLM y NSP, de modo que el modelo entrenado tenga una fuerte capacidad de representación.

La primera parte presenta principalmente el principio de estructura de red de BERT y los principios específicos de las dos tareas de MLM y NSP;
La segunda parte presentará principalmente cómo implementar BERT y el uso de modelos previamente entrenados por BERT en tareas posteriores;
La tercera parte presenta cómo utilizar las dos tareas de MLM y NSP para entrenar el modelo BERT (ya sea desde cero o basado en el modelo de preentrenamiento BERT de código abierto).

Incrustación de entrada × 3:

Contiene principalmente tres partes: incrustación de tokens , incrustación posicional e incrustación de segmentos.

Cabe señalar que la incrustación posicional en BERT no calcula la codificación de cada posición mediante una fórmula, sino que inicializa un vector para cada posición como una incrustación de palabras normal y luego lo entrena junto con la red. (El PE máximo durante el entrenamiento es 512)
Incrustación de segmentos : dado que el objetivo principal de BERT es construir un modelo general de preentrenamiento, es inevitable tener en cuenta las entradas en varios escenarios de tareas de PNL. Por lo tanto, la función de la incrustación de segmentos es distinguir diferentes partes de la secuencia de entrada. Su esencia es distinguir la posición de cada secuencia mediante una incrustación de palabras ordinaria. Por ejemplo en
En la tarea NSP, para cualquier oración (dos en total), cada posición estará representada por el mismo vector, para distinguir qué parte de los caracteres es la primera oración y qué parte de los caracteres es la segunda oración . , la longitud del vocabulario del segmento en este momento es 2 .
Finalmente, agregue (y normalice) los resultados de estas tres partes de Incrustación para obtener el resultado final de Incrustación de entrada.

token: la oración se divide en palabras               [SEP] separador de dos oraciones

segmento: el vector de posición de cada Token en la capa de oración                es el mismo.

posición: La posición         se utiliza para identificar la posición respectiva de cada Token en la oración, lo que permite al modelo capturar texto ordenado BertEncoder:

Compuesto por L BertLayer, H representa la dimensión del modelo; A representa el número de toros en la atención de múltiples cabezas.

Modelo de lenguaje enmascarado, MLM basado en modelo de lenguaje enmascarado
Enmascare aleatoriamente el 15% de los tokens en la secuencia de entrada (es decir, reemplace los tokens originales con " [MASK] " ) y luego use el vector en la posición enmascarada correspondiente en el resultado de salida de BERT para predecir el valor verdadero.
Sin embargo, no hay ningún token como [MASK] en la secuencia de entrada durante el ajuste fino , por lo que existe un problema de desajuste e inconsistencia (brecha) entre el entrenamiento previo y el ajuste fino.

=>Cambio: Primero seleccione el 15% de los Tokens , luego reemplace el 80% de ellos con " [MASCARA] ", el 10% se reemplace aleatoriamente con otros Tokens y el 10% restante permanece sin cambios. Finalmente, la salida correspondiente a estos Token del 15% se clasifica para predecir su valor real.

Predicción de la siguiente oración, tarea de predicción de la siguiente oración de dos categorías de NSP
Cada muestra se compone de dos oraciones A y B. En el 50% de los casos, B es de hecho la siguiente oración de A (etiquetada como IsNext ), y en el otro 50% de los casos , B es otra oración aleatoria en el corpus. (etiquetado NotNext ), y luego el modelo predice si B es la siguiente oración de A.

La primera parte presenta principalmente el principio de estructura de red de BERT y los principios específicos de las dos tareas de MLM y NSP;
La segunda parte presentará principalmente cómo implementar BERT y el uso de modelos previamente entrenados por BERT en tareas posteriores;
La tercera parte presenta cómo utilizar las dos tareas de MLM y NSP para entrenar el modelo BERT (ya sea desde cero o basado en el modelo de preentrenamiento BERT de código abierto).
El código del proyecto se puede obtener del almacén: https://github.com/moon-hotel/BertWithPretrained

La primera parte presenta principalmente el principio de estructura de red de BERT y los principios específicos de las dos tareas de MLM y NSP;
La segunda parte presentará principalmente cómo implementar BERT y el uso de modelos previamente entrenados por BERT en tareas posteriores;
La tercera parte presenta cómo utilizar las dos tareas de MLM y NSP para entrenar el modelo BERT (ya sea desde cero o basado en el modelo de preentrenamiento BERT de código abierto).

Supongo que te gusta

Origin blog.csdn.net/sinat_40759442/article/details/128683705
Recomendado
Clasificación