Transformador detallado

Transformador detallado

12 de julio de 2020 • Leer: 3264 • Aprendizaje profundoConfiguración de lectura

Explicación en video en la estación B

Transformer es el modelo seq2seq propuesto por Google Brain en el artículo Attention is all you need publicado a finales de 2017 . Ahora ha logrado una amplia gama de aplicaciones y extensiones, y BERT es un modelo de lenguaje pre-entrenado derivado de Transformer

Este artículo se divide en las siguientes secciones

  1. Comprensión intuitiva del transformador
  2. Codificación posicional
  3. Mecanismo de auto atención
  4. Conexión residual y normalización de capas
  5. Estructura general del codificador del transformador
  6. Estructura general del decodificador del transformador
  7. para resumir
  8. Articulo de referencia

0. Comprensión intuitiva de Transformer

La mayor diferencia entre Transformer y LSTM es que el entrenamiento de LSTM es iterativo y en serie. Debe esperar a que se procese la palabra actual antes de que se pueda procesar la siguiente. El entrenamiento de Transformer es paralelo, es decir, todas las palabras se entrenan al mismo tiempo, lo que aumenta enormemente la eficiencia computacional. Transformer usa la codificación posicional para comprender el orden del lenguaje, usa el mecanismo de atención a uno mismo (mecanismo de atención a uno mismo) y la capa completamente conectada para los cálculos, que se analizarán más adelante.

El modelo de transformador se divide principalmente en dos partes, a saber, codificador y decodificador . El codificador es responsable de mapear la entrada (secuencia de idioma) en una capa oculta (la parte representada por el Jiugongge en el paso 2 en la figura siguiente), y luego el decodificador mapea la capa oculta a una secuencia de lenguaje natural. Por ejemplo, el siguiente ejemplo de traducción automática

La mayor parte del contenido de este artículo es para explicar la parte del codificador , es decir , el proceso de mapear secuencias de lenguaje natural en expresiones matemáticas de capa oculta . Comprenda la estructura de Encoder y luego comprenda que Decoder es muy simple

La imagen de arriba es el diagrama de estructura de Transformer Encoder Block. Nota: Los números de título del contenido a continuación corresponden a los números de serie de los cuadros 1, 2, 3 y 4 en la imagen.

1. Codificación posicional

Dado que el modelo Transformer no tiene la operación iterativa de la red neuronal cíclica, debemos proporcionar la información de posición de cada palabra al Transformer para que pueda reconocer la relación de orden en el idioma.

Ahora defina un concepto de incrustación posicional , que es Codificación posicional, la dimensión de la [max_sequence_length, embedding_dimension]incrustación posicional es , la dimensión de la incrustación posicional y la dimensión del vector de palabras son las mismas, ambas embedding_dimension. max_sequence_lengthEs un hiperparámetro, que se refiere a la limitación de cuántas palabras puede contener cada oración.

Tenga en cuenta que generalmente entrenamos el modelo Transformer en unidades de palabras . Primero inicializa un tamaño de palabras codificadas [vocab_size, embedding_dimension], vocab_sizeel número de todas las palabras en el carácter, embedding_dimensioncomo un vector de palabra de dimensión, que corresponde a PyTorch de hechonn.Embedding(vocab_size, embedding_dimension)

El artículo utiliza la transformación lineal de las funciones sin y cos para proporcionar información sobre la posición del modelo:

PE {(pos, 2i)} = sin (pos / 10000 ^ {2i / d _ {texto {modelo}}}} \\ PE {(pos, 2i + 1)} = cos (pos / 10000 ^ 2i / d _ {\ text {modelo}}})

La fórmula de posición anterior se refiere a la ubicación de una palabra en una oración, está en el rango [0, \ max \ _ secuencia \ _ longitud), se yorefiere al vector de dimensión de la palabra numérica, rangos [0, \ incrustación \ _ dimensión / 2), se d _ {\ text {modelo}}refiere a un incrustación \ _ dimensiónvalor

Allí arriba siny porqueun conjunto de ecuaciones, es decir, correspondiente al incrustación \ dimensiónnúmero de pares pares e impares de dimensiones de una dimensión, por ejemplo, un grupo de 0,1, 2,3 un grupo, cada uno con las funciones sin y cos anteriores para hacer el procesamiento, resultando en diferentes El cambio periódico de posición incrustado en la dimensión, a medida que aumenta el número de dimensión, el cambio periódico se volverá cada vez más lento, y finalmente se produce una textura que contiene información de posición, como se menciona en la sexta página del original papel, la función de incrustación de posición de ciclo 2 \ pia 10000 * 2 \ picambio, y cada ubicación incrustación \ dimensiónrecibirá una combinación de valores de función sin y cos de las dimensiones de diferentes períodos, generando así una información de posición de textura única, de modo que las dependencias aprendidas finales entre la posición del modelo y las características de sincronización del lenguaje natural

Si no entiende por qué se hace este diseño aquí, puede ver la posición incrustada en Codificación posicional en Transformer en este artículo
. Observe verticalmente, se puede ver que a medida que incrustación \ dimensiónaumenta el número de serie, el cambio periódico de la función de incrustación de posición se vuelve cada vez más suave.



    import numpy as np

    import matplotlib.pyplot as plt

    import seaborn as sns

    import math

    def get_positional_encoding(max_seq_len, embed_dim):

    # 初始化一个positional encoding

    # embed_dim: 字嵌入的维度

    # max_seq_len: 最大的序列长度

    positional_encoding = np.array([

    [pos / np.power(10000, 2 * i / embed_dim) for i in range(embed_dim)]

    if pos != 0 else np.zeros(embed_dim) for pos in range(max_seq_len)])

    positional_encoding[1:, 0::2] = np.sin(positional_encoding[1:, 0::2]) # dim 2i 偶数

    positional_encoding[1:, 1::2] = np.cos(positional_encoding[1:, 1::2]) # dim 2i+1 奇数

    return positional_encoding

    positional_encoding = get_positional_encoding(max_seq_len=100, embed_dim=16)

    plt.figure(figsize=(10,10))

    sns.heatmap(positional_encoding)

    plt.title("Sinusoidal Function")

    plt.xlabel("hidden dimension")

    plt.ylabel("sequence length") 

plt.figure(figsize=(8, 5))

plt.plot(positional_encoding[1:, 1], label="dimension 1")

plt.plot(positional_encoding[1:, 2], label="dimension 2")

plt.plot(positional_encoding[1:, 3], label="dimension 3")

plt.legend()

plt.xlabel("Sequence length")

plt.ylabel("Period of Positional Encoding") 

2. Mecanismo de atención a uno mismo

Para la oración de entrada X, el vector de palabra de cada palabra en la oración se obtiene a través de WordEmbedding, y el vector de posición de todas las palabras se obtiene a través de Codificación posicional, y se agregan (las dimensiones son las mismas y se pueden agregar directamente) para obtener la verdadera representación vectorial de la palabra. El primer tvector de palabra denotadox_t

Luego definimos tres matrices W_Q, W_K.W_Vy usamos estas tres matrices para realizar tres transformaciones lineales en todos los vectores de palabras, de modo que todos los vectores de palabras derivan tres nuevos vectores q_t, k_t, v_t. Todos los q_tvectores forman una matriz grande, denotado por la matriz de consultaQ , todo el k_tvector forma una matriz grande, denotado por una matriz claveK , todo el vector forma una matriz grande, denotado por el valor de la matrizV (ver figura abajo)

Para obtener el peso de atención de la primera palabra, necesitamos usar el vector de consulta de la primera palabra

Multiplicar por la matriz de claves K (ver figura a continuación)

[0, 4, 2]

[1, 0, 2] x [1, 4, 3] = [2, 4, 4]

[1, 0, 1] 

 

Después de eso, debe pasar el valor obtenido a través de softmax para que su suma sea 1 (vea la figura a continuación)

 
  • softmax([2, 4, 4]) = [0.0, 0.5, 0.5]

Después de tener el peso, multiplique el peso por el vector de valor de la palabra correspondiente Vermont(vea la figura a continuación)

0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]

0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]

0.5 * [2, 6, 3] = [1.0, 3.0, 1.5] 

Finalmente, estos vectores de valor ponderado se suman para obtener la salida de la primera palabra (vea la figura a continuación)

[0.0, 0.0, 0.0]

+ [1.0, 4.0, 0.0]

+ [1.0, 3.0, 1.5]

-----------------

= [2.0, 7.0, 1.5] 

Realice la misma operación en otros vectores de entrada para obtener toda la salida después de la atención propia

Cálculo de matrices

El método descrito anteriormente requiere un ciclo para recorrer todas las palabras x_t. Podemos convertir el cálculo vectorial anterior en una forma de matriz para calcular la salida en todo momento a la vez

El primer paso en el cálculo no es un momento en el tiempo q_t, k_t, v_t, sino más bien un cálculo de todos los tiempos Q, Ky V. Cálculo que se muestra a continuación, donde la entrada es una matriz X, la primera tfila de la matriz representa tuna representación vectorial de la palabrax_t

Siguiente Qy K ^ Tmultiplicando y dividiendo por \ sqrt {d_k}(este es un papel truco se mencionó anteriormente), y multiplicando transcurrido después softmax Vobtener una salida

Atención multicabezal

Este documento también propuso el concepto de atención multicabezal. De hecho, es muy simple, el grupo previamente definido Q, K, Vpermite que una palabra atienda a palabras relacionadas, podemos definir múltiples grupos Q, K, Vpara enfocarnos en diferentes contextos. El Q, K, Vprocedimiento de cálculo es el mismo, excepto que una matriz de transformación lineal de un conjunto (W ^ Q, W ^ K, W ^ V)en una pluralidad de grupos (W ^ Q_0, W ^ K_0, W ^ V_0), (W ^ Q_1, W ^ K_1, W ^ V_1)... como se muestra en la FIG.

Para la matriz de entrada X, cada grupo Qde Ky Vpuede obtener una matriz de salida. Como se muestra abajo

Máscara de relleno

En el proceso de cálculo de Auto Atención anterior, generalmente usamos mini lotes para calcular, es decir, calcular múltiples oraciones a la vez, es decir

Las dimensiones son [batch_size, sequence_length],

Es la longitud de la oración, y un mini-lote se compone de múltiples oraciones de longitud desigual. Necesitamos completar las oraciones restantes de acuerdo con la longitud de oración más grande en este mini-lote, y generalmente completarlo con 0. Este proceso es llamado relleno

Pero en este momento, habrá problemas al realizar softmax. Mirando hacia atrás en la función softmax \ sigma (z_i) = \ frac {e ^ {z_i}} {\ sum_ {j = 1} ^ K e ^ {z_j}}, e ^ 0es 1, y tiene un valor. En este caso, la parte de relleno del softmax está involucrada en el cálculo, lo que equivale a dejar que la parte inválida participe en el cálculo, lo que puede causar grandes peligros ocultos. Por lo tanto, se necesita una operación de máscara para que estas regiones inválidas no participen en el cálculo. Generalmente, se agrega un desplazamiento negativo grande a las regiones inválidas, a saber

Z_ {ilegal} = Z_ {ilegal} + sesgo_ {ilegal}

sesgo_ {ilegal} {\ rightarrow- \ infty}

3. Conexión residual y normalización de capas

Conexión residual

En el paso anterior, obtuvimos el resultado después de la ponderación de la atención propia, es decir Atención (Q, \ K, \ V), y luego los agregamos para hacer la conexión residual

X_ {incrustación} + Auto \ Atención (Q, \ K, \ V)

Normalización de capa

La función de la normalización de capas es normalizar las capas ocultas en la red neuronal a una distribución normal estándar, es decir, iiduna distribución independiente e idéntica, para acelerar el entrenamiento y acelerar la convergencia.

\ mu_ {j} = \ frac {1} {m} \ sum ^ {m} _ {i = 1} x_ {ij}

En la columna de la ecuación matricial (columna)para la unidad de promedio;

\ sigma ^ {2} _ {j} = \ frac {1} {m} \ sum ^ {m} _ {i = 1} (x_ {ij} - \ mu_ {j}) ^ {2}

Columna de la matriz en la fórmula (columna)buscar unidades de varianza

LayerNorm (x) = \ frac {x_ {ij} - \ mu_ {j}} {\ sqrt {\ sigma ^ {2} _ {j} + \ epsilon}}

Luego, cada columna de cada elemento de restar la media de esta columna , dividida por la desviación estándar de esa columna , para así obtener el valor normalizado, se aplica para evitar que el denominador sea 0.

La siguiente figura muestra más detalles: la entrada se x_1, x_2convierte en después de la capa de auto-atención z_1, z_2, y luego la x_1, x_2conexión residual con la entrada , después de LayerNorm, se envía a la capa completamente conectada. La capa completamente conectada también tiene una conexión residual y un LayerNorm, que finalmente se envían al siguiente codificador (los pesos de la capa FeedForward en cada bloque del codificador se comparten)

4. Estructura general del codificador del transformador

Después de los 3 pasos anteriores, hemos entendido básicamente los componentes principales del Encoder . A continuación usamos la fórmula para organizar el proceso de cálculo de un bloque de Encoder:

1). Vector de palabra y codificación de posición

X = Incrustación \ Búsqueda (X) + Posicional \ Codificación

2). Mecanismo de auto atención

Q = Lineal (X) = XW_ {Q} \\ K = Lineal (X) = XW_ {K} \\ V = Lineal (X) = XW_ {V} \\ X_ {atención} = Autoatención (Q, \ K , \ V)

3). Conexión residual de atención propia y normalización de capa

X_ {atención} = X + X_ {atención} \\ X_ {atención} = LayerNorm (X_ {atención})

4). La cuarta parte del diagrama de estructura de bloques del codificador , que es FeedForward, es en realidad un mapeo lineal de dos capas y se activa con una función de activación, por ejemplocurrículum

X_ {oculto} = Lineal (ReLU (Lineal (X_ {atención})))

5). Conexión residual FeedForward y Normalización de capa

X_ {oculto} = X_ {atención} + X_ {oculto} \\ X_ {oculto} = LayerNorm (X_ {oculto})

entre ellos

X_ {oculto} \ in \ mathbb {R} ^ {lote \ _ tamaño \ * \ seq \ _len.  \ * \ embed \ _dim}

5. Estructura general del decodificador del transformador

Primero observemos la estructura del decodificador desde la perspectiva de HighLevel, de abajo hacia arriba:

  • Auto-atención enmascarada de múltiples cabezas
  • Atención de codificador-decodificador de múltiples cabezales
  • Red FeedForward

Al igual que el codificador, cada una de las tres partes anteriores tiene una conexión residual seguida de una normalización de capa . Las partes intermedias del Decoder no son complicadas, la mayoría de las cuales ya las hemos introducido en el Encoder anterior, pero debido a su función especial, el Decoder involucrará algunos detalles durante el entrenamiento.

Auto-atención enmascarada

Específicamente, el decodificador en el Seq2Seq tradicional usa el modelo RNN, por lo que la entrada durante el proceso de entrenamiento

Palabras de momentos, el modelo no puede ver palabras de momentos futuros de todos modos, porque la red neuronal cíclica está impulsada por el tiempo y solo se puede ver cuando finaliza el cálculo del momento.

La palabra del momento. El Transformer Decoder abandonó RNN y cambió a Auto-Atención, lo que creó un problema. Durante el proceso de entrenamiento, toda la verdad del terreno se expone al Decodificador. Esto es obviamente incorrecto. Necesitamos procesar la entrada del Decodificador., El proceso se llama máscara

Por ejemplo, la verdad básica del decodificador es "<start> Estoy bien". Ingresamos esta oración en el decodificador. Después de la incrustación de palabras y la codificación posicional, la matriz resultante se somete a una transformación lineal cúbica (

). Luego realice la operación de auto atención, primero pase

Para obtener las puntuaciones escaladas, el siguiente paso es muy importante. Tenemos que enmascarar las puntuaciones escaladas. Por ejemplo, cuando ingresamos "I", el modelo actualmente solo conoce la información de todas las palabras anteriores, incluida la "I", es decir , "<start> La información de" y "I" no debe dejarse conocer la información de la palabra después de "I". La razón es muy simple. Cuando hacemos predicciones, hacemos predicciones palabra por palabra en orden. ¿Cómo podemos saber la información de las siguientes palabras sin predecir esta palabra? La máscara es muy simple: primero genere una matriz con todos los ceros en el triángulo inferior y el infinito negativo en el triángulo superior, y luego agréguela a las puntuaciones escaladas.

Después de hacer softmax, puede cambiar-inf a 0, y la matriz resultante es el peso entre cada palabra

La autoatención de varios cabezales no es más que realizar los pasos anteriores varias veces en paralelo. El codificador también se ha introducido antes, por lo que no lo repetiré aquí.

Atención codificador-decodificador enmascarado

De hecho, el proceso de cálculo de esta parte es muy similar al anterior Auto-Atención enmascarada, y la estructura es exactamente la misma. La única diferencia es que aquí K, Vestá la salida de Encoder y la salida Qde Auto-Atención enmascarada en Decoder.

6. Resumen

Hasta ahora, se ha introducido el 95% del contenido de Transformer, y usamos una imagen para mostrar su estructura completa. Tengo que decir que el diseño de Transformer es muy ingenioso

Hay algunas preguntas a continuación, que encontré en Internet, siento que después de leerlo, puedo tener una comprensión más profunda de Transformer

¿Por qué Transformer necesita atención multicabezal?

El artículo original decía que la razón de la Atención de múltiples cabezas es dividir el modelo en múltiples cabezas para formar múltiples subespacios, lo que permite que el modelo preste atención a diferentes aspectos de la información y finalmente integre todos los aspectos de la información. De hecho, es intuitivamente concebible que si diseña un modelo de este tipo usted mismo, ciertamente no solo prestará una atención. El resultado de la síntesis de atención múltiple puede al menos mejorar el modelo. También se puede comparar con el uso simultáneo de múltiples convoluciones. en CNN. El papel del núcleo , intuitivamente hablando, la atención de múltiples cabezas ayuda a la red a capturar características / información más rica

En comparación con RNN / LSTM, ¿cuáles son las ventajas de Transformer? ¿por qué?

  1. Los modelos de la serie RNN no se pueden calcular en paralelo, porque el cálculo en el momento T depende del resultado del cálculo de la capa oculta en el momento T-1, y el cálculo en el momento T-1 depende del resultado del cálculo de la capa oculta en el momento T-2
  2. La capacidad de extracción de funciones del transformador es mejor que la de los modelos de la serie RNN

¿Por qué Transformer puede reemplazar seq2seq?

Es un poco inapropiado reemplazar la palabra aquí. Aunque seq2seq es antiguo, todavía tiene su lugar. El mayor problema con seq2seq es comprimir toda la información del codificador en un vector de longitud fija y usarlo como encabezado del decodificador .Una entrada de estado oculto para predecir el estado oculto de la primera palabra (token) en el lado del decodificador. Cuando la secuencia de entrada es relativamente larga, esto obviamente perderá mucha información en el lado del codificador, y el vector fijo se envía al lado del decodificador con tal cerebro, el lado del decodificador no puede prestar atención a la información a la que quiere prestar atención. a . Transformer no solo realiza mejoras sustanciales en estas dos deficiencias del modelo seq2seq (módulo de atención interactiva de múltiples cabezales), sino que también introduce un módulo de auto-atención para permitir que la secuencia de origen y la secuencia de destino se "autoasocien" primero. En este caso , la secuencia de origen La representación de incrustación de la secuencia de destino en sí contiene más información, y la capa FFN posterior también mejora la capacidad de expresión del modelo, y la capacidad de cálculo paralelo de Transformer supera con creces el modelo de la serie seq2seq

7. Artículos de referencia

Supongo que te gusta

Origin blog.csdn.net/sunlin972913894/article/details/110310909
Recomendado
Clasificación