import numpy as np def encoder_layer(Q, K_transpose, V, Wq, Wk, Wv): Q_proj = np.dot(Q, Wq.T) K_proj = np.dot(K_transpose.T, Wk.T) V_proj = np.dot(V, Wv.T) attention_scores = scaled_dot_product_attention_2D(Q_proj, K_proj, V_proj) return attention_scores def calcular_pesos_proyeccion(attention_matrix): num_letras = attention_matrix.shape[0] Wq = np.zeros((num_letras, attention_matrix.shape[1])) Wk = np.zeros((num_letras, attention_matrix.shape[1])) Wv = np.zeros((num_letras, attention_matrix.shape[1])) for i in range(num_letras): Wq[i, i] = 1 Wk[i, i] = 1 Wv[i, i] = 1 return Wq, Wk, Wv def scaled_dot_product_attention_2D(Q, K_transpose, V): out = np.zeros((Q.shape[0], V.shape[1])) for i in range(Q.shape[0]): scores = np.dot(Q[i, :], K_transpose) softmax_scores = np.exp(scores - np.max(scores)) / np.sum(np.exp(scores - np.max(scores))) out[i, :] = np.dot(softmax_scores, V) return out