点积 是什么
在搜索框里输入一个词,搜索引擎并不会一个字一个字地比较文章。它把每篇文章都变成向量,看两个向量指向同一方向的程度有多大。用一个数来量“方向有多一致”的工具,就是点积:a·b = |a||b|cos θ,也就是两个向量的长度与它们夹角余弦的乘积。去掉长度,只剩下 cos θ,这就是余弦相似度。方向相同就是相似,成直角就是无关,方向相反就是截然相反。搜索、推荐、词嵌入,全都运行在这一行式子上。
固定绿色箭头 a,用两个滑块操控蓝色箭头 b。一个滑块改变 b 的角度,另一个改变 b 的长度。下方写出的 a·b 值对两个滑块都有反应。把 b 拉长,值整体变大,这是长度效应;转动 b,方向一致时为正,成直角时为 0,方向相反时为负,这是对齐效应。数字的颜色随符号在绿色、浅色、红色之间变化,b 落在 a 上的垂足(金色点)也跟着移动。可以亲手感受到:一个点积同时装着长度和对齐两样东西。
点积还可以换个角度看。把 a 沿 +x 轴放倒,长度为 2,只用滑块转动 b 的角度,金色画出的那根条就是 b 直接落到 a 上的影子,也就是投影。条的末端写着它的长度。于是 a·b 恰好等于 |a| 乘以这个投影长度。把 b 往 a 那边放倒,影子变长,点积就大;把 b 立起来,影子变短,点积就小。成直角时影子为 0,点积也为 0。过了直角,影子落到另一侧,点积变成负数。点积说到底,就是用长度量出一个向量在另一个向量方向上伸出多远,再乘以 |a|。
单独看点积的符号,规则非常简单。把 a 放在 +x 轴上,用滑块把 b 的角度 θ 从 0 度扫到 360 度,平面被涂成两个区域。与 a 同侧的半平面(θ 在 90 度以内)是绿色的,那里点积为正。恰好在 90 度和 270 度,也就是直角处,点积为 0。另一侧的半平面(90 度到 270 度之间)是红色的,点积为负。转动 b,下方的文字在正、0、负之间切换,同时写出数值。一个符号就决定了是同一边、无关,还是相反的一边,一目了然。
现在把长度完全去掉:cos θ = a·b / (|a||b|)。这个值总在 -1 和 +1 之间。固定 a,用两个滑块改变 b 的角度和长度,决定性的一幕就出现了。只拉长或缩短 b,cos θ 纹丝不动,下方从 -1 画到 +1 的仪表指针停在原处。反过来转动角度,指针就一路滑动。余弦相似度忽略大小,只看方向。所以搜索引擎和嵌入不管文章长短,只凭所指的方向来比较两篇文章像不像。
最后,亲手抓住点积恰好为 0 的那一刻。a 是固定的,用手拖动蓝色箭头 b 在平面上四处移动,下方会实时显示 a·b 的值。当 b 经过与 a 成直角的位置时,值穿过 0,箭头亮成金色,并出现“正交”字样。点积为 0,意味着两个方向完全垂直,也就是彼此无关、相互独立。正是这个性质让坐标轴变得干净。x 轴和 y 轴正交,所以沿一根轴移动时,另一根轴的值不会晃动。所有干净的基,都来自这个点积为 0。