在前上一章我们讲了CNN,和RNN。当时我们的任务通常是判别与分类:给一张图,判断是猫还是狗;给一句话,判断情感是正向还是负向。
在这一章,我们看到了AI的新形态:大语言模型 (Large Language Models, LLM) 现在我们的任务变成了生成。
我们的任务是给一个提示词 (Prompt),生成一段从未存在过的文本。我们的核心逻辑是预测下一个词。只要我们能够精准地预测下一个此,那么模型就能够写诗,写代码,甚至通过图灵测试。
这种能力的背后,是一个统一的架构:Transformer。
本章的内容不算很深,因为课程主要是轻微带过。
Transformer的骨架
Transformer 最初是为机器翻译设计的,所以它保留了经典的 Encoder-Decoder 结构。其中:
编码器 (Encoder)负责“读”。它接受输入,将其消化、理解,压缩成一堆高维向量(Context Vector)。你可以把它想象成一个极其认真的阅读者,把句子的意思提炼出来。
解码器 (Decoder)负责“写”。它接收 Encoder 传来的“意思”,然后一个词一个词地吐出翻译结果(比如 "Bonjour")。
如果我们把 Encoder 或 Decoder 放大,会发现它们是由无数个相同的组件 (Block) 堆叠起来的。每个Block中都有两个核心组件:
自注意力机制 (Self-Attention):
这是Transformer区别于RNN的关键。RNN读到哪记到哪,但是Attention是“全局视野”。当它处理单词“Bank”时候,它会同时看向句子里的“River”或者“Money”,从而瞬间明白“Bank”的含义。
前馈网络 (Feed-Forward Networks)
这是我们之前学的MLP,全连接层,相当于模型的大脑。
我们利用Attention来负责收集“谁和谁有关”的信息,而MLE负责处理信息,发现“信息意味着什么”**残差与归一化 (Add & Norm)**就像一个稳定器:
还记得上一章ResNet使用的残差链接技术吗?在这里我们使用了残差链接来确保Transformer堆得很深且不梯度消失。
然后我们使用Layer Norm来稳定数据的分布。
自注意力机制
在处理一个词的时候,Transformer会把这个词的向量$x$分裂成三个分身:
- Query ($q$):查询向量。这代表“我正在寻找什么”?
- Key ($k$):键向量。代表“我有什么特征?我是谁?”
- Value ($v$):值向量。代表“我的具体内容是什么?”
想象你去图书馆找书。,那么:
- Query: 你手里拿着一张纸条,写着“我想找关于机器学习的书”。
- Key: 图书馆里的每本书脊上都贴着标签(Key),比如“烹饪”、“历史”、“人工智能”。
- Value: 书里面的实际内容。
注意力机制的过程基本就是:
- 你拿着你的 Query 去和每本书的 Key 进行比对(点积)。
- 如果 Query ("机器学习") 和 Key ("人工智能") 匹配度很高,你就会注意这本书。
- 最后,你把所有你注意到的书的 Value (内容) 拿出来读一读,融合到你的脑子里。
计算注意力
那么我们来看看数学该如何定义这种过程:
Step 1: 投影 (Linear Projections)
输入向量 $x$ 分别乘以三个权重矩阵 $W^Q, W^K, W^V$,得到 $q, k, v$。
$$ q = W^Q x, \quad k = W^K x, \quad v = W^V x $$
这些 $W$ 矩阵是模型要学习的参数
Step 2: 计算匹配分 (Attention Scores)
我们拿当前的 Query ($q_1$) 去和句子里的每一个 Key ($k_1, k_2, k_3...$) 做点积 (Dot Product)。
$$ \text{Score} = q \cdot k^T $$
回顾线性代数:点积越大,两个向量越相似。因此如果 Score 很高,说明这两个词关系紧密(比如 "Apple" 和 "Eat")。
Step 3: 归一化与加权求和 (Softmax & Weighted Sum)
- Softmax: 把分数变成概率(和为 1)。比如 [0.8, 0.1, 0.1]。这意味着我 80% 的注意力都在关注第一个词。
- 加权求和: 用这个概率去乘以对应的 Value ($v$)。
$$ \text{Output} = 0.8 v_1 + 0.1 v_2 + 0.1 v_3 $$
最终我们就得到了注意力的公式为
$$ \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right) V $$
之所以除以 $\sqrt{d_k}$ 是为了防止点积数值太大导致 Softmax 梯度消失。
模型学到了什么?
通过这个机制,Transformer 实现了**“动态理解”**。
- 例子: "The animal didn't cross the street because it was too tired."
- 当模型处理 "it" 这个词时:
- 它的 Query 会去问全句。
- "animal" 的 Key 会说:“我跟 it 关系很大!”。那么animal的Score就很高。
- "street" 的 Key 会说:“我跟 it 关系不大。”。同理,分数就不算高。
- 最后,"it" 的向量就会吸收大量 "animal" 的信息。
经过这一层后,"it" 这个词的向量不再只是代表“它”,而是变成了“那个动物的它”。这就叫上下文理解。