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

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

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

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

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

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

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

长度与归一化:先把尺子拉齐,再比谁更像

班里比谁嗓门大,一个人站在麦克风前,一个人站在教室最后排。测出来的音量差一大截,可这差距里有多少是嗓门,有多少只是距离?

🧠 一句话结论

箭头的长度用"平方和开根"算出来(就是方格纸上的直角三角形)。把一根箭头缩到长度 1,叫归一化——扔掉长短,只留方向。归一化之后,两根箭头的点积直接就是余弦,不用再除长度。


场景问题

学校搞"最强嗓门"比赛,老师拿了个分贝仪测音量。

第一个同学站在讲台上,紧挨着仪器喊,测出 90 分贝。第二个同学站在教室最后一排喊,测出 70 分贝。老师宣布第一个赢。

第二个同学当场不服:"我离得远啊!"

老师一想也对——测出来的这个数,混着两件事:他嗓门本身多大,和他离仪器多远。要真比嗓门,得先把所有人拉到同一个距离,或者把距离的影响从数字里除掉。

同样的麻烦在箭头上一模一样。第九篇算过:点积会被两根箭头的长度左右——箭头变长,点积跟着变大,你分不清是"更顺了"还是"只是更长了"。

要把长短的影响摘干净,得先能算长度,再想办法把它除掉。这就是这一篇的两件事。

实现方案

长度:方格纸上的直角三角形

一根箭头有多长?在方格纸上量一量就知道了。

一根"向右 3 格、向上 4 格"的箭头,跟它的横向那段、纵向那段,正好围成一个直角三角形:

箭头就是直角三角形的斜边向右 3 格向上 4 格长度 53 的平方 + 4 的平方 = 25,开根得 5

箭头就是这个三角形的斜边。斜边的算法你可能已经见过:两条直角边各自平方,加起来,再开根。

∣a∣=a12+a22|a| = \sqrt{a_1^2 + a_2^2} ∣a∣=a12​+a22​​

这行的意思是:箭头的长度,等于"向右几格"平方加"向上几格"平方,再开个根。

那两根竖线 | | 是"取长度"的记号,念作"a 的长度"。3 平方加 4 平方是 25,开根得 5——这根箭头长度是 5 格。

量尺根数再多也一样,只是多加几项:向右几格、向上几格、朝第三个方向几格……全平方加起来再开根。看不见的高维箭头,长度照样算得出来。

这个长度有个正经名字叫范数(就是"长度的正式说法"),但你叫它长度完全不影响理解。

归一化:把所有箭头缩到一样长

会算长度之后,"把距离的影响除掉"就好办了:把每根箭头都缩到长度 1。

怎么缩?拿箭头除以它自己的长度就行——这是第二篇讲过的数乘,乘以一个小于 1 的数就是把箭头按比例缩短,方向一点不变。

长短不一的箭头同时伸缩,末端全落到紫色圆上长度被统一成 1,方向一点没变

盯住这个动画:四根箭头长短不一、方向各异,缩放之后末端全部落在同一个圆上——长度统一了,朝向一根都没动。

这个操作叫归一化:扔掉"多长",只留"朝哪"。

分贝仪的例子里,这一步就是"把所有人拉到离仪器同样远的地方再喊"。

归一化之后,点积直接就是余弦

现在把第九篇的结论拿过来看看会发生什么。

那一篇算余弦是这样的:

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

这行的意思是:把点积除以两根箭头各自的长度,得到夹角的余弦。

如果两根箭头已经归一化过,长度都是 1,那分母就是 1 × 1 = 1——除了个寂寞。于是:

a⋅b=cos⁡θ(当 ∣a∣=∣b∣=1)a \cdot b = \cos\theta \quad (\text{当 } |a| = |b| = 1) a⋅b=cosθ(当 ∣a∣=∣b∣=1)

这行的意思是:两根长度都是 1 的箭头,它们的点积直接就是夹角的余弦,不用再除任何东西。

这是个特别实在的好处。检索系统里要拿一个问题去和几百万段材料比"像不像",如果每次都要现算两根箭头的长度再做除法,代价不小。提前把所有箭头都归一化存好,之后每次比较就只剩一个点积——省掉的除法乘上几百万次,是很大一笔账。

归一化丢了什么,留了什么

归一化把长度扔了。这到底算不算损失?

取决于你要哪一个。

你关心的归一化
这两个东西像不像(方向对不对齐)该做——长度只会添乱
这个东西有多强/多重(长度本身有含义)别做——你要的信息正是被扔掉的那个

嗓门比赛里,距离是干扰项,除掉它是对的。但如果比赛内容改成"谁能让最后一排听见",那距离就是正经信息,除掉就错了。

归一化不是"更好的做法",是"针对某个问题的做法"。 用之前先想清楚:长度对我这个问题,是干扰还是信息?

为什么这么做

为什么长度要平方加起来再开根,不能直接把坐标加起来?

因为箭头和它的横纵两段围成的是直角三角形,斜边不等于两条直角边之和。向右 3 格向上 4 格的箭头,直着走过去是 5 格,不是 7 格——沿着直角边绕路才是 7 格。平方加起来再开根,量的是"直着过去多远"。

为什么归一化要除以长度,而不是减掉一个数?

因为长度的影响是成倍的,不是平移的:箭头拉长 2 倍,点积跟着变 2 倍,不是加个固定值。要抵消一个成倍的影响,就得除以它。减法治不了乘法。

为什么值得专门把长度统一成 1,而不是别的数?

因为 1 是乘法和除法的"不添乱的数"。长度都是 1 时,点积里的长度因子直接消失,点积就等于余弦——省掉了每次比较时的两次除法。统一成 2 或别的数也能拉齐,但还得多带一个系数,白费事。

为什么别的选择不行

错误直觉一:以为长度就是坐标相加

"向右 3 格、向上 4 格,那不就是走了 7 格吗?"

沿着格子线绕路才是 7 格。 箭头是直着从起点戳到终点的,走的是斜边——5 格。

这个差别不是小数点后的细节:绕路和直走的差距可以很大。把这条记牢的最简单办法是记住那个直角三角形——长度量的是斜边,不是两条直角边加起来。

错误直觉二:以为归一化是丢信息的坏事

归一化确实丢了长度。但"丢"不等于"坏"——得看长度对你的问题算干扰还是算信息。

比"像不像"的时候,长度纯粹添乱:一段长文章的箭头天然比一句话的长,不除掉的话长文章会无脑占便宜。除掉之后才能公平地比方向。

比"有多强"的时候,长度就是你要的东西,这时候归一化就把正主给扔了。

同一个操作,在一个问题上是必需的清洗,在另一个问题上是致命的破坏。

错误直觉三:以为归一化之后点积还要再除长度

归一化之后两根箭头长度都是 1,余弦公式的分母是 1 × 1 = 1。再除一次是白除,除了浪费计算什么也没发生。

这个多余动作在少量数据上看不出来,在几百万次比较上就是一笔实打实的浪费。归一化的全部收益就在这里:把每次比较里的除法一次性提前做完,之后只剩点积。

沉淀结论

  1. 箭头长度 = 各坐标平方加起来再开根——就是方格纸上直角三角形的斜边,正式名字叫范数
  2. 归一化 = 把箭头除以自己的长度,缩到长度 1,方向一点不变
  3. 归一化之后,两根箭头的点积直接就是余弦,不用再除长度(回扣第九篇)
  4. 提前归一化存好,能把每次比较的除法一次性提前做完——大规模检索里这是笔大账
  5. 归一化不是"更好",是"针对某类问题":比方向该做,比强弱不该做

记忆口诀

长度 = 平方加起来再开根,量的是斜边不是绕路。
归一化 = 除以自己的长度,缩到 1,方向不变。
归一化之后点积直接就是余弦,不用再除。
扔掉的是长短,留下的是方向。
比方向该归一化,比强弱别归一化。

延伸阅读

  • LayerNorm / RMSNorm:模型每过一层就把那一层的箭头长度重新拉齐一次,免得有的层数值越滚越大、有的越滚越小。干的正是本篇的"把尺子拉齐"。详见大模型核心原理。
  • 向量库为什么存归一化过的向量:提前把除法做完,几百万次比较就只剩点积,省下的是实打实的时间。详见RAG 架构。

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

  1. 一根"向右 3 格、向上 4 格"的箭头有多长?为什么不是 7 格?
参考答案

5 格。 箭头是直着从起点戳到终点的,走的是直角三角形的斜边:3 的平方加 4 的平方等于 25,开根得 5。

7 格是沿着格子线绕路走的距离(先横着 3 格再竖着 4 格)。长度量的是直着过去多远,不是两条直角边加起来。

  1. 归一化到底做了什么?为什么是除以长度而不是减掉一个数?
参考答案

归一化就是把箭头除以它自己的长度,缩到长度 1,方向一点不变——扔掉"多长",只留"朝哪"。

必须用除法是因为长度的影响是成倍的:箭头拉长 2 倍,点积跟着变 2 倍,不是加个固定值。要抵消成倍的影响就得除,减法治不了乘法。

  1. 两根都归一化过的箭头做点积,得到的是什么?
参考答案

直接就是夹角的余弦。 因为余弦公式是点积除以两根箭头的长度,而归一化之后长度都是 1,分母是 1 × 1 = 1,除了等于没除。

好处很实在:提前归一化存好,几百万次比较就只剩点积,省掉的除法乘以百万次是很大一笔账。

  1. 归一化是不是总是好事?
参考答案

不是,得看长度对你的问题算干扰还是算信息。

比"像不像"时长度纯添乱——长文章的箭头天然比短句子长,不除掉的话长文章无脑占便宜,这时候该归一化。

比"有多强/多重"时长度就是你要的正主,归一化会把它扔掉,这时候不该做。同一个操作,在一个问题上是必需的清洗,在另一个问题上是致命的破坏。

  1. 已经归一化过的两根箭头,算完点积后再除以它们的长度,会怎样?
参考答案

什么也不会发生,纯属白除——长度都是 1,除以 1 等于没除。

但这个多余动作在几百万次比较上就是实打实的浪费。归一化的全部收益正是在这里:把每次比较里的除法一次性提前做完,之后每次只剩一个点积。多除那一下,等于把省下来的又还回去了。

最近更新: 2026/9/10 11:38
Prev
秩与低秩
Next
线性与非线性