autoatención
Directorio de artículos
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.
- La atención propia se puede superponer muchas veces.
Las capas totalmente conectadas (FC) y la atención propia se pueden usar indistintamente.
- La autoatención procesa la información de toda la Secuencia
- FC's Network, enfocándose en el manejo de consultas desde una determinada ubicación
El proceso de Auto-Atención
-
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
-
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
-
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′′…
-
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=i∑a1 , 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
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}ai的qiq^{i}qyo _
Del mismo modo cada grupo ki , vik^{i} , v^{i}kyo ,vi también se puede calcular con una matriz,
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.
Luego, estos cuatro pasos se pueden obtener multiplicando la matriz y el vector.
Además, podemos calcular toda la atención y obtenerA ′ A^{'}A′
mientrasb 1 b^{1}b1 es usandoviv^{i}vi lado izquierdoA ′ A^{'}Aconseguir ,
revisar
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:
- listo para entrar
- Inicializar pesos
- Exportar representación de clave, consulta y valor
- Cálculo de puntuaciones de atención
- Calcular softmax
- Multiplique las puntuaciones de atención por el valor
- 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
querys = torch.tensor(np.dot(x,w_query),dtype=torch.float32)
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)