profileName: youpingfang postId: 248 postType: post categories:

- 6

Transformer 与注意力机制:从零开始彻底理解

> 这是一篇超长文,整理自原视频的完整内容。适合想要深入理解 Transformer 原理的读者。内容涉及大量数学推导,建议收藏后分多次阅读。


前言:为什么你总觉得 Transformer 差点意思?

简化版: > 学习 Transformer 注意力机制时,最大的困惑往往不是"怎么算"——按图索骥做矩阵乘法,有线性代数基础就能搞定。真正的问题是为什么非要这样算:QKV 结构从何而来?缩放因子 √d_out 为何存在?为什么 Q 和 K 要分开? > > 网上有人说 Transformer 的本质是加权求和——这话没错,但跟说"人活着就是为了呼吸"一样,太本质了,没说清楚它和 CNN、RNN、全连接网络的差别到底在哪里、又是怎么影响最终效果的。

image.png

第一章:编码器与解码器——先从大框架说起

1.1 最基本的结构

Transformer 这个名字大家现在应该都很熟悉了。它的大结构是左边编码器、右边解码器。

为什么需要这两个部分?这要从它最开始的用途说起——机器翻译。

机器翻译的特点是:输入语句的长短和输出的语句的长短不一样

这听起来是废话,但正是因为这个"不一样",才引入了编码和解码的结构。RNN 时代就是这么做的,Transformer 虽然是"另起炉灶",但还是把这个结构给保留了下来。

1.2 三个分支是怎么来的

现在我们看到的这些基于 Transformer 发展起来的大语言模型关系图,主要有三个分支:

最右边(最粗壮的那个):GPT 系列 - Decoder Only,只保留了解码器的部分 - 强项是生成内容

最左边:BERT - Encoder Only,只保留了编码器的部分 - 擅长学习和理解语言内容

中间:T5、UL2 等 - 编码解码都有 - 更像是帮助左右两个分支更好用、更容易训练出方法的工具

为什么会这样分?为什么这三个分支会有这样的功能区别?

要回答这个问题,我们首先要搞明白一件事:所谓的编码和解码,这个"码"到底是个什么码?


第二章:"码"到底是什么?

2.1 利玛窦学中文的故事

要想回答"码是什么",我们需要把所有问题都推回到最原始的场景。

人工智能最典型的运用场景有两个:图像识别和 NLP(自然语言处理)。

神经网络靠 CNN 是最先在图像识别领域爆发起来的。在 NLP 领域对应的模型是 RNN(循环神经网络)。

图像和语言的区别是什么?

  • 图像里的像素点是并行的
  • 语言里的词是有先后关系的
  • 最后的语义和这个先后关系有强关联

RNN 能处理语言问题,就是因为它可以通过循环结构直接把语言之间的先后次序信息囊括进去。

我们接着想这样一个问题:

当年的利玛窦,完全不懂中文,一个人来到了明朝。他是怎么学习中文、翻译中文的?

假设他说的是英语,他学习中文的方式大概是这样的:

  1. 看到一个梨
  2. 指着他,问中国人这是什么
  3. 中国人回答"这是梨"
  4. 他就知道了:"梨"这个字和"pear"这个单词是一个意思

也就是说,两个完全不同的语言符号,需要通过梨这个实体,把语义给联系起来

这是我们人从零开始学一门外语的情况。

2.2 机器翻译的难题

可我们现在面临的问题是机器翻译。没有办法给机器去指这个梨的实体到底是啥,只能针对中文和英文的纯文本,去完成语义之间的对应。

语言的可能性是无穷的,表达的语义的规律也并不统一,永远没有办法穷尽。

那怎么办?

我们只能通过大量文本的上下文,去确定词和词之间的关系。

两种语言的符号发音可能完全不同,但语义相通的词,它的上下文关系应该都是类似的

香蕉这个词,无论是在中文语境还是英文语境下,它的上下文里面应该总是和"猴子""黄色""甜""水果"等等这样的词关系更加紧密。

2.3 答案揭晓

所以,编码和解码的那个"码",就是各种语言里那些符号、发音等"形式上的不同"剥离掉之后,剩下来的单纯的语义关系

如果现在让你去设计这个纯粹的语义关系的"码",你会怎么设计?

有两点是确定的:

第一,因为需要计算机来处理,所以语义关系应该是数字化的。

第二,因为它需要表示语义之间的相互关系,所以数字化后的数值要能体现出语义之间的关系来才行。

第一点好理解。第二点我举个例子:

假如我们用一个高维空间的坐标,去当做语义关系码的数字化结果。

在这个空间中,香蕉对应的点如果是 (1, 0, 0, ...),那"猴子"这个词和香蕉的语义关系应该比较紧密,它对应的点应该就在香蕉这个点的不远处,比如 (0.1, 0.2, 0.1, ...)

而像"原子能""章鱼""海盗船"这些词对应的点,距离香蕉那个点就应该远得多了。

这些点之间的距离远近,就代表了它们语义之间的关系。


第三章:词的数字化——两种极端方案

3.1 分词器(Tokenizer)

第一种方法:给每个不同的词分配一个独立的 ID。

比如: - 苹果 → 1 - 香蕉 → 2 - 梨 → 3

这相当于把所有的 token 都投射到一根一维的竖轴上。

问题在哪?

这个空间里的信息过于密集,很难表达出复杂的语义。

举个例子:苹果、香蕉、梨都是水果,它们对应的数值接近,感觉合理。但如果"苹果"还表示手机呢?"华为"的 ID 很可能就在 1000 以外了,这个数值就很难体现出它们互相之间的关系了。

还有,如果我想表达"苹果和香蕉"这样一个组合起来的语义呢?按照直觉这种组合语义应该是 1+2=3,但 3 已经被"梨"这个 token 占用了,也会发生冲突。

3.2 独热编码(One-Hot Encoding)

第二种方法:把一个向量里的每一位都对应一个 token。

如果有苹果、香蕉、梨三个 token: - 苹果 → [1, 0, 0] - 香蕉 → [0, 1, 0] - 梨 → [0, 0, 1]

这相当于为每一个 token 都分配了一个单独的维度,最后组成的是一个有多少 token 就有多少维度的高维空间。

问题在哪?

所有的 token 互相之间都是正交的——没有任何关联。苹果和香蕉的独热编码分别是 [1, 0, 0][0, 1, 0],用向量表示的话它们的相关度是 0(内积为 0)。

这意味着所有 token 对应的点在空间中,只会分布在距离原点为 1 的高维球面上。

语义之间本来应该有的联系,全丢了。

3.3 结论:找个中间地带

分词器把所有语义都变成了"长度问题",完全没有利用维度关系。

独热编码则相反,维度关系太"满",信息密度过于稀疏。

这两种方法,就是两个相反的极端。

既然这样,就找一个维度高但没那么高的空间,来完成编码和解码的工作。

这个空间,就是我们经常听到的嵌入空间(Embedding Space)

2.3 矩阵乘法的几何意义

矩阵乘法的几何意义:空间变换的舞蹈

什么是向量?

在说矩阵之前,先聊聊向量。

向量听起来高大上,其实就是一个有方向的数字列表

比如你去超市买菜,推着购物车往东南方向走了 5 米。这个"东南方向 5 米"就是一个向量: - 方向:东南 - 长度:5米

在数学上,我们把它写成一个数字列表:[3.5, 3.5](往东走3.5米,往南走3.5米,合成起来就是东南方向5米)。

向量可以是任意维度的: - 2维向量:[x, y],平面上一个点 - 3维向量:[x, y, z],空间中一个点 - 768维向量:这就是 Transformer 里词向量的维度

什么是矩阵?

矩阵就是一个数字组成的表格

比如一个 2×3 的矩阵:

| 1  2  3 |
| 4  5  6 |

它的意思是:2行、3列。

矩阵的本质是记录空间变换的规则

怎么理解?想象你有一块橡皮泥(这是空间),现在我要把它捏成不同的形状(这是变换)。

矩阵乘法的几何意义

一个向量和一个矩阵相乘,本质上就是对这个向量所在的空间做了一次变换。

例子1:旋转

假设平面上有一个点 [1, 0](在 x 轴上,往右1个单位)。

我用一个 2×2 的矩阵:

| 0  -1 |
| 1   0 |

把它和向量相乘:

| 0  -1 |   | 1 |     | 0 |
| 1   0 | × | 0 |  =  | 1 |

原来在 x 轴上的点 [1, 0],变成了在 y 轴上的点 [0, 1]

发生了什么?90度逆时针旋转!

这就是矩阵干的事——记录了一个旋转规则。

例子2:拉伸

用一个矩阵:

| 2  0 |
| 0  2 |

和任意向量相乘,长度都会变成原来的2倍。

这是以原点为中心,把空间放大2倍

例子3:剪切

用一个矩阵:

| 1  1 |
| 0  1 |

这会让 x 轴保持不变,但 y 轴会"斜切"过去。

想象一张平行四边形的纸——这就是剪切变换

矩阵的行数和列数

理解了空间变换,就理解了这个规则:

新向量的维度 = 矩阵的列数(输入维度)
旧向量的维度 = 矩阵的行数(输出维度)

或者说:

矩阵的行数 = 旧空间维度
矩阵的列数 = 新空间维度

所以: - 3×2 的矩阵:把2维空间变成3维空间(升维) - 2×768 的矩阵:把768维空间变成2维空间(降维)

Word2Vec 就是靠这种降维,把几万个维度的独热编码,变成几百维的嵌入向量。

为什么是"空间变换"?

你可能会问:为什么要用"空间变换"这么拗口的说法?

因为这个理解方式太有用了:

1. 坐标轴的对应关系

矩阵的每一行,其实记录了新坐标轴的一维在旧坐标系下的坐标

比如:

| 1  0 |   ← 新的 x 轴,对应旧的 x 轴
| 0  1 |   ← 新的 y 轴,对应旧的 y 轴

这是一个单位矩阵,和任何向量相乘都不会变。

但如果是:

| cosθ  -sinθ |
| sinθ   cosθ |

新的 x 轴是 (cosθ, sinθ)——它就是旧坐标系里转了θ角的那条线。

所以矩阵把旧坐标轴映射到了新坐标轴

2. 变换是线性的

最重要的性质:直线变换后还是直线,原点变换后还是原点

非线性变换(如旋转一个圆弧)就不能用一个简单的矩阵表示。

这也解释了为什么神经网络需要激活函数——因为矩阵乘法本质上都是线性的,如果没有激活函数,再多层叠在一起也只是线性变换,加不了啥新东西。

神经网络里的矩阵乘法

好,理解了空间变换,我们来看看神经网络在干啥。

输入层

一句话:"苹果很好吃"

分词后变成3个 token,每个 token 对应一个 10000 维的独热向量(假设词表大小是10000)。

嵌入层

用一个 10000×512 的嵌入矩阵,和独热向量相乘。

这相当于:把一个 10000 维的稀疏空间(只有一位是1),压缩映射到一个 512 维的连续空间。

独热向量 [1, 0, 0, ..., 0] 乘以这个矩阵,直接就是矩阵的第一行——所以实际上我们不需要真的做矩阵乘法,直接查表就行。

注意力层

Q、K、V 三个矩阵:

Q = X × W_Q
K = X × W_K
V = X × W_V

每一个都是在对词向量所在的空间做不同角度的线性变换

变换后的 Q、K、V 可能在新的空间里: - Q 的"表达"能力更强 - K 能更好地匹配不同的 Q - V 的语义更纯粹

矩阵运算的硬件友好性

这就要说到 GPU 了。

显卡(GPU)本来是干什么的?渲染 3D 图形

3D 图形处理的核心就是:对空间中几百万个顶点做矩阵变换

  • 顶点坐标:一个 4 维向量 [x, y, z, 1]
  • 视角变换:一个 4×4 矩阵
  • 把顶点坐标乘以矩阵,得到新位置

这套东西在 GPU 里已经高度优化了几十年。

而神经网络本质也是: - 输入向量 - 矩阵变换 - 输出新向量

所以 GPU 的矩阵运算单元(张量核心)天然适合神经网络——底层都是同一套空间变换的数学

总结

概念 几何意义
向量 空间中的一个点(有方向有长度)
矩阵 空间变换的规则表
矩阵乘法 把向量按照矩阵规则变换到新位置
神经网络 一连串空间变换,把原始数据变成语义空间

下次你看到 Transformer 里的 QK^TSoftmax矩阵乘法 的时候,记得它们本质上都是在对空间做变换——把"词"从"符号空间"搬到"语义空间"。

第三章:Word2Vec——教你"编词典"

3.1 谷歌的创新

2013年,谷歌提出了 Word2Vec。这是一个很特别的机器学习模型,它的目标不是让模型完成任务(分类、识别),而是得到一个嵌入矩阵——相当于编一本"词典"。

普通模型 = 作家培训班(培养能写文章的人) Word2Vec = 词典编纂(给作家提供工具)

目标不同,训练方式也不同。

3.2 两种训练方法

CBOW(Continuous Bag-of-Words) - 输入:一句话挖掉中间一个词,比如"今天天气真___" - 输出:根据上下文4个词预测中间那个词 - 原理:把上下文的词向量加起来,应该能合成中间那个词的向量

这个原理用物理学来理解就简单了——力的合成与分解

上下文词向量 = 已知分力 中间词向量 = 合力(或分力)

一个词能被上下文推断出来,那它的词向量就应该等于上下文词向量的和。反过来,中间词的向量分解出来的分量,也应该能对应到上下文的词向量上。

Skip-gram 反过来用,以一个词为输入,预测它的上下文。

3.3 训练出来的是什么?

训练完成后,在嵌入空间里: - "红""绿""甜"这些形容词会离得很近 - 因为它们在真实语言环境中扮演的角色类似

这就像词典里一个词会有多个解释一样正常。Word2Vec 训练出来的词义是客观的、与整个语言环境绑定的,不依赖于任何人的主观意图。

3.4 主观语义要靠注意力机制

但是!Word2Vec 只能处理单个词义。一句话里词和词组合之后产生的新语义,它就处理不了了。

这就是注意力机制要解决的问题。


第四章:注意力机制——让词"活"起来

我们来一步步看注意力机制是怎么工作的。

第一步:生成 QKV

Q = X × W_Q
K = X × W_K
V = X × W_V

输入的矩阵是 T 行 d 列,W_Q、W_K、W_V 三个矩阵是 d 行 d_out 列。

这个 d_out 就决定了输出的词向量是多少列——也就是有多少维度。

具体 d 是要大于 d_out 还是小于,需要根据具体情况而定,在模型里面不做具体要求。

词向量矩阵和这些 W 矩阵相乘之后得到的 QKV,这其实没有什么特别的。注意力机制里面最值得关注的其实是得到 QKV 之后后续的操作。

第二步:计算注意力得分

A = Q × K^T

把 K 进行转置,然后让 Q 和 K 的转置相乘。

乘完了之后会得到一个 T×T 的矩阵 A,这个 A 也被称作注意力得分

第三步:缩放(Scaling)

得到了 A 之后,还要对 A 里的每一项进行一个缩放,就是除以 √d_out,然后按行去计算 Softmax。

这里除以 √d_out 进行缩放,是为了后面进行 Softmax 的时候,让这些数值尽量分散一点,而不是更多的集中在 0 和 1 这样的饱和区。

6.3 为什么要除以 √d_out?

这其实是从概率分布的角度去进行考虑的。

我们把这一部分拿出来,重点考虑一项,因为其他的所有项都是一样的。

假设: - Q 的一行向量 X = [x₁, x₂, ..., x_{d_out}] - K^T 的一列向量 Y = [y₁, y₂, ..., y_{d_out}]

我们做一个基本假设: - X 里头每一项都遵循正态分布,而且是标准正态分布(期望是 0,方差是 1) - Y 里头每一项也都是标准正态分布 - X₁、X₂ 等等所有这些项互相之间都独立,也就是说它们的协方差是 0

那好,我们来看 X 和 Y^T 相乘再相加,写出来就是这样子:

每一项 xᵢ 和 yᵢ 都是一个标准正态分布,而且它们互相之间独立。

那相乘之后: - 期望是 0(这很容易理解) - 方差是什么呢?根据公式可以展开 image.png 最后得到这一项的方差还是 1。

我们要求的是整个这个的方差,相当于是把它们所有的方差都加起来。一共有 d_out 项,那最后得到的方差是 d_out。

也就是说 x 和 y^T 相乘,它仍然是一个多元的高斯分布。这个多元的高斯分布期望仍然是 0,但是它的方差已经变了,成了 d_out。

如果这个时候我们给每一项都除以一个 √d_out,就相当于是除了一个标准差,那除了标准差,它们的方差就又变成 1 了。

那就代表了 A 里面的每一项就又成了一个标准正态分布了。

6.4 Softmax 归一化

除以 √d_out 是从概率角度进行考虑的,Softmax 计算也是把问题放到概率框架下去进行的。

本质上就是把数据根据它们的相对关系进行归一

这里的 Softmax 并不是把 A 里的所有项都加到一起统一进行归一,而是逐行进行归一——也就是 Softmax 之后,每一行你加起来是 1。

最后得到了归一化的注意力得分 A',再和 V 进行矩阵相乘运算。

为什么要这么折腾?

因为 Softmax 函数在处理标准正态分布的数值时效果最好——既不会太多集中在 0(饱和区),也不会太平坦失去区分度。 这里的 Softmax 并不是把 A 里的所有项都加到一起统一进行归一,而是逐行进行归一——也就是 Softmax 之后,每一行你加起来是 1。

最后得到了归一化的注意力得分 A',再和 V 进行矩阵相乘运算。

4.5 Q 和 K 为什么一定要分开?

这是最关键的问题之一。

如果只用 Q × Q^T,那只是线性变化,只能表达线性关系。

用 Q × K^T 的形式,本质上是二次型,表达能力更强。就像直线和圆锥曲线的关系——二次型能表达更复杂的情况。 image.png

然后,第二个问题,那个是即便是要用类似二次型,那为什么不能只用一个 w 矩阵呢?自己和自己短值相乘不也一样吗?关于这一点,如果单纯从数学计算的角度去理解的话,还挺难的, w 和自己的短值相乘,一个最直观的结果,就是它会直接得到一个被。矩阵,这看起来和前面说的 wq 和 wk的转势相乘有点不太一样,不过不是本质的,因为 wk 和 wq 转势相乘,它得到的虽然不一定是对称矩阵,但是只需要简单的变换一下,让 b 等于这个,那 b 就可以变成是一对称矩阵。而且他们最后计算结果还是转价。也就是说,从数学上来看,两个不一样的矩阵和一个矩阵和自己相乘,好像没有本质的区别。 image.png

那到底应该如么理解这个问题呢?一开始我其实也没有什么好的想法,就感觉肉丝一直潜在牙缝里面。只要我看到我的视频下面出现了这样一个评论。而解我的人应该知道我喜欢吐槽教材。在讲概率论的视频里面我就很多次吐槽啊,在很多人心中,概率论应该是最难学的一门数学了。结果就看到了,有人在视频下面说,抽象概数、泛含分析、实练函数,哪个不比概率难呀?你凭什么说概率是最难的一门数学呢? 但更深层的原因在于语义分工

作者的主观语义可以分成两类: 1. 设定语义:为后面的话铺垫背景 2. 表达语义:在设定好的语境下说出具体观点

Q 和 K 正好分别承担这两种功能:

  • K 负责设定语境(这篇文章是在讨论什么)
  • Q 负责表达观点(具体在说什么)

这就是为什么高情商的人和低情商的人聊天,常常出现"鸡同鸭讲"——他们可能用了相同的词(客观语义相同),但设定的语境不同(Q/K 关系不同)。

4.6 自注意力 vs 交叉注意力

类型 数据来源 特点
自注意力 同一组数据自己和自己比 像闷头自学,先理解材料设定的语境,再理解表达的观点
交叉注意力 Q 来自解码器,K/V 来自编码器 像手边有参考资料,直接学习现成的观点,省掉了理解语境的过程

翻译的时候,交叉注意力就是一种"校准"——中文编码器设定好的语境,英文解码器直接对照着生成。


第五章:位置编码——解决"顺序丢失"问题

5.1 问题所在

Transformer 最大的特点之一是并行计算——所有词一起处理。但语言是有时序的,"我打你"和"你打我"意思完全相反。

并行计算会丢失词的前后顺序信息,所以必须额外加入位置信息。

5.2 两种实现方式

加法:在词向量上直接加位置编码(原始 Transformer 用的是这个) 乘法:通过旋转来编码位置(RoPE,比如 LLaMA 用的)

5.3 绝对位置编码的原理

论文里的公式看起来很复杂,其实本质是傅里叶级数的变体。

傅里叶级数告诉我们:任何周期函数都可以用不同频率的正弦余弦函数叠加表示。 image.png Transformer 的绝对位置编码就是: - 用自然数 0, 1, 2, 3... 表示位置 - 把这些数"升维"到和词向量相同的维度 - 每个维度对应一个不同频率的周期函数 - image.png

image.png 为什么用这种方式?

两个好处: 1. 覆盖范围大:最小频率够小,周期够大,同时支持更多 token 不重复 2. 维度正交:不同维度的频率互相正交,类似 RGB 三通道互不干扰

5.4 相对位置编码

如果说绝对位置编码是"给数据穿衣服"(修饰数据本身),那相对位置编码就是"给注意力穿衣服"(修饰注意力得分)。

因为相对位置比较的是"词向量之间的关系",而这正好发生在 Q × K^T 计算注意力得分的环节,所以相对位置编码要在这里做文章。

怎么改?

原来:$A = QK^T$ 加绝对位置编码后展开是四项 image.png

看成矩阵 image.png 相对位置编码的做法是:把这四项都改成依赖 q-k(相对距离)而非绝对位置。这样无论取哪一行,都以该行作为原点,只考虑行和列的差值。


第六章:多头注意力——Attention 家族的大招

6.1 什么是多头?

之前我们都是"单头"注意力——一组 QKV 得到一组输出。

多头注意力就是同时计算多组注意力,然后把结果拼起来。 image.png

image.png

image.png

6.2 和 CNN 的关系

这是一个很神奇的联系。

CNN 的卷积操作: - 单个卷积核在一个通道内做加权求和 - 1×1 卷积核把不同通道的数值整合到一起

多头注意力的等效操作: - 同一头内多维数据的加权求和 → 对应单个通道的卷积 - image.png - image.png - image.png - 不同头拼接后通过 W^O 矩阵 → 对应 1×1 卷积核

6.3 比 CNN 更灵活

CNN 的卷积核必须"围绕中心"——一个像素只能和周围的像素建立联系。

多头注意力可以跨越很远的距离,只要设计得当,可以: - 让第 5 个词和第 1 个词建立强关联 - 通过参数控制影响的范围和强度

这就像 CNN 只能看局部,而多头注意力能看到全局,还能灵活调整每个位置的"视野"。


第七章:解码器——怎么把词"吐"出来

7.1 训练 vs 推理

训练时:编码器和解码器可以并行计算,同时输入源语言和目标语言,算损失函数反向传播。

推理时:必须逐个生成!因为下一个词依赖于上一个词输出什么。

7.2 自回归生成的过程

1. 输入开始符号 <BOS>
2. 解码器计算下一个 token 是什么
3. 取概率最大的那个
4. 把输出的 token 拿回来作为输入,继续生成
5. 直到输出结束符号 <EOS>

这利用了循环神经网络的思想——把输出循环作为输入。

7.3 为什么很多大模型只用解码器?

因为解码器本身就具备编码功能

GPT 这类模型的做法是:把用户输入的内容"植入"到模型的生成过程中,让模型把用户输入当作它已经生成的内容,只需"接着往下写"就行。

具体训练时,把中文、英文等各种语言的文本都混在一起训练,只要模型够大、训练数据够多,最后所有语言就能统一到模型里。


第八章:其他关键技术

8.1 掩码注意力(Masked Attention)

推理时生成第 n 个词,只能受前 n-1 个词的影响,不能"偷看答案"。

做法:把对应位置的注意力分数设为 -∞,Softmax 后就变成 0。

8.2 残差连接 + Layer Norm

残差连接:让注意力机制学习"变化量"而非"绝对结果"

类比: - 没有残差 = 蒙着眼睛开车,只能靠手不晃动来保持直线 - 有残差 = 能看到路上的标线,控制的只是和标线的偏差

Layer Norm:按句子维度归一化,不管句子多长,句子内部所有元素一起归一。

8.3 前馈神经网络(FFN)

在全连接层里对词向量的各维度进行特征组合和抽象,相当于对嵌入空间的"再加工"。


第九章:补充内容——SVM 与机器学习的本质

9.1 SVM 在做什么?

SVM(支持向量机)的核心思想是:找到一条让两边数据"间隔最大"的分类线。

这条线到最近数据点的距离就是"间隔"。间隔越大,分类越鲁棒——数据稍微抖动也不会分错。

软间隔允许某些点越过边界,通过引入松弛变量 ξ 来容忍误分类,代价是模型会更平滑(减少过拟合)。

9.2 软间隔 SVM 的损失函数

软间隔 SVM 等价于:

总损失 = 经验损失项 + C × 正则项

经验损失项 = 合页损失(Hinge Loss)

形状像打开的门/窗户: - 分类正确 → 损失 = 0 - 分类错误 → 损失随错误程度线性增加

9.3 机器学习的本质框架

要素 作用
模型 为数据 X 赋予度量的框架(超平面)
策略 损失函数——为度量赋予现实意义
算法 具体的学习方法

为什么需要损失函数?

模型函数给出的只是一个"度量"(纯数学值),损失函数负责给这个度量赋予"现实意义": - 最小二乘法 → 方差(假设噪声是高斯分布) - 极大似然估计 → 概率 - SVM → 几何间隔


面试题与答案

Q1: Transformer 中 Q、K、V 三个矩阵分别代表什么?为什么 Q 和 K 要分开?

答案: - Q(Query):查询向量,负责"表达"——我想说什么 - K(Key):键向量,负责"设定"——我在什么语境下说 - V(Value):值向量,负责"内容"——词典里这个词的客观含义

分开的原因有两层:

第一层(数学角度):只用 Q × Q^T 是线性变化,表达能力有限;Q × K^T 是二次型,能表达更复杂的关系。

第二层(语义角度):人的主观语义可以分成"设定语义"和"表达语义"。Q 和 K 的分离让模型可以在相同客观框架下处理"截然相反但并行不悖"的观点。就像两个人可能都在讨论"概率论难",但一个人是在铺垫后说概率论难,另一个人是在铺垫后说概率论其实不难——他们用了相同的词,但设定的语境不同(Q/K 关系不同),结论可以完全相反。


Q2: 为什么注意力分数要除以 √d_out?

答案: 假设 Q 的一行向量和 K^T 的一列向量的各分量都服从标准正态分布且互相独立,那么它们相乘得到的值的方差是 d_out。

为让结果服从标准正态分布(期望=0,方差=1),需要除以 √d_out(即标准差)。

实际意义:这样 Softmax 归一化时数值分布更合理——既不会饱和到全是 0/1(失去区分度),也不会太平坦(所有值都差不多)。


Q3: 相对位置编码和绝对位置编码的区别是什么?

答案

对比维度 绝对位置编码 相对位置编码
修饰对象 输入数据 注意力得分矩阵 A
实现方式 加法(数据 + P) 乘法/加法(修改 QK^T 的结果)
关注点 词在序列中的绝对位置 词与词之间的相对距离
适合场景 位置信息简单 位置关系复杂(语言中更常见)

简单理解: - 绝对位置编码 = 给每个词发一张身份证,写上"我是第5个词" - 相对位置编码 = 告诉每个词"你离我有两个词的距離"

语言里真正重要的往往是相对位置关系,所以相对位置编码在很多场景下效果更好。


Q4: 多头注意力机制相比单头有什么优势?为什么说它是能力更强的 CNN?

答案

多头优势: 1. 不同头可以关注不同类型的语义关系(比如一个头关注语法结构,一个头关注情感色彩) 2. 拼接后通过 W^O 矩阵整合,类似 CNN 的通道融合

与 CNN 的对应关系

CNN 操作 多头注意力等效
单通道卷积(加权求和) 同头内多维数据加权
1×1 卷积(通道融合) W^O 矩阵乘法
多通道 多头拼接

超越 CNN 的地方: - CNN 的卷积核必须围绕中心,一个像素只能和周围的像素建立联系 - 多头注意力可以跨越任意距离建立关联 - 通过参数 α 可以灵活控制影响的衰减速度和范围


Q5: Word2Vec 的 CBOW 和 Skip-gram 有什么区别?词嵌入为什么能表达语义?

答案

区别: - CBOW:用上下文预测中间缺失的词(类似完形填空) - Skip-gram:用中间词预测上下文(反过来)

语义表达的原理(分布式语义假说): > 一个词的意义由它的上下文决定

训练完成后,语义相近的词在嵌入空间中距离很近。比如"红""绿""甜"都是形容词,在真实语言环境中扮演的角色类似,所以它们在空间中的位置也接近。

这就像一本词典——虽然每个人对"美女"的主观理解不同,但词典里给出的客观解释是相同的,Word2Vec 学到的就是这个客观解释。


Q6: Transformer 推理时为什么要逐个生成而非并行输出?

答案核心原因:下一个 token 依赖于上一个 token 的输出。

虽然训练时可以用掩码注意力并行计算(因为训练数据里目标序列是已知的),但推理时: 1. 不知道目标序列有多长 2. 每个位置的输出取决于之前所有位置的输出

实际工程中的优化(KV-Cache)只是缓存中间结果加速计算,生成的本质还是顺序的。


Q7: 残差连接在 Transformer 中的作用是什么?

答案: 残差连接让注意力机制学习残差(变化量)而非绝对输出。

没有残差: 模型需要完整记住"输入这句话应该输出什么结果" - 相当于蒙着眼睛开车,只能靠手不晃动来保持直线 - 对深层网络来说训练非常困难

有残差: 模型只需学习"相对于输入变化了多少" - 相当于能看到路上的标线,控制的是和标线的偏差 - 即使手抖了一点,偏差不大就能调整回来

这也是为什么 Transformer 能堆很多层——残差连接让深层网络的训练变得稳定。


Q8: 软间隔 SVM 的损失函数是什么?它和正则化有什么关系?

答案

损失函数形式

总损失 = 合页损失(Hinge Loss)+ C × L2 正则项

合页损失:形状像打开的门/荷叶 - 正确分类且在间隔外 → 损失 = 0 - 分类错误或在间隔内 → 损失随错误程度线性增加

与正则化的关系: - 参数 C 控制"间隔宽度"和"误分类惩罚"的权衡 - C 越大 → 对误分类惩罚越重 → 间隔越窄 → 越接近硬间隔 - C 越小 → 允许更多误分类 → 间隔越宽 → 模型越平滑(更不容易过拟合)

这完美展示了机器学习中偏差-方差权衡的核心思想:C 越小模型越简单(高偏差低方差),C 越大模型越复杂(低偏差高方差)。