querys 是2*6*2keys也是2*6*2attn_scoresquerys keys.transpose(1,2)attn_scores 最终维度是 2×6×6数值上是两个矩阵的批量矩阵乘法结果每个样本对应一个 6×6 的注意力分数矩阵transpose(1,2) 交换 keys 的第 1 维和第 2 维keys 原始维度[2, 6, 2] → 交换后[2, 2, 6]第一个位置批维度不变PyTorch 中是批量矩阵乘法规则对于维度为 [B, M, N] 的张量 A 和 [B, N, P] 的张量 BAB 的结果维度是 [B, M, P]B 是批次保持不变M×N 乘 N×P 得到 M×Pimporttorch# 1. 构造querys和keys维度2×6×2用简单数值方便计算querystorch.tensor([# 第0个样本6个token每个token2维[[1,0],[2,1],[0,1],[3,2],[1,1],[0,0]],# 第1个样本6个token每个token2维[[0,1],[1,0],[2,2],[1,2],[0,2],[2,1]]],dtypetorch.float32)# shape(2,6,2)keystorch.tensor([# 第0个样本的keys和querys结构一致[[1,2],[0,1],[1,0],[2,1],[0,2],[1,1]],# 第1个样本的keys[[2,0],[1,1],[0,2],[2,1],[1,0],[0,2]]],dtypetorch.float32)# shape(2,6,2)# 2. 执行transpose和矩阵乘法keys_Tkeys.transpose(1,2)# shape(2,2,6)attn_scoresquerys keys_T# shape(2,6,6)# 3. 输出结果print(attn_scores维度,attn_scores.shape)# 输出torch.Size([2, 6, 6])print(\n第0个样本的注意力分数矩阵6×6)print(attn_scores[0].numpy())# 每个值是query token和key token的点积输出结果解读attn_scores维度 torch.Size([2, 6, 6])第0个样本的注意力分数矩阵6×6[[ 1. 0. 1. 2. 0. 1.] # 第0个query token对6个key token的分数 [ 4. 1. 2. 5. 2. 3.] # 第1个query token对6个key token的分数 [ 2. 1. 0. 1. 2. 1.] [ 7. 2. 3. 8. 4. 5.] [ 3. 1. 1. 3. 2. 2.] [ 0. 0. 0. 0. 0. 0.]]数值计算验证以第 0 个样本的第 0 个 query token 为例querys[0,0] [1, 0]keys [0,:, :] 6 个 key token 的 2 维向量和第 0 个 key token [1,2] 的点积1×1 0×2 1 → 对应矩阵 [0,0] 位置的 1和第 1 个 key token [0,1] 的点积1×0 0×1 0 → 对应矩阵 [0,1] 位置的 0… …最终得到 6×6 矩阵每个位置的值是「query 的第 i 个 token」和「key 的第 j 个 token」的点积即注意力分数核心意义大模型注意力机制中的关注程度6×6 的矩阵就是注意力分数矩阵含义是每个样本有 6 个 token矩阵中 attn_scores[b, i, j] 代表「第 b 个样本中第 i 个 token 对第 j 个 token 的关注程度」后续会对这个矩阵做dropout、softmax归一化得到和为 1 的注意力权重再和 values 相乘实现 “每个 token 融合其他 token 的信息”维度结论attn_scores 2×6×6batch2每个样本对应 6×6 的注意力分数矩阵计算逻辑批量矩阵乘法[2,6,2][2,2,6] → [2,6,6]数值意义每个元素是 query token 和 key token 的点积代表二者的相似度注意力分数dropout训练过程中随机忽略一些隐藏层单元来有效“丢弃”它们减少模型对特定隐藏层单元的依赖避免过拟合同时dropout仅在训练期间使用nn.Dropout对输入张量的每个元素以概率p默认0.5随机设置为0同时将未被设置0的元素乘以 1/(1-p) 进行缩放保证输入的期望均值不变importtorchimporttorch.nnasnn# 1. 定义Dropout层p0.5dropoutnn.Dropout(p0.5)# 2. 构造输入张量值全为10方便计算均值xtorch.ones(10000)*10# 1万个元素每个都是10print(原始输入均值,x.mean().item())# 输出10.0# 3. 训练模式下执行Dropout默认trainTruetorch.manual_seed(42)# 固定随机种子结果可复现x_dropdropout(x)# 4. 计算Dropout后的均值print(Dropout后均值,x_drop.mean().item())# 输出≈10.0因随机采样略有浮动print(Dropout后非零元素值,x_drop[x_drop!0][0].item())# 输出20.010×2# 5. 验证模式下evalDropout不生效dropout.eval()x_drop_evaldropout(x)print(验证模式下均值,x_drop_eval.mean().item())# 输出10.0无任何变化Dropout 是大模型GPT/BERT/LLaMA中防止过拟合的核心手段主要用在这些位置全连接层FeedForward大模型的 FFN 层如 GPT 的 MLP会在激活函数后加 Dropoutp0.1~0.3注意力层Attention部分模型会在注意力权重计算后加 Dropout防止对个别 token 过度关注嵌入层Embedding少量模型会在词嵌入后加 Dropout降低高频词的过拟合风险大模型中的FFN 层是Feed-Forward Network前馈网络的缩写也常被称作Position-wise Feed-Forward Network逐位置前馈网络是 Transformer 架构GPT/BERT/LLaMA 等大模型的核心骨架中编码器 / 解码器层的核心组件之一和多头注意力层Multi-Head Attention并列成为 Transformer 的两大核心模块