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

别再死记硬背了!用PyTorch代码逐行拆解Transformer中的QKV矩阵计算

用PyTorch代码逐行拆解Transformer中的QKV矩阵计算在自然语言处理领域Transformer架构已经成为事实上的标准。但很多开发者发现仅通过理论图示理解其核心的注意力机制仍然存在困难。本文将带你用PyTorch代码从零开始实现QKV矩阵的计算过程通过实际运行和调试来直观感受信息流动。1. 准备工作与环境搭建首先确保你的开发环境已经安装了最新版本的PyTorch。如果你使用Colab可以直接运行以下代码安装!pip install torch torchvision接下来导入必要的库import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt为了更清晰地观察矩阵变化我们定义一个辅助函数来打印张量信息def print_tensor_info(name, tensor): print(f{name}: shape{tensor.shape}, dtype{tensor.dtype}) print(tensor)2. 基础QKV计算实现让我们从最基本的单头注意力开始理解QKV矩阵的生成过程。2.1 定义线性变换层在Transformer中QKV矩阵是通过对输入进行线性变换得到的class SelfAttention(nn.Module): def __init__(self, embed_size, heads): super(SelfAttention, self).__init__() self.embed_size embed_size self.heads heads self.head_dim embed_size // heads assert ( self.head_dim * heads embed_size ), Embedding size needs to be divisible by heads self.values nn.Linear(embed_size, embed_size) self.keys nn.Linear(embed_size, embed_size) self.queries nn.Linear(embed_size, embed_size) self.fc_out nn.Linear(embed_size, embed_size)2.2 生成QKV矩阵现在我们实现前向传播过程观察QKV矩阵的实际计算def forward(self, values, keys, query, mask): N query.shape[0] # 批大小 value_len, key_len, query_len values.shape[1], keys.shape[1], query.shape[1] # 线性变换得到QKV values self.values(values) # (N, value_len, embed_size) keys self.keys(keys) # (N, key_len, embed_size) queries self.queries(query) # (N, query_len, embed_size) # 打印变换后的矩阵形状 print_tensor_info(Values after linear, values) print_tensor_info(Keys after linear, keys) print_tensor_info(Queries after linear, queries) # 分割多头 values values.reshape(N, value_len, self.heads, self.head_dim) keys keys.reshape(N, key_len, self.heads, self.head_dim) queries queries.reshape(N, query_len, self.heads, self.head_dim) # 更多调试信息...3. 三种注意力机制的QKV实现差异Transformer中有三种不同的注意力机制它们的QKV来源各不相同。让我们分别实现并观察差异。3.1 编码器自注意力在编码器自注意力中QKV都来自同一个输入# 模拟编码器输入 batch_size 2 seq_length 5 embed_size 512 dummy_input torch.randn(batch_size, seq_length, embed_size) # 初始化注意力层 encoder_attention SelfAttention(embed_size, heads8) # 自注意力QKV都来自同一输入 Q encoder_attention.queries(dummy_input) K encoder_attention.keys(dummy_input) V encoder_attention.values(dummy_input) print(Encoder Self-Attention:) print_tensor_info(Q, Q) print_tensor_info(K, K) print_tensor_info(V, V)3.2 解码器自注意力解码器自注意力需要添加掩码防止看到未来信息# 模拟解码器输入 decoder_input torch.randn(batch_size, seq_length, embed_size) # 生成掩码 mask torch.tril(torch.ones(seq_length, seq_length)).expand( batch_size, 1, seq_length, seq_length ) decoder_attention SelfAttention(embed_size, heads8) Q decoder_attention.queries(decoder_input) K decoder_attention.keys(decoder_input) V decoder_attention.values(decoder_input) print(\nDecoder Masked Self-Attention:) print_tensor_info(Mask, mask) print_tensor_info(Q, Q) print_tensor_info(K, K) print_tensor_info(V, V)3.3 编码器-解码器注意力这是跨注意力机制Q来自解码器KV来自编码器# 模拟编码器输出 encoder_output torch.randn(batch_size, seq_length, embed_size) cross_attention SelfAttention(embed_size, heads8) Q cross_attention.queries(decoder_input) # Q来自解码器 K cross_attention.keys(encoder_output) # K来自编码器 V cross_attention.values(encoder_output) # V来自编码器 print(\nEncoder-Decoder Attention:) print_tensor_info(Q (from decoder), Q) print_tensor_info(K (from encoder), K) print_tensor_info(V (from encoder), V)4. 注意力计算与可视化理解了QKV的来源后让我们实现完整的注意力计算过程。4.1 计算注意力分数def scaled_dot_product_attention(Q, K, V, maskNone): d_k Q.size(-1) attention_scores torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k)) if mask is not None: attention_scores attention_scores.masked_fill(mask 0, float(-1e20)) attention_weights F.softmax(attention_scores, dim-1) output torch.matmul(attention_weights, V) return output, attention_weights4.2 可视化注意力权重让我们可视化三种不同注意力机制的权重分布def plot_attention(attention_weights, title): plt.figure(figsize(10, 5)) plt.imshow(attention_weights[0, 0].detach().numpy(), cmapviridis) plt.colorbar() plt.title(title) plt.xlabel(Key Positions) plt.ylabel(Query Positions) plt.show() # 编码器自注意力 encoder_output, encoder_weights scaled_dot_product_attention(Q, K, V) plot_attention(encoder_weights, Encoder Self-Attention Weights) # 解码器自注意力带掩码 decoder_output, decoder_weights scaled_dot_product_attention(Q, K, V, mask) plot_attention(decoder_weights, Decoder Masked Self-Attention Weights) # 编码器-解码器注意力 cross_output, cross_weights scaled_dot_product_attention(Q, K, V) plot_attention(cross_weights, Encoder-Decoder Attention Weights)5. 多头注意力实现最后我们实现完整的多头注意力机制观察QKV在多个头中的不同表现。5.1 多头注意力前向传播def forward(self, values, keys, query, mask): N query.shape[0] value_len, key_len, query_len values.shape[1], keys.shape[1], query.shape[1] values self.values(values) # (N, value_len, embed_size) keys self.keys(keys) # (N, key_len, embed_size) queries self.queries(query) # (N, query_len, embed_size) # 分割多头 values values.reshape(N, value_len, self.heads, self.head_dim) keys keys.reshape(N, key_len, self.heads, self.head_dim) queries queries.reshape(N, query_len, self.heads, self.head_dim) # 计算注意力 energy torch.einsum(nqhd,nkhd-nhqk, [queries, keys]) if mask is not None: energy energy.masked_fill(mask 0, float(-1e20)) attention torch.softmax(energy / (self.embed_size ** (1/2)), dim3) out torch.einsum(nhql,nlhd-nqhd, [attention, values]).reshape( N, query_len, self.heads * self.head_dim ) out self.fc_out(out) return out5.2 观察不同头的注意力模式# 初始化多头注意力 multihead_attn SelfAttention(embed_size512, heads8) # 编码器自注意力 output multihead_attn(dummy_input, dummy_input, dummy_input, None) # 提取第一个样本的第一个token在各头的注意力权重 sample_weights attention[0, :, 0, :] # (heads, key_len) # 绘制各头的注意力模式 plt.figure(figsize(12, 6)) for i in range(8): plt.subplot(2, 4, i1) plt.plot(sample_weights[i].detach().numpy()) plt.title(fHead {i1}) plt.tight_layout() plt.show()通过实际运行这些代码你可以清晰地看到QKV矩阵在不同注意力机制中的生成过程和数据流动。这种动手实践的方式比单纯看理论图示更能加深对Transformer核心机制的理解。

相关文章:

别再死记硬背了!用PyTorch代码逐行拆解Transformer中的QKV矩阵计算

用PyTorch代码逐行拆解Transformer中的QKV矩阵计算 在自然语言处理领域,Transformer架构已经成为事实上的标准。但很多开发者发现,仅通过理论图示理解其核心的注意力机制仍然存在困难。本文将带你用PyTorch代码从零开始实现QKV矩阵的计算过程&#xff0c…...

忍者像素绘卷:天界画坊Python入门实战:零基础AI绘画环境搭建

忍者像素绘卷:天界画坊Python入门实战:零基础AI绘画环境搭建 1. 前言:为什么选择像素风格AI绘画 像素艺术近年来在独立游戏、数字艺术领域持续升温。这种复古又充满创意的表现形式,让许多开发者跃跃欲试。但传统像素画需要扎实的…...

房屋建筑学-门窗

一、门窗概述门窗的作用——采光、通风、通行(按照国家相应的规范要求,一般居住建筑的起居室、卧室的窗户面积不应小于地板面积的1/7;公建建筑方面,学校为1/5,医院手术室为1/2~1/3,辅助房间为1/12&#xff…...

openclaw v2026.4.1 发布!16 大核心功能升级 + 28 项关键修复,AI 智能体网关全面进化,稳定性与安全性再攀高峰

一、前言:开源AI智能体标杆再升级,v2026.4.1引领本地自动化新潮流 2026年4月2日,开源AI智能体执行网关领域的标杆项目OpenClaw正式推出v2026.4.1最新版本。作为一款主打本地优先、自托管、全开源的AI智能体框架,OpenClaw自诞生以来…...

javaee-网络原理2

⽹络原理-TCP/IP ①应用层:规则 → 格式 → 实际用途讲解↓ (1)定义应用之间怎么通信比如:浏览器怎么请求网页、APP 怎么跟服务器发数据。 谁先说话什么时候发请求什么时候回响应出现错误怎么办一次会话怎么开始、怎么结束 比如 HTTP 协议就明确规定&…...

工业控制C++安全生命周期管理缺失的5个致命断点(某汽车电池BMS项目因第4点导致ASIL-B降级,完整V模型追溯报告首次公开)

第一章:工业控制C安全生命周期管理缺失的5个致命断点(某汽车电池BMS项目因第4点导致ASIL-B降级,完整V模型追溯报告首次公开) 在高完整性工业控制系统中,C代码的安全生命周期管理远非“编译通过即交付”。某头部车企BMS…...

Qwen-Image-2512像素艺术生成实操:Gradio界面各参数作用与推荐值

Qwen-Image-2512像素艺术生成实操:Gradio界面各参数作用与推荐值 1. 快速上手像素艺术生成 想创作复古游戏风格的像素画?Qwen-Image-2512结合Pixel Art LoRA的解决方案让你轻松实现。这个服务特别适合游戏开发者、独立艺术家和怀旧风格爱好者&#xff…...

网站的页面加载速度和SEO有什么关系

网站的页面加载速度和SEO有什么关系 在当今互联网时代,网站的页面加载速度和SEO(搜索引擎优化)之间的关系是一个不可忽视的重要问题。在用户体验和搜索引擎排名方面,页面加载速度起着至关重要的作用。本文将从问题分析、原因说明…...

从Eclipse转IntelliJ IDEA的老司机踩坑记:20个必改设置让你的迁移过程更顺滑

从Eclipse转IntelliJ IDEA的老司机踩坑记:20个必改设置让你的迁移过程更顺滑 第一次打开IntelliJ IDEA时,那种既熟悉又陌生的感觉会让任何Eclipse老手感到不安。菜单栏去哪了?我的项目视图怎么变了?为什么快捷键全都不对&#xff…...

intv_ai_mk11开源镜像深度解析:为何选择Llama架构+7B规模+Q4量化黄金组合

intv_ai_mk11开源镜像深度解析:为何选择Llama架构7B规模Q4量化黄金组合 1. 为什么选择Llama架构7B规模Q4量化组合 在构建AI对话机器人时,模型架构、参数规模和量化方式的选择直接影响最终效果和部署成本。intv_ai_mk11采用的Llama架构7B参数Q4量化组合…...

网站纠错页面对 SEO 有什么作用_网站图片和视频优化对 SEO 有什么技巧

网站纠错页面对 SEO 有什么作用 在网站管理和搜索引擎优化(SEO)方面,纠错页面的作用常常被忽视。网站纠错页面实际上对 SEO 有着重要的影响。当用户访问一个网站时,如果遇到 404 错误(页面未找到)或其他错…...

Open-AutoGLM场景实战:电商购物、出行旅游、内容浏览一键完成

Open-AutoGLM场景实战:电商购物、出行旅游、内容浏览一键完成 1. 引言:手机AI助手的革命性突破 想象一下这样的场景:早上醒来,你对手机说"帮我订一杯星巴克拿铁和一份三明治",手机自动完成打开外卖应用、选…...

Jimeng LoRA效果对比:不同GPU型号(3090/4090/A10/A100)显存占用实测

Jimeng LoRA效果对比:不同GPU型号(3090/4090/A10/A100)显存占用实测 1. 项目简介 今天给大家带来一个特别实用的技术评测——Jimeng(即梦)LoRA模型在不同GPU上的显存占用实测。如果你正在纠结该用哪款显卡来跑AI绘画…...

Qwen3-VL-2B-Instruct保姆级教程:视觉对话机器人部署

Qwen3-VL-2B-Instruct保姆级教程:视觉对话机器人部署 1. 环境准备与快速部署 想要体验AI视觉对话的神奇能力吗?Qwen3-VL-2B-Instruct让你不用昂贵的显卡也能拥有一个能"看懂"图片的智能助手。这个教程将手把手带你完成整个部署过程&#xff…...

PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集

PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集 想象一下,你手头有一份满是复杂表格和数学公式的PDF学术论文,或者一份财务报告。你需要把里面的数据提取出来,做成Excel表格进行分析,或者把那些复杂…...

文脉定序保姆级教程:3步完成BGE-Reranker-v2-m3镜像免配置部署

文脉定序保姆级教程:3步完成BGE-Reranker-v2-m3镜像免配置部署 你是否遇到过这样的烦恼?用自己搭建的知识库或者搜索引擎提问,系统确实返回了一大堆结果,但最相关、最准确的答案却淹没在列表的中间甚至末尾。传统的检索方法&…...

Llama-3.2V-11B-cot效果展示:模型对‘正常但可疑’图像模式的异常检测能力

Llama-3.2V-11B-cot效果展示:模型对正常但可疑图像模式的异常检测能力 1. 模型能力概览 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专门针对双卡4090环境进行了深度优化。该模型具备以下核心能力&#xf…...

开源轻量模型新星:Qwen1.5-0.5B-Chat部署趋势分析

开源轻量模型新星:Qwen1.5-0.5B-Chat部署趋势分析 1. 项目概述 Qwen1.5-0.5B-Chat是阿里通义千问开源系列中的轻量级智能对话模型,基于ModelScope(魔塔社区)生态构建。这个仅有5亿参数的模型在保持良好对话能力的同时&#xff0…...

Pixel Couplet Gen效果展示:基于用户画像(年龄/地域)的像素春联风格个性化推荐

Pixel Couplet Gen效果展示:基于用户画像(年龄/地域)的像素春联风格个性化推荐 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型的强大生成能力,结合精心设计的8-…...

低成本GPU算力玩转大模型编剧:Pixel Script Temple双卡并行部署实操手册

低成本GPU算力玩转大模型编剧:Pixel Script Temple双卡并行部署实操手册 1. 项目概述 Pixel Script Temple是一款专为剧本创作设计的AI工具,基于Qwen2.5-14B-Instruct大模型深度微调而成。它最大的特点是能够在消费级GPU硬件上实现高效运行&#xff0c…...

数仓分层设计避坑指南:从ODS到ADS,我的团队踩过的5个典型雷区与优化方案

数仓分层设计避坑指南:从ODS到ADS,我的团队踩过的5个典型雷区与优化方案 三年前接手公司数据中台重构项目时,我们团队曾天真地认为数仓分层不过是教科书式的流程化操作。直到某次大促期间,凌晨三点被警报吵醒——ADS层报表查询超时…...

OpenClaw v2026.4.1 深度剖析报告:任务系统、协作生态与安全范式的全面跃迁

摘要本报告旨在对 OpenClaw 于 2026 年 4 月 2 日发布的 v2026.4.1 版本进行一次全面、深入、颗粒度至极的技术与战略解构。该版本由 30 余位社区贡献者共同完成,标志着 OpenClaw 在经历了 3 月份“架构重塑”与“安全加固”的底层革命后,正式迈入“体验…...

Phi-4-mini-reasoning从零开始:学生自学AI推理工具搭建全过程

Phi-4-mini-reasoning从零开始:学生自学AI推理工具搭建全过程 1. 为什么选择Phi-4-mini-reasoning 作为一名对AI技术充满好奇的学生,我一直在寻找一个适合自学的推理模型。Phi-4-mini-reasoning以其专注推理任务的特点吸引了我。与通用聊天模型不同&am…...

Git【企业级开发模型】

一、为什么需要企业级开发模型? 一个软件从零开始到最终交付,大致需要经历:规划 → 编码 → 构建 → 测试 → 发布 → 部署 → 维护。在个人项目中,你一个人可以完成所有环节。但在企业中,角色分工明确: 开…...

支持RTX 30/40系显卡:PyTorch-2.x-Universal-Dev-v1.0镜像GPU验证指南

支持RTX 30/40系显卡:PyTorch-2.x-Universal-Dev-v1.0镜像GPU验证指南 1. 引言:为什么需要验证GPU环境 在深度学习项目开发中,GPU加速是提升模型训练效率的关键因素。特别是对于RTX 30/40系列显卡用户,正确配置CUDA环境与PyTorc…...

OpenClaw移动端适配:通过飞书调用Kimi-VL-A3B-Thinking多模态服务

OpenClaw移动端适配:通过飞书调用Kimi-VL-A3B-Thinking多模态服务 1. 为什么需要移动端适配 作为一个长期依赖OpenClaw进行本地自动化任务的用户,我最近遇到了一个痛点:当我在户外或出差时,无法方便地使用OpenClaw的强大功能。虽…...

Qwen3-1.7B能做什么?实测写邮件、生成故事、智能聊天

Qwen3-1.7B能做什么?实测写邮件、生成故事、智能聊天 1. 认识Qwen3-1.7B Qwen3(千问3)是阿里巴巴集团开源的新一代通义千问大语言模型系列中的一员,1.7B版本虽然参数量不大,但在日常应用中表现出色。这个17亿参数的模…...

YOLO X Layout快速部署:Docker一键启动,开箱即用

YOLO X Layout快速部署:Docker一键启动,开箱即用 1. 简介与核心价值 你是否经常需要处理大量文档图片,却苦于手动标注各种元素区域?YOLO X Layout正是为解决这个问题而生的智能工具。它能自动识别文档中的文本、表格、图片、标题…...

Qwen3-14B向量数据库集成:Chroma/Milvus接入与混合检索配置

Qwen3-14B向量数据库集成:Chroma/Milvus接入与混合检索配置 1. 引言:为什么需要向量数据库集成 当你部署了强大的Qwen3-14B大模型后,很快会发现一个关键问题:如何让模型记住并快速检索大量知识?这就是向量数据库的价…...

像素剧本圣殿参数详解:Qwen2.5-14B-Instruct温度值、top_p与剧本创意波动关系

像素剧本圣殿参数详解:Qwen2.5-14B-Instruct温度值、top_p与剧本创意波动关系 1. 创作引擎核心参数解析 像素剧本圣殿的核心创作能力源自Qwen2.5-14B-Instruct模型,其中温度值(temperature)和top_p参数直接影响剧本生成的创意表现。这两个参数就像导演…...