注意:
1. q、k维度相同,v维度可以不同(=输出维度)
2. 矩阵乘法np.matmul(m,n)。 矩阵点乘 np.multiply(m, n)。
1.1 手写 self_attention_layer# 手写版本
import numpy as np
from numpy.random import randn
d = 256
n = 32
x = randn(d,n) #256*32
Wq = randn(d,d) #256*256
Wk = randn(d,d) #256*256
Wv = randn(d,d) #256*256
q = Wq @ x #256*32 一个词一列
k = Wk @ x #⬆️
v = Wv @ x #⬆️
A = k.T @ q #32*32
A /= np.sqrt(d) #/根号下d
def softmax(x):
e_x = np.exp(x-np.max(x)) #防溢出,最大值归一化
return e_x/e_x.sum(axis=0) #axis=0是列,是第一个维度;axis=1

![[算法导论] 手写系列 (attention & 交叉熵 & ID3) [算法导论] 手写系列 (attention & 交叉熵 & ID3)](http://www.mshxw.com/aiimages/31/822711.png)
