一. 大模型自回归生成(逐个预测下一个 token),核心输入 = 历史所有 token 的向量表示,注意力机制就是用来建模历史 token 之间、历史 token 和当前待预测位置的依赖关系;下一个词的概率,是基于全部上文历史计算得到。
下面拆开讲清楚:
1. 基础流程(GPT 这类 Decoder-only 模型)
- 输入文本先转成 token,再通过 embedding 变成向量,加上位置编码(Transformer 不知道顺序,位置编码用来区分第 1 个词、第 2 个词……)
- 注意力机制(Masked Self-Attention,掩码自注意力)
- Mask 的作用:预测第 i 个位置时,看不到 i 之后未来的 token,只能看见前面 1~i 的历史 token
- 对当前位置,计算它和所有历史 token之间的相关性(attention score 注意力分数),用分数做加权求和,得到融合了上文信息的向量
- 多层 Transformer 叠完之后,最后接线性层 + Softmax,输出词汇表上每个候选 token 的概率分布,挑概率最高 / 按采样选一个作为下一个词
- 把刚生成的这个新词追加到历史序列,再重复上面整个过程,预测再下一个 token
✅ 所以:预测下一词的原始依据就是全部历史输入(上文);注意力是用来更好提取上文里的关联信息,不是凭空猜。
2. 补充两个容易混淆的点
(1)注意力到底在算什么?
Query(当前位置),Key/Value(所有历史 token)
\(Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V\) 本质:当前位置的 Query,去匹配历史所有 token 的 Key,算出权重,再用权重对历史 Value 加权,也就是从历史里抓相关信息。
(2)有没有只看最近几个词?
理论上模型可以看到全部上文;但受上下文窗口限制,如果历史太长,超出窗口,更早的内容就会被截断,模型看不到。
窗口内:全部历史都参与注意力计算;窗口外:直接丢弃。
3. 简单例子
输入:我喜欢吃苹果模型依次处理每个 token,当读到我 喜欢 吃之后,mask 保证只能看这 3 个历史 token。 自注意力计算这三个 token 之间的关联,输出向量,softmax 算出下一个 token 概率,苹果概率最高,就输出苹果; 之后序列变成我 喜欢 吃 苹果,再拿这整段历史继续预测下一个词。
4. 额外区分:Encoder(BERT) vs Decoder(GPT)
- BERT:双向自注意力,同时看左右上下文,不是用来逐词生成,是理解任务;
- GPT:掩码单向自注意力,只能看左侧历史,就是你说的这种 “逐个算下一词概率” 的架构。
二.机器学习
无监督学习:给机器一堆标记好的数据;
监督学习:给机器一大堆分类标记的数据;
自监督学习:一种无需人工标注数据的学习方法,利用数据本身的结构来生成标签,并用这些生成的标签来训练模型。
强化学习:AI通过不断尝试与环境交互,来获取奖励或者惩罚来找到最优的行动。
二. Transformer 正弦位置编码(Positional Encoding)完整解释
这是原始 Transformer 论文里固定正弦余弦位置编码,用来给输入 token 注入位置信息,因为自注意力本身没有时序 / 位置感知能力,不知道词的先后顺序。
这里
d_model = 512,也就是词向量 / 位置编码向量维度 = 512。
公式
\(\begin{align} PE_{(pos,2i)} &= \sin\big(pos \;/\; 10000^{2i/d_{model}}\big) \\ PE_{(pos,2i+1)} &= \cos\big(pos \;/\; 10000^{2i/d_{model}}\big) \end{align}\)
pos:token 在句子里的位置(第几个词,从 0 开始)i:维度索引,从 0 开始2i:偶数下标维度→ 用 sin2i+1:奇数下标维度→ 用 cos- \(d_{model}=512\),所以这个位置编码向量总长度 = 512
结合图里例子:句子「国王他有个女儿」
句子一共 6 个词,pos 依次:
- 国王 → pos=0
- 他 → pos=1
- 有 → pos=2
- 个 → pos=3
- 女 → pos=4
- 女儿 → pos=5
每个 pos 都会生成一个512 维向量: 向量第 0 维 (2i=0,i=0):\(\sin(pos/10000^{0/512})\) 向量第 1 维 (2i+1=1,i=0):\(\cos(pos/10000^{0/512})\) 向量第 2 维 (2i=2,i=1):\(\sin(pos/10000^{2/512})\) 向量第 3 维 (2i+1=3,i=1):\(\cos(pos/10000^{2/512})