公司动态

【Datawhale2607】llm-algo-leetcode task01 PyTorch入门

📅 2026/7/16 3:21:42
【Datawhale2607】llm-algo-leetcode task01 PyTorch入门
task01 PyTorch入门文章目录前言一、PyTorch Warmup1.1 本章通关地图1.2 Boss 1: 张量维度变换与 einops1.2.1 核心知识点1.2.2 Einops1.2.3 Einops 三大核心API详解1.2.3.1 rearrange 重排1.2.3.2 reduce 重排降维聚合1.2.3.3 repeat 重排复制广播1.3 Boss 2: 嵌入层 (Embedding) 的本质1.3.1 前置知识1.3.2 Embedding 本质Boss 3: 前向与反向传播 (Forward Backward)总结前言Datawhale教程地址一、PyTorch Warmup1.1 本章通关地图Boss 1: 张量维度变换 (Tensor Reshaping) —— 搞定多头注意力和 Vision Transformer 的基石。Boss 2: 嵌入层查表 (Embedding Lookup) —— 理解离散文本如何变成连续向量。Boss 3: 自定义前向与反向传播 (Autograd) —— 面试必考的手推反向传播理解大模型训练的底层引擎。1.2 Boss 1: 张量维度变换与 einops1.2.1 核心知识点permute改变维度的顺序物理内存不连续但逻辑视图改变。reshape改变维度的形状要求内存是连续的或逻辑上可安全展平。einops工业界神器用字符串直接声明维度变换的语义代码即文档。1.2.2 EinopsPypieinops 是一个为张量操作提供可读、可靠且灵活接口的 Python 库。它的名字来源于“爱因斯坦求和约定 (Einstein summation convention)”但它比传统的 torch.einsum 更易读、更强大。在深度学习和机器学习里张量操作几乎是每天都要打交道的基本功。而 Einops 这个 Python 库做了一件很实在的事它用一种更直观、更接近人类思维的方式让你摆弄张量代码写出来干净利落别人看一眼也秒懂维护起来省心不少。Einops换了一套操作张量的写法——用简单的字符串表达式就能说清楚你想怎么变换数据。它把复杂的张量操作拆解成对“轴”的处理。简单用法介绍# 导入模块importtorchfromeinopsimportrearrange,reduce,repeat# 1. rearrange 重新排列张量维度# 创建一个 3x4 的张量xtorch.randn(3,4)# 将其转换为 4x3 的张量yrearrange(x,h w - w h)print(y.shape)# 输出: torch.Size([4, 3])# 2. reduce 对张量进行归约操作# 创建一个 3x4 的张量xtorch.randn(3,4)# 按行求和yreduce(x,h w - h,sum)print(y.shape)# 输出: torch.Size([3])# 3. repeat 重复张量# 创建一个长度为 3 的向量xtorch.randn(3)# 将其重复 4 次yrepeat(x,w - w r,r4)print(y.shape)# 输出: torch.Size([3, 4])1.2.3 Einops 三大核心API详解1.2.3.1 rearrange 重排作用改变张量的形状和维度顺序相当于reshapepermute的完美结合。语法rearrange(tensor, 输入模式 - 输出模式, **维度参数)importtorchimporteinops xtorch.randn(2,10,256)# [batch2, seq_len10, hidden_dim256]# 场景 1拆分维度 (Decomposition)# 将 hidden_dim (256) 拆分为 8 个 head每个 head_dim 为 32# 注意(h d) 表示这两个维度在输入时是合并在一起的out1einops.rearrange(x,b s (h d) - b s h d,h8)print(out1.shape)# torch.Size([2, 10, 8, 32])# 场景 2合并维度 (Composition)# 将上一步的结果还原回去out2einops.rearrange(out1,b s h d - b s (h d))print(out2.shape)# torch.Size([2, 10, 256])# 场景 3改变顺序 (Permutation)# 在 Attention 计算中我们通常需要把 head 维度放到 seq 前面以便并行计算out3einops.rearrange(out1,b s h d - b h s d)print(out3.shape)# torch.Size([2, 8, 10, 32])1.2.3.2 reduce 重排降维聚合作用在改变张量形状的同时对指定的维度进行聚合操作如求和sum、平均mean、最大值max等。相当于rearrange后接torch.sum/mean但一步到位。语法reduce(tensor, 输入模式 - 输出模式, reductionmean, **维度参数)xtorch.randn(2,3,224,224)# [batch, channels, height, width] (如图像特征)# 场景全局平均池化 (Global Average Pooling)# 将 height(h) 和 width(w) 维度“约掉”(reduce)替换为无维度的聚合结果outeinops.reduce(x,b c h w - b c,reductionmean)print(out.shape)# torch.Size([2, 3])1.2.3.3 repeat 重排复制广播作用在改变张量形状的同时沿新维度或现有维度复制数据以填充更大的形状。相当于unsqueezeexpand/repeat但写起来更直观。语法repeat(tensor, 输入模式 - 输出模式, **维度参数)xtorch.randn(256,256)# 一个没有 batch 维度的权重矩阵 [hidden, hidden]batch_size4# 场景为权重矩阵添加 batch 维度并复制 batch_size 份outeinops.repeat(x,h1 h2 - b h1 h2,bbatch_size)print(out.shape)# torch.Size([4, 256, 256])1.3 Boss 2: 嵌入层 (Embedding) 的本质大模型处理的是人类语言离散的符号但神经网络只能处理连续的浮点数。Embedding层就是连接这两个世界的“翻译官”。在LLM中它通常是模型的第一层输入和最后一层输出LM Head。1.3.1 前置知识Token ID经过分词器Tokenizer处理后每个词或子词被映射为一个整数例如1024。One-hot 编码一种表示离散变量的方法。如果词表大小V 10000 V10000V10000第 5 个词的 One-hot 向量就是[0,0,0,0,1,0...0]长度 10000只有第 5 位是 1。稠密向量 (Dense Vector)维度较低如 4096且每个维度都有非零实数值的向量。它能捕捉语义信息。1.3.2 Embedding 本质文本是离散的Token IDs如 [10, 42, 99]。神经网络只能处理连续的稠密向量Dense Vectors。Embedding层的本质 就是一个大规模的查表Lookup Table。给定一个 ID 列表它直接把对应的行向量抽出来拼在一起。 它在数学上等价于把离散的 ID 转换成One-hot向量然后去乘以一个全连接层Linear。defembedding_warmup(input_ids:torch.Tensor,vocab_size:int,hidden_dim:int): 演示 Embedding 查表的过程并用纯 Tensor 索引模拟它。 Args: input_ids: 形状 [batch_size, seq_len]包含整数类型的 Token IDs # 这一段先把“词表查表”这个抽象过程落成官方实现。# 先看 nn.Embedding 如何工作再手写索引复现同样的输出。# # TODO 2.1: 实例化一个官方的 nn.Embedding并用其进行前向传播# # emb_layer ???# 1.实例化 Embedding 层在 PyTorch 内部就是创建一个 nn.Parameter 矩阵, 形状为 [vocab_size, hidden_dim]emb_layernn.Embedding(num_embeddingsvocab_size,embedding_dimhidden_dim)# 初始化emb_layer.weight.data.normal_(0,0.1)# 随便初始化一下# out_official ???# 这里不再调用 nn.Embedding而是直接用权重矩阵做索引。# 这样可以把“Embedding 本质上就是查表”这件事看得更直观。# # TODO 2.2: 使用纯 PyTorch 张量索引 (Advanced Indexing)不使用 nn.Embedding# 达到和上面官方 API 完全一模一样的输出。# 提示: Embedding 的本质是查表思考如何用索引从权重矩阵中提取向量# # out_manual ???returnout_official,out_manualBoss 3: 前向与反向传播 (Forward Backward)PyTorch最核心的魔法就是Autograd自动求导。它通过构建动态计算图在前向传播时记录操作在反向传播时利用链式法则自动计算梯度。总结