Introducción a la autoatención y la escritura de códigos.

autoatención


Arquitectura de autoatención

La forma en que funciona la autoatención es ingresar una fila de vectores y generar una fila de vectores.

El vector de salida tiene en cuenta la información de todos los vectores de entrada.

Figura 1

  • La atención propia se puede superponer muchas veces.
    inserte la descripción de la imagen aquí
    Las capas totalmente conectadas (FC) y la atención propia se pueden usar indistintamente.
  1. La autoatención procesa la información de toda la Secuencia
  2. FC's Network, enfocándose en el manejo de consultas desde una determinada ubicación

El proceso de Auto-Atención

inserte la descripción de la imagen aquí

  • Una de sus arquitecturas es así, la salida es una fila de bbb esaaa se calcula y se emite.

  • segundo 1 segundo ^ {1}b1 se consideraun 1 , un 2 , un 3 , un 4 a^{1},a^{2},a^{3},a^{4}a1 ,a2 ,a3 ,agenerado después de 4 .

  • b 2 , b 3 , b 4 b^{2},b^{3},b^{4}b2 ,b3 ,b4 también considerea 1 , a 2 , a 3 , a 4 a^{1},a^{2},a^{3},a^{4}a1 ,a2 ,a3 ,a4 , sus principios de cálculo son los mismos.

    Calcula la correlación de dos vectores de entrada

inserte la descripción de la imagen aquí

  • Dos métodos de cálculo comunes: producto escalar y aditivo

  • Entre ellos, en el primer método, primero deje que estos dos vectores se multipliquen por un W (estos dos w son diferentes, uno es peso_q, el otro es peso_k), y obtenga respectivamente q, kq, kq ,k , y luego realiza el producto interno para obtener una puntuaciónα i , j \alpha _{i,j}ayo , jIndica el cálculo de ai y aj a_{i} y a_{j}ayoy unjde relevancia

inserte la descripción de la imagen aquí

  • Después de un 1 a^{1}a1 minuto sumaa 2 , a 3 , a 4 a^{2},a^{3},a^{4}a2 ,a3 ,a4 Calcula la similituda 1 a^{1}a1 objetivoq 1 q^{1}q1 minuto sumaa 2 , a 3 , a 4 a^{2},a^{3},a^{4}a2 ,a3 ,ak2, k3, k4 de 4 k^{2},k^{3},k ^ {4}k2 ,k3 ,k4 Haz el producto interior para llamar la atención scorcea 1 , 2 a_{1,2}a1 , 2, un 1 , 3 un_{1,3}a1 , 3, un 1 , 4 un_{1,4}a1 , 4, a 1 a^{1} también se calculará en la operación reala1 similitud contigo mismo.

  • Futuro posterior a 1 , 1 , a 1 , 2 a_{1,1},a_{1,2}a1 , 1,a1 , 2, un 1 , 3 un_{1,3}a1 , 3, un 1 , 4 un_{1,4}a1 , 4, obtenga un 1 , 1 ′ a^{'}_{1,1} después de una capa soft-maxa1 , 1′′ un 1 , 2 ′ un^{'}_{1,2}a1 , 2′′
    inserte la descripción de la imagen aquí

  • Luego pon un 1 a^{1}a1 a4 a^{4}aCada vector de 4 se multiplica por W v W^{v}Wv obtiene un nuevo vector, obtiene respectivamentev 1 , v 2 , v 3 , v 4 v^{1},v^{2},v^{3},v^{4}v1 ,v2 ,v3 ,v4

  • A continuación, v 1 v^{1}v1 av 4 v^{4}v4 , cada vector se multiplica por la puntuación de Atención y luego se suma para obtenerb 1 b^{1}b1
    segundo 1 = ∑ yo α 1 , yo ′ vib^{1} = \sum_{i}\alpha_{1,i}^{'}v^{i}b1=ia1 , yo′′vi

  • Teoría, a 2 , a 3 , a 4 a^{2},a^{3},a^{4}a2 ,a3 ,a4 también hacemos la misma operación para obtenerb 2 , b 3 , b 4 b^{2},b^{3},b^{4}b2 ,b3 ,b4 .

ángulo de la matriz

Cada vector de entrada generará un conjunto de qi , ki , viq^{i} ,k^{i},v^{i}qyo ,kyo ,vi

inserte la descripción de la imagen aquí

Por lo tanto, cada uno de nosotros aia^{i}asalí multiplicado por unwqw^{q}wmatriz q , puede obtener la matriz Q haciendo la multiplicación de matrices, y cada columna de la matriz Q es cada entradaaia^{i}aiqiq^{i}qyo _

inserte la descripción de la imagen aquí
Del mismo modo cada grupo ki , vik^{i} , v^{i}kyo ,vi también se puede calcular con una matriz,
inserte la descripción de la imagen aquí
sabemos que cada atenciónai , j a_{i,j}ayo , jRepresenta qiq^{i} de la i-ésima entradaqkjk^{j} de i y la j-ésima entradakj producto interno.
inserte la descripción de la imagen aquí
Luego, estos cuatro pasos se pueden obtener multiplicando la matriz y el vector.
inserte la descripción de la imagen aquí
Además, podemos calcular toda la atención y obtenerA ′ A^{'}A
inserte la descripción de la imagen aquí
mientrasb 1 b^{1}b1 es usandoviv^{i}vi lado izquierdoA ′ A^{'}Aconseguir ,
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

revisar

inserte la descripción de la imagen aquí
Figura (15)

  • I es la entrada de autoatención, y la entrada de autoatención es una fila de vectores, que se juntan como columnas de la matriz.
  • La entrada se multiplica por tres matrices wq , wk , wvw^{q} ,w^{k} , w^{v}wq ,wk ,wv obtiene Q, K, V.
  • A continuación, Q se multiplica por la transposición de K para obtener la matriz A y, después del procesamiento softmax, A ′ A^{'}A , y luego a la izquierda multiplicado por V para obtener Salida.
  • Por lo tanto, el único parámetro a aprender en autoatención es la matriz W, que es la parte que requiere entrenar la red.

ejemplo de código

El ejemplo se divide en los siguientes pasos:

  1. listo para entrar
  2. Inicializar pesos
  3. Exportar representación de clave, consulta y valor
  4. Cálculo de puntuaciones de atención
  5. Calcular softmax
  6. Multiplique las puntuaciones de atención por el valor
  7. Sume los valores ponderados para obtener la salida

Suponiendo entrada:

    Input 1: [1, 0, 1, 0]     
    Input 2: [0, 2, 0, 2]  
    Input 3: [1, 1, 1, 1]

Parámetros de inicialización

Dado que nuestra entrada son tres vectores de 4 dimensiones, la figura (15) debe multiplicarse por W desde la izquierda, y la dimensión de W se establece en (4,3),

wk , wq , wvw^{k} ,w^{q},w^{v}wk ,wq ,wv son w_key, w_query, w_value respectivamente.

   x = [
    [1,0,1,0], # 输入1
    [0,2,0,2], #输入2
    [1,1,1,1], #输入3
    ]
    x = torch.tensor(x,dtype=torch.float32)
    # 初始化权重
    w_key = [
        [0, 0, 1],
        [1, 1, 0],
        [0, 1, 0],
        [1, 1, 0]
        ]
    w_query = [
        [1, 0, 1],
        [1, 0, 0],
        [0, 0, 1],
        [0, 1, 1]
        ]
    w_value = [
        [0, 2, 0],
        [0, 3, 0],
        [1, 0, 3],
        [1, 1, 0]
        ]
    # 转化成tensor数据类型
    w_key = torch.tensor(w_key,dtype=torch.float32)
    w_query = torch.tensor(w_query, dtype=torch.float32)
    w_value = torch.tensor(w_value, dtype=torch.float32)

Ver QKV

inserte la descripción de la imagen aquí

querys = torch.tensor(np.dot(x,w_query),dtype=torch.float32)

inserte la descripción de la imagen aquí

keys = torch.tensor(np.dot(x,w_key) ,dtype=torch.float32)

calcular la atención

# get attention scorce
attention_scores = torch.tensor(np.dot(querys,keys.T))

procesamiento softmax

# 计算soft-max
attention_scores_softmax = torch.tensor( softmax(attention_scores,dim=-1) )

Multiplique las puntuaciones de atención por el valor

weight_values = values[:,None] * attention_scores_softmax.T[:,:,None]

Sume los valores ponderados para obtener la salida

outputs = weight_values.sum(dim=0)

código de prueba


import torch
import numpy as np
from torch.nn.functional import softmax
def preData():
    #
    x = [
    [1,0,1,0], # 输入1
    [0,2,0,2], #输入2
    [1,1,1,1], #输入3
    ]
    x = torch.tensor(x,dtype=torch.float32)
    # 初始化权重
    w_key = [
        [0, 0, 1],
        [1, 1, 0],
        [0, 1, 0],
        [1, 1, 0]
        ]
    w_query = [
        [1, 0, 1],
        [1, 0, 0],
        [0, 0, 1],
        [0, 1, 1]
        ]
    w_value = [
        [0, 2, 0],
        [0, 3, 0],
        [1, 0, 3],
        [1, 1, 0]
        ]
    # 转化成tensor数据类型
    w_key = torch.tensor(w_key,dtype=torch.float32)
    w_query = torch.tensor(w_query, dtype=torch.float32)
    w_value = torch.tensor(w_value, dtype=torch.float32)

    # get K, Q,V

    keys = torch.tensor(np.dot(x,w_key) ,dtype=torch.float32)
    querys = torch.tensor(np.dot(x,w_query),dtype=torch.float32)
    values = torch.tensor(np.dot(x,w_value),dtype=torch.float32)

    # get attention scorce
    attention_scores = torch.tensor(np.dot(querys,keys.T))
    print(attention_scores)
    # 计算soft-max
    attention_scores_softmax = torch.tensor( softmax(attention_scores,dim=-1) )
    print(values.shape)
    weight_values = values[:,None] * attention_scores_softmax.T[:,:,None]
    outputs = weight_values.sum(dim=0)
    return outputs

if __name__ == "__main__" :
    b = preData()
    print(b)

referencia

Supongo que te gusta

Origin blog.csdn.net/qq_41661809/article/details/124735234
Recomendado
Clasificación