当前位置: 首页 > news >正文

大模型手撕代码(一)多头注意力机制

采用bert的config用于后续写代码时使用

{ "architectures": [ "BertForMaskedLM" ], "attention_probs_dropout_prob": 0.1, "directionality": "bidi", "hidden_act": "gelu", "hidden_dropout_prob": 0.1, "hidden_size": 768, "initializer_range": 0.02, "intermediate_size": 3072, "layer_norm_eps": 1e-12, "max_position_embeddings": 512, "model_type": "bert", "num_attention_heads": 12, "num_hidden_layers": 12, "pad_token_id": 0, "pooler_fc_size": 768, "pooler_num_attention_heads": 12, "pooler_num_fc_layers": 3, "pooler_size_per_head": 128, "pooler_type": "first_token_transform", "type_vocab_size": 2, "vocab_size": 21128, "return_dict": false, "num_labels":18 }

根据config中的参数写多头注意力机制的代码

import torch import torch.nn as nn import torch.nn.functional as F import math class mha(nn.Module): def __init__(self,config): super().__init__() self.emb_dim=config.hidden_size self.num_attention_heads=config.num_attention_heads self.head_dim=self.emb_dim//self.num_attention_heads self.q_proj=nn.Linear(self.emb_dim,self.emb_dim) self.k_proj=nn.Linear(self.emb_dim,self.emb_dim) self.v_proj=nn.Linear(self.emb_dim,self.emb_dim) self.o_proj=nn.Linear(self.emb_dim,self.emb_dim) def forward(self,x,attn_mask=None): q=self.q_proj(x) k=self.k_proj(x) v=self.v_proj(x) batch_size,seq_len,_=q.size() q=q.view(batch_size,seq_len,self.num_attention_heads,self.head_dim).transpose(1,2) k=k.view(batch_size,seq_len,self.num_attention_heads,self.head_dim).transpose(1,2) v=v.view(batch_size,seq_len,self.num_attention_heads,self.head_dim).transpose(1,2) # batch_size,self.num_attention_heads,seq_len,self.head_dim attn_score=torch.matmul(q,k.transpose(-1,-2)) # batch_size,self.num_attention_heads,seq_len,seq_len dk=k.size(-1) attn_score=attn_score/math.sqrt(dk) if attn_mask is not None: attn_score=attn_score.masked_fill(attn_mask==0,-float('inf')) weights=F.softmax(attn_score,dim=-1) output=torch.matmul(weights,v) # batch_size,self.num_attention_heads,seq_len,self.head_dim output=output.transpose(1,2).contiguous().view(batch_size,seq_len,self.emb_dim) output=self.o_proj(output) return output

注意点:contiguous()

某些操作(如transpose,permute,view,reshape等)会改变张量的视图(view),而不复制数据,导致逻辑顺序与内存物理顺序不一致,即变成non-contiguous。而有些 PyTorch 操作(如view()要求输入必须是 contiguous 的,否则会报错。

http://www.jsqmd.com/news/1190946/

相关文章:

  • 计算机网络 谢希仁版核心考点精讲 期末冲刺指南
  • 芜湖防锈油漆厂家选购要点及高性能工业产品全解析 - 热点品牌推荐
  • Linux大实验 (从零构建图书管理系统:C语言实战与数据结构应用)
  • Python入门实战:从零到项目驱动的学习路径与调试思维
  • Google Sycamore量子霸权笔记:NISQ时代错误缓解与硬件实操全解析
  • Reasoning Model:面向开发者的可解释推理模块设计
  • 多模型协作AI系统:原理、优势与Fusion API实践指南
  • C++ STL prev()与next()函数:迭代器安全移动与边界控制实战指南
  • 图灵测试:从模仿游戏到AI智能的“黄金标准”
  • 软件工厂可信依赖库:守护软件供应链全链路安全
  • 电机驱动-无刷直流电机有感方波控制实战解析
  • 汽车级PMIC TPS6594-Q1:多相Buck、DVS/AVS与电源管理实战
  • 从三边到三角:一个不等式如何揭示三角形的全部秘密
  • (2026最新)威海防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • GBFR-Logs终极指南:如何用数据驱动优化你的碧蓝幻想Relink战斗表现
  • Flowable实战:自定义流程图生成器与高亮渲染进阶
  • AI镜像站实用测试指南:从功能验证到稳定落地
  • MPC轨迹跟踪算法:从双移线仿真到工程实践的关键调试与验证
  • AI求职系统:从简历生成到数据驱动的求职流程优化
  • 贪心算法实战:多机调度问题的核心策略与性能评估
  • C++物联网网关交互协议设计:从ctGateway看异步IO与插件化架构
  • 汇编语言实验进阶:从DOS功能调用到交互式密码验证程序的设计与实现
  • 从裸机到事件驱动:QP框架如何重塑单片机编程思维
  • 工业级遗传算法实战:解决局部最优与约束失效的工程方案
  • 开源组件攻击激增650%,Gitee CodePecker SCA如何用三道防线守住软件供应链
  • 多类别逻辑回归:OvR与Multinomial原理、选型与实操避坑指南
  • 2026年池州酒店推拉移门供应商实力盘点选购指南 - 热点品牌推荐
  • Medium文章精准转Markdown:DOM语义提取实战指南
  • # 串行输出与并行输出详解:原理、时序、优缺点及应用场景
  • OpenRefine数据清洗:从入门到精通,解锁高效数据预处理