笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 向量入门

    • 看得见的机器学习数学
    • 向量是什么
    • 向量的加减与数乘
    • 线性组合与张成
  • 矩阵与变换

    • 矩阵是一次变换
    • 矩阵乘法
  • 度量与求解

    • 行列式与面积
    • 解方程组就是倒着走回去
    • 特征向量的直觉
    • 点积与相似度
  • 高维与结构

    • 高维空间的直觉
    • 正交基与投影
    • 秩与低秩
    • 长度与归一化
    • 线性与非线性
  • 概率与信息

    • 概率分布与采样
    • 期望与方差
    • 指数与 softmax
    • 对数与信息量
    • 交叉熵
  • 学习与优化

    • 导数就是坡度
    • 梯度下降
    • 链式法则与反向传播

点积:两个箭头有多顺

拔河的时候,队友是不是真的在帮你,不看他用了多大力气,只看他那股力气里有多少是跟你一个方向的。

🧠 一句话结论

点积(内积)把两个箭头压成一个数:越同向这个数越大,垂直时是 0,完全反向时是负数——它就是"两个箭头有多顺"的量化,也是相似度、检索、注意力打分背后共同的几何本体。


场景问题

你和朋友一起拉一辆雪橇。

你正对着雪橇前进的方向使劲拉;朋友站得偏一点,朝斜前方拉。你俩用的力气一样大(箭头一样长),但雪橇往前冲的效果明显不一样——朋友那股歪着的力,有一截其实被"浪费"在了侧面,没帮上前进,只有沿着雪橇前进方向的那一部分才真正算数。

那么问题来了:朋友那股歪着的力,到底有多少"真正顺着雪橇前进方向"在出力?如果他歪得更狠一点,出的力气不变,帮上的部分会不会反而变成"拖后腿"?

想把"有多顺"这件事说清楚,说出一个数字来,就得靠这一篇的主角——点积。

实现方案

投影:把一根箭头"拍"到另一根方向上

先只看"有多少在帮忙"这件事,不管数字,只看图。

把朋友那根歪的箭头,垫上一盏垂直的灯,往雪橇前进的方向上一照,地上留下的影子,就是它"真正顺着这个方向"的那一段长度——这段影子叫投影。

盯住下面这个动画:橙色箭头 a(雪橇前进方向)不动,青色箭头 b 绕着圈转,紫色那一段就是 b 在 a 方向上的投影。同向时投影最长,转到垂直时投影缩成一个点(0),转过去之后投影翻到另一侧,代表"反着帮忙"(拖后腿):

橙色 a 不动;青色 b 绕圈转;紫色 = b 在 a 方向上的投影紫色变短→缩成一点→翻到左边,就是点积从最大到 0 到负的过程

点积,就是这段投影的长度,再乘上 a 自己的长度:

a⋅b=∣a∣×(b 在 a 方向上的投影长度)a \cdot b = |a| \times (\text{b 在 a 方向上的投影长度}) a⋅b=∣a∣×(b 在 a 方向上的投影长度)

朋友歪着拉的例子里:投影越长,说明他歪得越轻,真正帮上的力越大;投影缩成 0,说明他完全在做无用功;如果他歪得超过 90 度(往后拉),投影变成负的,说明他不是没帮忙,是在拖后腿。

坐标算法:对应位置分别相乘再相加

回到第二篇的语言:任何箭头都能拆成"横着走几步 + 竖着走几步"。设 a = (a₁, a₂),b = (b₁, b₂)。

先看最简单的情形:如果 a 正好躺在横轴上(比如 a = (3, 0)),b 在 a 方向上的投影,就直接是 b 的横坐标 b₁——竖直方向对"沿 a 方向出了多少力"完全没有贡献,那部分被浪费掉了,就像雪橇例子里被侧向抵消的力。这时点积 = |a| × 投影 = 3 × b₁ = 3b₁ + 0 × b₂,正好是"对应位置分别相乘再相加"。

a 不躺在轴上时,把它拆成横轴分量和竖轴分量分别投影再叠加(这正是第 3 篇"线性组合"讲的"整体效果 = 各分量效果叠加")。拆到最后,结果总是:

a⋅b=a1b1+a2b2a \cdot b = a_1 b_1 + a_2 b_2 a⋅b=a1​b1​+a2​b2​

这条公式不是规定出来的,是"投影"这件事在坐标系里算出来的必然结果。

三种方向关系:同向、反向、垂直

投影的长度和正负,完全取决于两根箭头的方向关系:

同向(b 稍微画高了点,实际同一方向)点积 > 0(较大)反向点积 < 0垂直点积 = 0(投影缩成一点)
  • 方向相同:投影就是箭头本身的长度,点积 = 两者长度相乘,是这个方向组合下能拿到的最大值。
  • 方向相反:投影翻到了反面,点积 = 两者长度相乘的相反数,是个负数。
  • 方向垂直:完全没有投影,一点忙都没帮上也没拖后腿,点积正好是 0。

除以长度,得到"纯方向"的对齐程度

点积的大小会被两根箭头的长度左右——箭头本身变长,点积也会跟着变大,容易让人分不清"是更顺了,还是只是更长了"。

把点积除以两根箭头的长度,长度的影响就被"除掉"了:

cos⁡θ=a⋅b∣a∣∣b∣\cos\theta = \frac{a \cdot b}{|a||b|} cosθ=∣a∣∣b∣a⋅b​

剩下的这个数叫夹角的余弦,取值永远落在 -1 到 1 之间:1 表示完全同向,0 表示垂直,-1 表示完全反向。这就是"归一化"在几何上的意思——只看方向对不对齐,不管箭头本身多长多短。

点积可以随便换顺序

在矩阵乘法那一篇,AB 和 BA 一般不是一回事——顺序换了,结果就变了。

点积不一样:a·b 和 b·a 算出来永远相等。坐标公式 a₁b₁ + a₂b₂ 本身就和 b₁a₁ + b₂a₂ 没有区别;换个角度想,"a 相对 b 有多顺"和"b 相对 a 有多顺"说的其实是同一件事——两根箭头夹角的余弦是同一个数,不会因为你先说哪一根而改变。

点积的结果是一个数,不是箭头

第二篇里,箭头加箭头还是箭头,箭头乘一个数还是箭头——运算前后都待在"箭头的世界"里。

点积不一样:两根箭头进去,出来的是一个光秃秃的数(可能是正的、负的、或者 0),不再是箭头,也没有方向。这是这条链子里第一次从"箭头的世界"跨进"数字的世界"——因为我们问的问题本身就是"这两根箭头有多顺",答案自然是一个"顺不顺"的量,不需要指向哪里。

为什么这么做

为什么用"投影"来定义点积,而不是别的算法?

因为"有多顺"本来就是一个"沿着某个方向能用上多少"的问题,投影恰好就是这个问题的几何答案——它把"歪着的那部分被浪费掉"这件事直接画在了图上,不需要再解释。

为什么坐标公式恰好是"对应位置相乘再相加",这是巧合吗?

不是巧合。投影可以按坐标轴拆开分别算再叠加,拆到最后就只剩下"横坐标乘横坐标、竖坐标乘竖坐标,再加起来"这一种可能。公式是投影这件事在坐标系里唯一的写法,不是数学家随手规定的。

为什么还要除以长度算出余弦?

因为很多时候我们真正关心的只是"方向对不对齐",不想让"箭头多长"干扰判断。除掉长度之后,剩下的数只描述方向关系,可以放心地拿不同长度的箭头互相比较。

为什么这个运算要叫"积"(乘法)?

因为它和数的乘法长得像:对箭头缩放是线性的(a 变成 2 倍,点积也变成 2 倍),对箭头相加是可分配的(a·(b+c) = a·b + a·c)。这些是"乘法"这个词想表达的家族性质,借这个名字合情合理——但结果是不是箭头、能不能随便交换,还是要看具体运算,不能因为叫"积"就类比过头。

为什么别的选择不行

错误直觉一:点积不是"两个箭头长度相乘就完事"

很多人第一次听到"点积",会以为算法就是把两根箭头的长度直接乘起来。这忽略了方向这个关键变量。

看下面这组对比:一长一短但完全同向的两根箭头,点积反而比两根更长、但夹角很大的箭头更大:

一长一短,完全同向长度 5 × 1,点积 ≈ 5两根更长,夹角约 80°长度 4 × 4,点积 ≈ 2.8

右边那两根箭头长度都更大(4 × 4 > 5 × 1),但因为夹角很大、方向对不齐,投影很短,点积反而更小。长度只是原材料,方向对齐程度才是决定点积大小的关键——垂直的时候,两根箭头长度都不为 0,点积照样是 0。

错误直觉二:点积不总是正数

点积可以是负数——方向相反时就是负的。这个负号不是"数值变小了",它记录的是一个方向性的事实:箭头在往反方向使劲。就像雪橇例子里朋友要是拉反了方向,那不是"帮忙打了折扣",是在实打实地拖后腿。

错误直觉三:点积大不代表箭头"大",只代表"顺"

看到点积很大,容易联想到"这两根箭头肯定都很长很猛"。但决定点积大小的是长度和方向对齐程度的组合,不是单独哪一个。一长一短但严丝合缝同向的组合,点积可以轻松超过两根更长但斜得很厉害的组合(就是上面那组对比图)。点积衡量的始终是"顺不顺",不是"箭头本身有多大"。

沉淀结论

这一篇的收尾:

  1. 点积 = 投影长度 × 另一根箭头的长度——衡量的是"两个箭头有多顺"
  2. 坐标上等于对应位置分别相乘再相加(a₁b₁ + a₂b₂),这条公式是从投影推出来的,不是规定的
  3. 方向相同点积最大(正)、方向相反点积为负、方向垂直点积为 0
  4. 点积除以两根箭头的长度,得到夹角的余弦——只看方向对不对齐,不管长短
  5. 点积可交换(a·b = b·a),这一点与矩阵乘法的不可交换不同
  6. 点积的结果是一个数,不是箭头——这是这条链子第一次从箭头世界跨进数字世界

记忆口诀

点积 = 投影长度 × 另一根的长度,衡量两个箭头有多顺。
同向为正、反向为负、垂直为 0。
除以长度得余弦,只看方向不看长短。
点积能换顺序,矩阵乘法不能。
结果是一个数,不是箭头。

延伸阅读

这条几何直觉在大模型里换了个名字继续在用:

  • 文本/token embedding:把一段文字变成一个"箭头",只是维度从 2 推广到几百、几千,"顺不顺"的直觉完全不变。详见大模型核心原理。
  • RAG 向量检索:判断"哪段材料和我的问题最像",本质上就是在一堆箭头里找和查询箭头点积(或余弦)最大的那些。详见RAG 架构。
  • Attention 打分:模型要同时给一串词两两打"像不像"的分数,这正是矩阵乘法——批量算点积——的一个特例。详见大模型核心原理。

自测:合上资料能说清楚吗?

  1. 两根箭头长度都不为 0,点积却是 0,这是为什么?
参考答案

它们互相垂直——一根箭头在另一根方向上完全没有投影,一点忙都没帮上,也没拖后腿,所以点积正好是 0。这和箭头本身长不长完全无关,纯粹是方向关系。

  1. 点积可以是负数吗?负号代表什么?
参考答案

可以。 两根箭头方向相反时,点积就是负数。负号不是"数值变小",它记录的是一个方向性的事实:这根箭头在朝反方向使劲,就像拔河或拉雪橇时有人在反着拉,是在拖后腿而不是帮忙打折扣。

  1. "点积大"是不是就代表"两根箭头都很长"?为什么不是?
参考答案

不是。 点积由"长度"和"方向对齐程度"共同决定。一长一短但严丝合缝同向的组合,点积可以轻松超过两根更长、但夹角很大的组合——垂直时长度再大点积也是 0。点积衡量的是"顺不顺",不是"大不大"。

  1. 为什么"坐标上对应位置相乘再相加"不是规定出来的,而是能推出来的?
参考答案

因为投影本身可以按坐标轴拆开算:先只算横轴分量的投影贡献(横坐标相乘),再算竖轴分量的投影贡献(竖坐标相乘),两部分叠加起来就是总投影乘以长度的结果,正好等于"对应位置分别相乘再相加"。这是投影在坐标系里算出来的必然结果,不是数学家随手定的规则。

  1. 点积和 LLM/RAG 里说的"相似度"是不是同一件事?
参考答案

是同一套几何本体的两个名字。 RAG 检索、Attention 打分里的"相似度",本质都是在算高维箭头之间的点积(或除掉长度之后的余弦)——只是箭头从 2 维变成了几百、几千维,"两个箭头有多顺"的直觉完全没变。具体怎么落到工程实现,见大模型核心原理和RAG 架构。

最近更新: 2026/9/10 11:38
Prev
特征向量的直觉