【3D点云暑期学习】精读笔记(1)Attention Is All You Need研0暑期进组学习 · 3D点云多模态方向 · 论文精读系列第 1 篇论文信息标题Attention Is All You Need作者Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin发表venueNeurIPS 2017阅读日期2026年6月写在前面这篇论文是整个深度学习领域的分水岭。在 2017 年之前序列建模几乎被 RNN/LSTM 统治之后注意力机制成为了所有任务的通用语言。为什么一个做 3D 点云方向的研究生要从 Transformer 读起因为后续所有要读的论文——ViT 把图像变成序列、CLIP 用双塔对比学习、ULIP 把 3D 点云对齐到图文空间、Uni3D 用 2D 预训练的 ViT 做 3D 编码器——它们的底层全部是 Transformer。不懂 Transformer后面的一切都是空中楼阁。所以第一周从这篇论文开始把根基打牢。一、为什么序列到序列建模不再需要 RNN/CNN纯注意力即可这是整篇论文最核心的命题。论文标题 “Attention Is All You Need” 本身就是答案——你只需要注意力不需要循环也不需要卷积。下面从四个角度理解为什么。1.1 并行化的根本性解放打破时序枷锁RNN 的致命伤RNN 在时间步 t 的计算必须依赖 t−1 的隐状态 h_{t-1}。这意味着计算必须一步步串行执行无法并行。当序列长度为 n 时RNN 必须执行O(n) 次顺序操作。Transformer 的解法自注意力机制同时计算序列中所有位置之间的相关性。Transformer 的最小顺序操作次数为O(1)而 RNN 为 O(n)。这使得在 GPU 上所有位置的矩阵乘法可以一次性完成训练时间从数周压缩到几天——论文中用 8 个 GPU 仅需 3.5 天即达到 SOTA。1.2 极短的信号传播路径攻克长程依赖学习长距离依赖是序列建模的噩梦RNN 和 CNN 都受限于路径长度。RNN 的困境信号必须沿着时间链一步步反向传播路径长度与序列长度 n 成正比极易梯度消失。CNN 的困境卷积核受限于局部感受野要连接远距离位置需要堆叠多层如 ByteNet 需要 O(log_k n) 层ConvS2S 需要 O(n/k) 层。Transformer 的革命自注意力机制将任意两个输入或输出位置之间的最大路径长度降为O(1)。无论两个词相隔多远模型计算它们相关性的计算路径都只有一步之距极大降低了学习全局依赖的难度。1.3 复杂度与维度的博弈计算效率依然能打很多人担心自注意力的 O(n²) 复杂度但论文给出了其在常见场景下的优势在机器翻译等任务中序列长度 n句子长度通常小于表征维度 d论文设为 512。通常的英文句子在分词后都没有 512 个词而表征维度 d 一般设置得比较大是因为在深度学习实践中为了确保模型有足够的容量去拟合复杂任务嵌入维度通常设为 256、512、1024。如论文表 1 所示层类型复杂度顺序操作数最大路径长度Self-AttentionO(n²·d)O(1)O(1)RNNO(n·d²)O(n)O(n)ConvolutionalO(k·n·d²)O(1)O(log_k n)由于 n d自注意力层复杂度 O(n²·d) 在计算量上甚至比 RNN 的 O(n·d²) 更便宜。对于极长序列论文也提出了受限自注意力Restricted Self-attention作为后备方案但默认设置下纯注意力已经足够高效。1.4 多头的子空间加持提升表征能力论文强调纯注意力之所以能生效不仅因为它替代了 RNN还因为它变得更强。通过多头注意力Multi-Head Attention模型允许不同的注意力头关注不同的表示子空间如语法、语义、指代消解。这是单头注意力或 RNN 隐状态混为一谈所不具备的优势进一步证明了纯注意力不仅够用而且更灵活。二、如何处理顺序信息唯一的补丁既然摒弃了循环和卷积模型如何感知词的位置这是论证中最关键的一环。2.1 位置编码原理论文并没有说位置信息不重要而是用位置编码Positional Encoding作为注入信息。它是通过正弦/余弦函数直接加到输入嵌入上的。重点位置编码仅仅是输入特征的一部分而后续所有语义关系的建模完全由注意力权重的点积计算完成不再依赖于位置链式的传递。这证明了顺序可以通过特征携带而不必通过计算流程强绑。2.2 数值示例我爱你的位置编码假设输入序列是[我, 爱, 你]维度 d4简化步骤词向量语义位置向量坐标最终输入模型的数据“我” (pos0)[0.5, 0.1, 0.3, 0.8][0.0, 1.0, 0.0, 1.0] (sin/cos生成)[0.5, 1.1, 0.3, 1.8]“爱” (pos1)[0.2, 0.9, 0.4, 0.1][0.84, 0.54, 0.91, -0.41][1.04, 1.44, 1.31, -0.31]“你” (pos2)[0.7, 0.3, 0.6, 0.5][0.91, -0.41, 0.14, -0.75][1.61, -0.11, 0.74, -0.25]最终模型拿到的[0.5, 1.1, 0.3, 1.8]这个数字既包含了我是’我’这个字的信息也包含了我是句子里的第 1 个词的信息。核心哲学它不是把位置当作标签贴上去拼接而是把位置当作时空坐标混进语义里。因为在神经网络中数字的大小只有相对意义模型通过这种叠加扰动可以自主地通过自注意力机制去挖掘这个扰动代表距离多远从而完美解决了无顺序的难题。2.3 为什么偏偏用正弦/余弦函数很多人以为正弦/余弦只是为了生成一个唯一的坐标值其实它的核心妙处在于**“线性相对位置表达”**。论文原话提到如果单纯用数字 1, 2, 3, 4 来做位置编码模型学到的只有绝对距离。但正弦/余弦函数有一个绝佳的数学性质位置 posk 的编码可以由位置 pos 的编码经过一个线性变换旋转矩阵直接计算出来。这意味着模型不需要记忆第 5 个词是什么它只需要学会偏移量 k这个线性运算。举例说明位移不变性假设 PE(pos) [sin(pos), cos(pos)]那么位置编码向量旋转角度0[0, 1]-1[0.84, 0.54]逆时针 ~54°2[0.91, -0.41]逆时针 ~54°从 0 到 1 和从 1 到 2向量都旋转了约 54°——无论你处于句子的开头还是中间只要想寻找距离自己 k 步的词只需做一次完全相同的旋转操作即可。另外选择不同频率波长从 2π 到 10000·2π的正余弦是为了让不同的维度代表不同级别的粒度低维度低频负责捕捉长距离位置高维度高频负责捕捉短距离位置。三、如何理解缩放点积注意力计算公式Attention ( Q , K , V ) softmax ( Q K T d k ) V \text{Attention}(Q, K, V) \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) VAttention(Q,K,V)softmax(dkQKT)V3.1 直观理解图书馆找书符号含义类比QQuery查询你脑子里想的问题“讲水果的书有哪些”KKey索引/标签每本书封面上的标签《苹果种植》标签是水果、《柴油机维修》标签是机械VValue内容书里实实在在写的内容书的具体内容计算步骤打分QK^T拿你的问题Q去和所有书的标签K做点积匹配度。点积结果越大说明这本书的标签和你的问题越匹配。归一化softmax把这些原始得分转化为概率权重所有书的权重加起来等于 1。匹配度越高的书权重越大。加权求和×V根据权重把所有书的内容V按比例揉在一起。权重高的书在最终结果里占的比重大。3.2 d_k 为什么是 64 而不是 512d_k 是 Key 和 Query 向量的维度大小。模型整体的特征维度是 d_model 512。那为什么 d_k 只有 64 呢因为多头注意力做了降维切割。论文使用了 h8 个头为了让总计算量不变每个头分到的维度就是512 / 8 64。3.3 为什么要除以 √d_k论文原文对于 d_k 较大的情况点积的数值会变得很大从而将 Softmax 推入梯度极小的区域。为了抵消这种影响我们将其缩放 1/√d_k。若不除以 √d_k会发生什么得分极大 → Softmax 指数爆炸 → 输出趋近 One-Hot [1, 0, 0]某一个位置权重趋近 1别的趋近 0 → Softmax 导数公式算出 0 → 链式法则传给 Q/K 的梯度全是 0注意力权重的梯度要传回去更新投影矩阵 → 模型参数不更新 → 模型脑死亡彻底学不动了这就是为什么缩放因子 √d_k 看似简单却至关重要——它保护了梯度流通的命脉。四、模型架构详解论文 Figure 1Transformer 架构图Encoder-Decoder 结构4.1 整体结构Transformer 采用Encoder-Decoder架构Encoder由 N6 层堆叠每层包含两个子层——Multi-Head Self-Attention 和 Feed Forward NetworkFFN每个子层外面包裹残差连接 LayerNorm。Decoder同样 N6 层但多了一个带掩码的自注意力子层Masked Multi-Head Attention保证每个位置只能看到之前的词自回归属性外加一个 Cross-Attention 子层Q 来自解码器K/V 来自编码器输出。4.2 关键模块模块作用关键细节Multi-Head Attention捕获全局依赖8 个头并行每个头 64 维concat 后线性投影FFN非线性变换两层全连接 ReLU对每个位置独立作用Positional Encoding注入顺序信息sin/cos 固定编码直接加到输入嵌入Residual LayerNorm训练稳定残差防止梯度消失LayerNorm 稳定分布Masked Attention自回归保证Decoder 中掩码未来位置五、实验亮点任务WMT 2014 英德/英法翻译主要结果English-to-German BLEU 28.4新 SOTAEnglish-to-French BLEU 41.8训练效率8 个 P100 GPU 训练 3.5 天远低于当时同等性能模型关键消融去掉缩放因子 √d_k 后大 d_k 时模型性能显著下降验证了缩放的必要性六、个人思考局限性O(n²) 复杂度虽然 n d 时计算量可控但面对超长序列如整篇文档、高分辨率图像时自注意力的平方复杂度仍是瓶颈。后续的 Linformer、Performer 等工作都在解决这个问题。位置编码的固定性sin/cos 编码是硬编码的不能自适应学习。ViT 后续改用可学习位置编码。与 3D 点云主线的联系Transformer 是我整个暑期学习路线的第零块基石ViT本周第二篇把 Transformer 从 NLP 带入 CV用 Patch Embedding 替代词嵌入CLIP第二周双塔结构图像编码器和文本编码器都是 TransformerULIP第五周三模态对比学习用 PointNet 做 3D 编码器对齐到 CLIP 空间Uni3D第六周直接用 2D 预训练的 ViT 做 3D 编码器端到端训练Point-Bind/Point-LLM第七周3D 多模态对齐 接入 LLM可以说不理解 Attention就无法理解任何一篇后续论文的核心机制。可改进点可以尝试用可学习的位置编码替代固定 sin/cos对比效果可以探索稀疏注意力Sparse Attention在 3D 点云上的应用点云的 N 通常远大于文本序列七、动手实践从零实现 Multi-Head Attention读论文和写代码是两回事。你可以背下softmax(QK^T/√d_k)V的公式但如果不亲手实现一遍永远不会遇到 split_heads 维度变换、.contiguous()报错、softmax 维度混淆这些问题。所以本周复现了 Multi-Head Attention 模块。7.1 核心实现Scaled Dot-Product Attentiondefscaled_dot_product_attention(Q,K,V,maskNone):d_kQ.size(-1)# 计算缩放点积(batch, seq_q, d_k) × (batch, d_k, seq_k)scorestorch.matmul(Q,K.transpose(-2,-1))/(d_k**0.5)ifmaskisnotNone:scoresscores.masked_fill(mask0,-1e9)# mask0 的位置置为极大负数attn_weightsF.softmax(scores,dim-1)# 在 Key 维度上归一化outputtorch.matmul(attn_weights,V)# 加权求和returnoutput,attn_weights7.2 关键难点split_heads 维度变换这是整个实现中最容易出错的地方defsplit_heads(self,x):# (batch, seq, d_model) → (batch, num_heads, seq, d_k)batch_size,seq_len,_x.size()returnx.view(batch_size,seq_len,self.num_heads,self.d_k).transpose(1,2)为什么要 transposeview 之后是(batch, seq, heads, d_k)交换 1、2 维变成(batch, heads, seq, d_k)。这样torch.matmul会把(batch, heads)当作批量维度8 个头可以同时独立计算注意力。合并时反过来但注意 transpose 后内存不连续必须加.contiguous()才能 view。7.3 验证与可视化前向传播形状验证超参数同论文 d_model512, num_heads8Input: (4, 8, 512) → Output: (4, 8, 512) ✅ 形状一致 Attn: (4, 8, 8, 8) ✅ (batch, heads, seq_q, seq_k)反向传播梯度检查8 个参数W_Q/W_K/W_V/W_O 各含 weight 和 bias梯度全部非空计算图连通。注意力热力图构造 Q≈K 的输入相同位置几乎相等热力图呈现明显的对角线主导模式——每个 Query 高度关注对应位置的 Key验证了注意力机制的正确性。7.4 踩坑记录坑错误写法正确写法原因split_heads 维度x.view(batch, heads, seq, d_k)x.view(batch, seq, heads, d_k).transpose(1,2)view 只重新解释内存必须先按数据排列重塑再转置Softmax 维度F.softmax(scores, dim1)F.softmax(scores, dim-1)注意力是每个 Query 对所有 Key 的分配softmax 在 Key 维度内存不连续x.transpose(1,2).view(...)x.transpose(1,2).contiguous().view(...)transpose 返回视图不连续view 要求连续内存与官方实现对比torch.nn.MultiheadAttention用batch_firstFalseseq 在前、内部用 fused kernel 优化。我的实现更易读、适合学习官方实现更高效、适合生产。学习阶段手写一遍理解后再用官方的——这是正确路径。本周系列博文精读笔记(1)Attention Is All You Need← 当前精读笔记(2)ViT对比学习(1)Transformer vs ViT 架构对比周报(1)第一周学习总结下一篇精读笔记(2)ViT — 当 Transformer 遇见图像