不只是调包:Transformer编码器的原理与实现(一)
作为一个AI应用开发者我开始只想做个调包侠。直到有一天模型出现幻觉我不知道从何下手面对长文本内存爆炸我不知道为什么。于是我决定钻进这个黑盒子里看看。这是我对Transformer编码器的学习笔记希望能帮到同样困惑的你。Transformer是什么Transformer是一种革命性的AI模型架构核心思想是注意力机制。想象你在读一句话那只猫在垫子上睡觉它很可爱。 要理解它指的是谁你需要回头看猫。Transformer的厉害之处在于它让每个词都能同时看到所有其他词一次性理解整个句子的关系而不是像以前的模型那样一个词一个词地读。在Transformer出现之前业界主要采用RNN循环神经网络来处理序列数据。RNN采用的是串行循环处理机制读一句话猫吃鱼必须一个字一个字地输入——猫处理完才能处理吃吃处理完才能处理鱼。这种模式的弊端很明显效率低只能串行无法并行计算记忆衰减信息通过隐藏状态逐级传递猫的语义传到鱼时已经严重受损。句子越长开头的内容丢失越严重——就像LLM读着后面的忘了前面的。正是这两个痛点让RNN无法支撑起今天的LLM。Transformer的出现彻底改变了这一局面。它的核心是两大机制多头自注意力机制和前馈神经网络机制。本章我们先聚焦自注意力机制——看看它如何用一个精妙的设计让模型能一眼看全句同时解决效率问题和记忆衰减问题让LLM真正走进现实。多头自注意力机制想象你在一个嘈杂的派对上朋友喊你那个穿红衣服的人就是昨天帮我修电脑的要理解这句话你需要找到穿红衣服的人视觉注意力回忆昨天修电脑的事记忆注意力把这两者关联起来关系建模自注意力做的就是类似的事让句子里的每个词都去看其他所有词判断谁和自己相关然后把相关信息吸收进来。那只猫在垫子上睡觉它很可爱。它指的是谁人类一看就知道它指猫自注意力怎么做的它这个字会并行计算自己和所有词的相关性猫的相关性得分最高 → 把猫的信息吸收进来最终它的向量里包含了猫的语义计算步骤输入[猫, 吃, 鱼]每个词已经转成了向量第1步生成Q、K、V每个词都生成自己的Query、Key、ValueQ、K、V是同一个词从三个不同角度看自己和被看的方式Query查询这个词想从别人那得到什么主动询问Key键这个词能告诉别人自己是什么被动标签Value值这个词真正要传递的内容实际信息第2步计算相似度Q×K猫的Query 去点乘 所有词的Key得到分数猫-猫0.9、猫-吃0.3、猫-鱼0.1这个分数表示猫和每个词的相关程度第3步归一化Softmax把分数转成概率猫-猫0.8、猫-吃0.15、猫-鱼0.05让所有相关性加起来等于1第4步加权求和用这些概率去乘每个词的Value然后相加最终猫的新向量 0.8×猫的内容 0.15×吃的内容 0.05×鱼的内容猫现在知道了自己和吃有点关系和鱼关系不大关键洞察经过自注意力每个词都看了一遍全句吸收了对自己的信息变成了上下文相关的词。如何解决了痛点串行处理 → 并行计算RNN必须等猫算完才能算吃Transformer所有词的Q、K、V可以同时计算因为词与词之间没有等待关系就像全班同学同时写检索词然后交换查看不需要等别人写完RNN: 猫 → 吃 → 鱼 串行耗时3步 Transformer: 猫 吃 鱼 并行耗时1步 ↓ ↓ ↓ 同时计算梯度衰减 → 直接连接RNN信息通过隐藏状态接力传递越传越弱Transformer任意两个词都可以直接交互没有中间传递损耗鱼可以直接看猫不需要通过吃传话RNN的信息传递像传话游戏越传越失真Transformer像全员开会谁都可以直接对话。多头注意力这个多头则是表示从不同的角度去解析这句话因为语意是多维复杂的而不是单一的想象你同时用多种方式理解一句话头1关注语法关系主谓宾头2关注语义关系谁对谁做了什么头3关注指代关系它指谁就像你请多个专家同时分析同一句话每个人从不同角度给出见解最后综合起来。计算示意8个头 → 每个头独立做一遍上面的四步计算每个头得到不同的关系理解最后把所有头的结果拼起来再压缩回原来的维度核心价值多头让模型能从多个维度理解关系表达能力大大增强。位置编码Transformer是并行计算不像RNN天然有顺序感。如果不加位置信息模型会认为猫吃鱼和鱼吃猫是一样的。怎么做的给每个词加一个位置向量就像给每个座位贴座位号。偶数位置用sin函数奇数位置用cos函数为什么用sin/cos这样模型可以学会相对位置——比如猫在吃前面2个位置这个距离信息可以被捕捉到。在进行多头注意力计算的之前先生成每个词的位置编码然后将这个位置编码的向量与词embedding后的向量相加后丢给多头注意力进行处理。回顾一下自注意力机制通过Q、K、V的计算让每个词都能看到全局、吸收相关信息彻底打破了RNN的串行魔咒。再加上多头机制从多个角度理解关系位置编码保留顺序信息——这些设计共同构成了Transformer的理解引擎。