系列回顾:前五篇我们把基础数学工具(符号、对数、函数、导数、链式法则)打好了底。从这篇开始进入第二阶段:线性代数。很多人觉得线性代数枯燥,但在深度学习里,它就是神经网络运转的"物理引擎"——每一层的计算、注意力机制、词向量、特征表示,本质上全是线性代数。这一篇从最基础的向量讲起。
打开 DeepSeek V3 的论文,你会看到这样的描述:每个 token 被表示成一个 7168 维的向量,注意力机制用向量的点积衡量相似度,MLA 把向量压缩到低维再解压……
向量是整个深度学习的基本语言。文字是向量,图片是向量,声音是向量,模型的每一层接受向量、输出向量。
但很多人对向量的理解停留在"高中物理里那个带箭头的东西",用来表示力和速度。这个理解没有错,但太窄了。
这篇文章要做的事情是:从熟悉的箭头出发,一步一步把向量的概念扩展到深度学习里真正用到的形式,建立起对高维向量空间的直觉。
这是后面所有线性代数内容的基础,也是理解 token embedding、注意力机制、MLA 压缩的前提。
最直觉的向量是二维平面上的一个箭头。
从原点出发,指向点 $(3, 2)$,这就是一个二维向量,写作:
$$\vec{v} = \begin{pmatrix} 3 \\ 2 \end{pmatrix}$$
这个向量有两个属性: - 方向:箭头指的方向,即从原点到 $(3, 2)$ 的方向 - 大小(模):箭头的长度,$\|\vec{v}\| = \sqrt{3^2 + 2^2} = \sqrt{13} \approx 3.61$
向量的加法就是"箭头首尾相接":把第二个向量的起点放在第一个向量的终点,连接第一个向量的起点和第二个向量的终点,就是和向量。
向量的标量乘法就是"拉伸或翻转箭头":乘以 2 就是把箭头变成原来的 2 倍长,乘以 $-1$ 就是把箭头翻转方向。
更通用的理解是:向量就是一列有序排列的数字。
$$\vec{v} = \begin{pmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{pmatrix}$$
这里不需要"方向"和"箭头"的几何图像,就是 $n$ 个数字按顺序排好。
这个理解更适合深度学习:一张 $28 \times 28$ 的灰度图片,可以展开成一个 784 维的向量,每个数字是一个像素的亮度值。一个词(token),在 DeepSeek V3 里是一个 7168 维的向量,每个数字表示这个词在某个"语义维度"上的位置。
从箭头到数组,向量的本质没变,只是维度从 2、3 变成了几百、几千甚至更高。
向量有两种写法:
列向量(常见写法):
$$\vec{v} = \begin{pmatrix} 3 \\ 2 \\ 5 \end{pmatrix}$$
行向量:
$$\vec{v}^T = \begin{pmatrix} 3 & 2 & 5 \end{pmatrix}$$
上标 $T$ 表示转置(Transpose)——把列变成行,或把行变成列。
深度学习论文里,向量默认是列向量,转置之后变行向量。这个细节在矩阵运算里非常重要,维度搞错了,计算就会出错。
两个维度相同的向量相加,对应位置的数字分别相加:
$$\begin{pmatrix} 3 \\ 2 \end{pmatrix} + \begin{pmatrix} 1 \\ 4 \end{pmatrix} = \begin{pmatrix} 3+1 \\ 2+4 \end{pmatrix} = \begin{pmatrix} 4 \\ 6 \end{pmatrix}$$
深度学习里的残差连接 $h' = h + f(h)$,就是两个同维度向量相加。
向量乘以一个数字(标量),每个分量都乘以这个数字:
$$3 \times \begin{pmatrix} 2 \\ 5 \end{pmatrix} = \begin{pmatrix} 6 \\ 15 \end{pmatrix}$$
梯度下降的参数更新 $\theta \leftarrow \theta - \alpha \nabla L$,其中 $\alpha \nabla L$ 就是标量乘以向量。
向量 $\vec{v} = (v_1, v_2, \ldots, v_n)$ 的 L2 范数(欧氏长度):
$$\|\vec{v}\|_2 = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2} = \sqrt{\sum_{i=1}^n v_i^2}$$
这是勾股定理在高维空间的推广。
单位向量:模为 1 的向量。把任意向量除以它的模,就得到同方向的单位向量:
$$\hat{v} = \frac{\vec{v}}{\|\vec{v}\|}$$
深度学习里经常需要对向量归一化(让它变成单位向量),比如在计算余弦相似度时。
点积(Dot Product),也叫内积,是深度学习里用得最多的向量运算。
两个 $n$ 维向量的点积:
$$\vec{a} \cdot \vec{b} = \sum_{i=1}^n a_i b_i = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n$$
就是对应位置的数字分别相乘,然后全部加起来,结果是一个标量(单个数字)。
一个具体例子:
$$\begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} \cdot \begin{pmatrix} 4 \\ 5 \\ 6 \end{pmatrix} = 1 \times 4 + 2 \times 5 + 3 \times 6 = 4 + 10 + 18 = 32$$
点积有一个非常重要的几何解释:
$$\vec{a} \cdot \vec{b} = \|\vec{a}\| \cdot \|\vec{b}\| \cdot \cos\theta$$
其中 $\theta$ 是两个向量之间的夹角。
这意味着: - 两个向量方向相同($\theta = 0°$,$\cos\theta = 1$):点积最大,等于两个模的乘积 - 两个向量垂直($\theta = 90°$,$\cos\theta = 0$):点积为 0 - 两个向量方向相反($\theta = 180°$,$\cos\theta = -1$):点积最小(负值)
点积衡量两个向量有多"相似"(指向同一方向的程度)。
这是注意力机制的核心原理:
$$\text{注意力分数} = \frac{\vec{q} \cdot \vec{k}}{\sqrt{d_k}}$$
Query 向量 $\vec{q}$ 和 Key 向量 $\vec{k}$ 的点积,衡量"这个查询和这个键有多相关"。点积越大,相关性越高,注意力权重越大。
点积受向量长度影响,长向量的点积自然更大。如果只想比较方向(不管长度),用余弦相似度:
$$\cos\theta = \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\| \cdot \|\vec{b}\|}$$
余弦相似度的范围是 $[-1, 1]$: - $1$:完全相同的方向(高度相似) - $0$:垂直(无关) - $-1$:完全相反的方向(反义)
在词向量(Word Embedding)里,语义相似的词(比如"国王"和"女王")的向量余弦相似度接近 1;意思相反的词余弦相似度为负。
向量空间(Vector Space)是一个满足特定规则的数学结构,简单说就是:向量可以做加法和标量乘法,结果还在同一个空间里。
最常见的向量空间是 $\mathbb{R}^n$——所有 $n$ 维实数向量的集合。
在二维空间里,有两个特殊的向量:
$$\vec{e}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}, \quad \vec{e}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$$
这是 $x$ 轴和 $y$ 轴方向的单位向量,叫做标准基向量。
任意二维向量都可以用它们的线性组合表示:
$$\begin{pmatrix} 3 \\ 2 \end{pmatrix} = 3 \cdot \begin{pmatrix} 1 \\ 0 \end{pmatrix} + 2 \cdot \begin{pmatrix} 0 \\ 1 \end{pmatrix} = 3\vec{e}_1 + 2\vec{e}_2$$
这里 $3$ 和 $2$ 就是这个向量在这组基下的坐标。
线性组合:多个向量分别乘以标量,再加起来:
$$\alpha_1 \vec{v}_1 + \alpha_2 \vec{v}_2 + \cdots + \alpha_k \vec{v}_k$$
用所有可能的标量组合,能产生的所有向量的集合,叫做这些向量的张成空间(Span)。
举例:两个不共线的二维向量,它们的张成空间是整个二维平面——任何二维向量都能用这两个向量的线性组合表示。
在深度学习里,神经网络每一层做的矩阵乘法,本质上就是在对输入向量做线性组合:把输入向量投影到某个子空间里。
如果一组向量里,任何一个都不能用其他向量的线性组合表示,这组向量就是线性无关的。
比如:
$$\vec{v}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}, \quad \vec{v}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$$
这两个是线性无关的,没办法用一个表示另一个。
但:
$$\vec{v}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}, \quad \vec{v}_2 = \begin{pmatrix} 2 \\ 0 \end{pmatrix}$$
$\vec{v}_2 = 2\vec{v}_1$,第二个可以用第一个表示,它们是线性相关的,提供不了"新的方向"。
一组向量能成为一个空间的基,当且仅当它们线性无关,且能张成整个空间。
这个概念在理解 PCA(主成分分析)和注意力机制的"多头"设计时会非常有用。
语言模型处理文字的第一步,是把每个 token(大致可以理解为词或词片段)转换成一个向量,这个过程叫做嵌入(Embedding)。
嵌入矩阵 $E \in \mathbb{R}^{V \times d}$ 是一张"查找表": - $V$ 是词表大小(DeepSeek V3 约 128K 个 token) - $d$ 是嵌入维度(DeepSeek V3 是 7168)
给定一个 token 的 ID(比如"猫"对应 ID 1234),直接取嵌入矩阵的第 1234 行,就得到这个 token 的 7168 维向量。
这个向量表示的是"猫"这个词在 7168 维语义空间里的位置。训练完成后: - 语义相近的词(猫/狗/兔,都是动物)在这个空间里位置相近(向量接近) - 语义无关的词(猫/数学/下雨)位置相距很远
词向量一个著名的性质(在 Word2Vec 里发现的):
$$\text{向量}(\text{国王}) - \text{向量}(\text{男人}) + \text{向量}(\text{女人}) \approx \text{向量}(\text{女王})$$
"国王"减去"男人"的方向,加上"女人",得到"女王"。这说明向量空间里的方向有语义含义——这个方向大致对应"性别"这个概念。
类似地:
$$\text{向量}(\text{北京}) - \text{向量}(\text{中国}) + \text{向量}(\text{法国}) \approx \text{向量}(\text{巴黎})$$
首都和国家的关系,被编码进了向量方向里。
这不是巧合,而是语言模型在大量文本上训练后,自然学到的几何结构。向量的线性运算,在语义空间里有真实的意义。
当我说 DeepSeek V3 的向量是 7168 维时,你可能会问:7168 个数字代表什么?
没有人能解释每一维的具体含义,这些数字是训练出来的,不是人工设计的。但从宏观上理解:
每一维可以粗略理解为一个"语义坐标轴"。 也许某一维大致对应"是否是名词",某一维对应"感情色彩是否积极",某几维联合表示"和食物相关的程度"……但这些是后验解释,真实情况比这复杂得多,而且各维度之间高度纠缠,没有那么清晰的对应。
7168 这个数字不是随便选的,是在模型能力和计算成本之间权衡的结果——维度越高,表达能力越强,但计算量也越大。
在特征空间里,距离是衡量两个对象相似程度的基础工具。
两个向量 $\vec{a}$ 和 $\vec{b}$ 之间的欧氏距离:
$$d(\vec{a}, \vec{b}) = \|\vec{a} - \vec{b}\|_2 = \sqrt{\sum_{i=1}^n (a_i - b_i)^2}$$
就是差向量的模。几何上就是两点之间的直线距离。
深度学习里,L2 距离常用于计算两个特征向量的相似性,比如人脸识别里判断两张脸是否是同一个人。
$$d(\vec{a}, \vec{b}) = \|\vec{a} - \vec{b}\|_1 = \sum_{i=1}^n |a_i - b_i|$$
就是各维度差的绝对值之和。名字来自曼哈顿岛的街道网格——只能沿街道走,不能斜着穿越。
L1 距离对离群值(某一维差异极大的异常点)不那么敏感,因为它是加和而不是平方,不会过度放大单个维度的差异。
你可能会问:既然要衡量相似度,为什么 Transformer 用点积而不是欧氏距离?
原因是效率。
计算 $n$ 个 Query 和 $m$ 个 Key 之间的欧氏距离,需要 $O(nm)$ 次开方运算,代价较高。
而点积可以写成矩阵乘法 $QK^T$,GPU 对矩阵乘法有极其高效的实现(BLAS/cuBLAS),速度快很多。
此外,点积和余弦相似度等价(控制向量长度后),也是有效的相似度度量。
所以 Transformer 选点积,是工程效率的考量,而不是说点积在数学上比距离更"好"。
把向量 $\vec{a}$ 投影到向量 $\vec{b}$ 上,就是求 $\vec{a}$ 在 $\vec{b}$ 方向上的"影子长度":
$$\text{proj}_{\vec{b}} \vec{a} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{b}\|^2} \vec{b}$$
投影的标量大小(不含方向):
$$\text{comp}_{\vec{b}} \vec{a} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{b}\|}$$
想象太阳光垂直射下,向量 $\vec{a}$ 在地面(向量 $\vec{b}$ 所在的方向)上的影子,就是投影。
注意力机制的直觉:Query 向量在 Key 向量方向上的投影长度,衡量了 "Query 在多大程度上与 Key 对齐"。投影越长,点积越大,注意力权重越高,对应 Value 的信息被提取得越多。
两个向量正交(垂直),当且仅当它们的点积为零:
$$\vec{a} \perp \vec{b} \iff \vec{a} \cdot \vec{b} = 0$$
正交向量互不干扰——知道了 $\vec{a}$ 在某个方向的信息,对 $\vec{b}$ 方向的信息没有任何影响。
如果一组基向量两两正交(而且都是单位向量),叫做标准正交基(Orthonormal Basis)。
标准正交基有一个巨大的计算优势:任意向量在这组基下的坐标,可以直接用点积求出:
$$v_i = \vec{v} \cdot \vec{e}_i$$
其中 $\vec{e}_i$ 是第 $i$ 个基向量。
这个性质在 PCA(主成分分析)和注意力机制的多头设计里都有应用。多头注意力(Multi-Head Attention)的每个"头",可以粗略理解为在特征空间的不同正交子空间里寻找关注点,不同的头关注不同类型的信息(语法关系、语义关联、位置信息等)。
从二维到三维还好理解,但到了几千维,很多直觉就失效了。这里说几个深度学习里绕不开的高维现象。
在低维空间里,你撒 100 个点,它们会比较均匀地分布,随机抽两个点,它们大概率距离不太远。
但在高维空间里,同样的 100 个点,会极度稀疏——几乎所有点对都相距很远,找不到"近邻"。
这叫维度诅咒(Curse of Dimensionality),是机器学习里很多问题的根源。比如在 7168 维的词向量空间里,如果不加训练约束,随机初始化的向量几乎全都相互垂直(余弦相似度接近 0),没有任何有意义的相似结构。
词向量需要大量训练数据,才能把语义相关的词"推到"空间里相近的位置。
在三维空间里,一个球的大部分体积在"内部"。但在高维空间里,几乎所有体积都集中在球的表面附近——内部几乎是空的。
这导致了一个奇妙的结论:在高维空间里随机采样的点,几乎全都离球心的距离差不多(集中在球壳上),而不是像低维一样有远有近。
这对理解大模型里的向量归一化(让向量长度固定,即限制在球面上)有帮助:在高维球面上,点的分布和低维完全不同,需要用专门的技术(如 RoPE 旋转位置编码)来处理。
在高维空间里,随机取两个向量,它们的余弦相似度几乎一定接近 0(相互近似正交)。
这意味着:语言模型学到的词向量之间的相似结构(近义词余弦相似度高)是真实学到的语义信息,不是随机的噪声。 如果没有任何语义,向量之间应该全部接近正交。
所以当你看到词向量的余弦相似度有明显差异时,这些差异是有意义的,不是偶然。
最后,把 DeepSeek V3 架构里出现的各种向量维度列出来,让你对整体规模有感性认识:
注意 KV 压缩向量只有 512 维,而隐藏状态是 7168 维——这是 MLA(多头潜在注意力)的核心创新:把 KV 压缩到低维存储,推理时再解压。这样 KV Cache 的大小从 7168 维降到 512 维,显存占用大幅减少。
这里面所有的"压缩"和"解压",都是线性变换(矩阵乘法)——向量乘以矩阵,维度变化,但信息(尽量)保留。
这是我们下一篇要讲的内容:矩阵运算。
这篇文章我们把向量从多个角度彻底理解了一遍。
第一,向量有两种理解:带方向的箭头(几何直觉),和有序数字数组(计算操作)。在深度学习里,第二种理解更常用,向量就是特征的数值表示。
第二,点积是最重要的向量运算,几何上衡量两个向量的对齐程度,这是注意力机制计算相关性的数学基础。
第三,向量空间、基向量、线性组合是理解神经网络每层在做什么的基础:每一层都在对输入向量做线性组合(加权求和),生成新的向量表示。
第四,词向量(Token Embedding)是把离散的 token 映射到连续向量空间,语义相近的词在空间里位置相近。向量的加减运算可以反映语义关系。
第五,高维空间有反直觉的性质:维度诅咒、体积集中在表面、随机向量几乎正交。理解这些,有助于理解为什么大模型需要大量数据才能学到有意义的向量表示。
下一篇预告:
第7篇,我们讲矩阵运算。
你现在知道向量是神经网络的基本数据单元,下一步就是理解向量是怎么被变换的——这就是矩阵的工作。矩阵乘法是神经网络里计算量最大的操作,全连接层、注意力机制、MoE 路由,都是矩阵乘法。把矩阵运算搞清楚,你就真正能看懂 DeepSeek 里那些 $W_Q$、$W_K$、$W_V$ 是在做什么了。
向量是特征的语言,点积是相似度的测量,高维空间是现代 AI 生活的宇宙。理解了向量,才算是真正踏进了深度学习的大门。
还没有评论,来抢沙发吧!
博客管理员
40 篇文章
还没有评论,来抢沙发吧!