🐸 青蛙编程网
首页 / AI / Transformer 原理 / 1. Transformer 是什么

1. Transformer 是什么

这是什么:Transformer(变换器) = 2017 年论文《Attention Is All You Need》提出的神经网络结构,今天所有大模型的"发动机"——GPT、DeepSeek 背后跑的都是它。

为什么用:LLM 教程 告诉你大模型会"文字接龙",但没说接龙是谁在转。想知道 Prompt 底下模型内部到底在算什么,必须拆开 Transformer 看一眼——这也是读懂一切 AI 论文与应用的第一把钥匙。

如何用:本章只用 NumPy 感受全篇的地基——两个向量的点积就能衡量"相似度"。后面五章再一层层把手搓的组件拼成一个迷你 Transformer。

本栈全程只用 NumPy 手搓,不装 PyTorch:每个公式都能复制粘贴 30 秒内跑完。真实大模型 = 这里的算式 + 用海量数据训练出来的权重。

老思路:一个词一个词往前读

Transformer 之前,语言模型的主流是循环神经网络(RNN,Recurrent Neural Network):把句子按顺序逐词读进网络,读到第 5 个词时,前 4 个词的信息都压缩在同一个"记忆向量"里。

问题出在两点:一是记忆会"稀释"——读到句尾时开头的信息早被冲淡;二是逐词串行,长句子就得排队等,训练起来慢。这两点正好卡住了后来"读整本书、写长文"的需求。

新思路:让每个词一眼看全所有词

论文标题就是答案:注意力(Attention)够了。让句子里每个词同时"看"整个句子,直接用点积(dot product)给"该看谁多少眼"打分——点积是线性代数里衡量两个向量方向是否一致的标准工具,越一致值越大:

import numpy as np

cat = np.array([9, 1, 0])      # "猫"的词向量(示意)
tabby = np.array([8, 2, 0])    # "狸花猫"的词向量(示意)
rocket = np.array([0, 1, 9])   # "火箭"的词向量(示意)

def similarity(a, b):          # 余弦相似度:方向越一致,值越接近 1
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

print(np.round(similarity(cat, tabby), 3))    # 猫 vs 狸花猫
print(np.round(similarity(cat, rocket), 3))   # 猫 vs 火箭

你会看到:

0.991
0.012
代码 作用
np.array([9, 1, 0]) 假装的"词向量":真实模型的向量是几十维到几千维
np.dot(a, b) 点积:对应元素相乘再相加,衡量两向量的"重合度"
np.linalg.norm(a) 向量长度,用来归一化,免得长向量占便宜
np.round(x, 3) 保留 3 位小数,只为了好看

记忆口诀:循环逐词慢如牛,注意力一眼全收;点积打分定亲疏,RNN 退役 Transformer 上。

两种玩法:GPT 与 BERT

同一个 Transformer 图纸,装两种用法:

  • 解码器(Decoder):遮住后面的词,一个一个往后猜——GPT、DeepSeek 这类生成模型的玩法
  • 编码器(Encoder):把整句话一起读进去做理解——BERT 这类理解模型的玩法

后面的章节怎么拆:第 2 章 文字变向量;第 3 章 注意力的 Q/K/V 主菜;第 4 章 多头与残差补齐一层;第 5 章 解决词的顺序问题;第 6 章 补齐编码器玩法 BERT;第 7 章 把所有组件串成迷你 Transformer。

动手改

  1. 把三行注释里的"猫 / 狸花猫 / 火箭"换成你自己拟的两组词向量,看相似度怎么变
  2. 把 rocket 改成 [9, 1, 0],想想为什么"火箭"瞬间和"猫"很像
  3. 给每个向量多加一维再算,体会"维度高一点、区分度就好一点"的感觉

下一章:从文字到向量,把"猫吃鱼了"变成一堆数字 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。