131、LLM 基础认知:Transformer 自注意力机制从零理解,不用公式用代码上周帮一个做NLP的同事调试模型,他训练了一个小型的Transformer做文本分类,结果loss死活降不下去。我一看,他写的自注意力层里,softmax之前忘了做mask,导致padding位置的token也在参与计算注意力权重。这种问题在初学者里太常见了——大家背了一堆Q、K、V的公式,但真正写代码时,连维度对齐都能搞错。今天这篇笔记,我打算完全抛开数学公式,用纯Python代码把自注意力机制拆开揉碎。你不需要懂矩阵求导,甚至不需要记住softmax的公式,跟着代码走一遍,自然就明白Transformer为什么能“看到”全局信息。从最简单的“词袋”到“注意力”的进化先想一个问题:如果让你用代码表示一句话,你会怎么做?最粗暴的方式是词袋模型——把每个词映射成一个one-hot向量,然后加起来。但这样“我打你”和“你打我”就变成一样的了。后来有了RNN,按顺序处理每个词,但长距离依赖问题严重。比如“我今天早上在公园里看到一只猫,它很可爱”这句话里的“它”,需要关联到前面的“猫”。RNN要记住这么长的上下文,梯度早就消失了。Transformer的自注意力机制解决的就是这个问题:让每个词都能直接看到句子里的所有其他词,不需要按顺序传递信息。手写一个极简自注意力层先别管Q、K、V这些花哨的名字,我们从一个最朴素的需求出发:给定一个句子,我想让每个词都“关注
131、LLM 基础认知:Transformer 自注意力机制从零理解,不用公式用代码
131、LLM 基础认知:Transformer 自注意力机制从零理解,不用公式用代码上周帮一个做NLP的同事调试模型,他训练了一个小型的Transformer做文本分类,结果loss死活降不下去。我一看,他写的自注意力层里,softmax之前忘了做mask,导致padding位置的token也在参与计算注意力权重。这种问题在初学者里太常见了——大家背了一堆Q、K、V的公式,但真正写代码时,连维度对齐都能搞错。今天这篇笔记,我打算完全抛开数学公式,用纯Python代码把自注意力机制拆开揉碎。你不需要懂矩阵求导,甚至不需要记住softmax的公式,跟着代码走一遍,自然就明白Transformer为什么能“看到”全局信息。从最简单的“词袋”到“注意力”的进化先想一个问题:如果让你用代码表示一句话,你会怎么做?最粗暴的方式是词袋模型——把每个词映射成一个one-hot向量,然后加起来。但这样“我打你”和“你打我”就变成一样的了。后来有了RNN,按顺序处理每个词,但长距离依赖问题严重。比如“我今天早上在公园里看到一只猫,它很可爱”这句话里的“它”,需要关联到前面的“猫”。RNN要记住这么长的上下文,梯度早就消失了。Transformer的自注意力机制解决的就是这个问题:让每个词都能直接看到句子里的所有其他词,不需要按顺序传递信息。手写一个极简自注意力层先别管Q、K、V这些花哨的名字,我们从一个最朴素的需求出发:给定一个句子,我想让每个词都“关注