点积 是什么
搜索引擎和推荐系统先把文章和商品变成由数百个数组成的向量,再根据两个向量指向同一方向的程度来判断它们是否相似。用一个数来衡量这种程度的工具就是内积,a·b = |a||b| cos θ,即两个长度与夹角余弦的乘积。把两个长度除掉,只剩下介于 −1 和 1 之间的 cos θ,这就是余弦相似度:1 表示方向相同,0 表示垂直,−1 表示方向正好相反。本讲依次讨论角度和长度对内积的影响、作为投影来看的内积、内积的符号、去掉长度的余弦相似度,以及内积为 0 的正交。
内积的大小怎样随夹角变化?下图中,绿色箭头 a 长 2.50,固定指向右方,两个滑块改变蓝色箭头 b 的角度和长度。初始 θ = 50°、|b| = 2.00 时,读数为 a·b = 3.21,旁边标着“正(同向)”;计算 2.50 × 2.00 × cos 50° 也得到同样的值。从这个状态只把 b 的长度增加到 3.00,内积就按同样的比例增大到 4.82;长度保持 2.00、只把角度转到 90°,得到 0.00;转到 180°、让 b 指向与 a 相反的一侧,得到 −5.00。从 b 的末端向 a 引的虚线的垂足用金色点标出,内积等于 a 的长度乘以到这个垂足的有符号距离。所以一个内积同时包含两个向量有多长,以及它们在多大程度上指向同一侧;要把两者分开看,就必须除以长度。
内积也可以读作投影:下图中 a 以长度 2 平放在 x 轴上,滑块只把长度为 2.4 的 b 的角度从 0° 改到 180°。从 b 的末端向 x 轴引虚线,到垂足为止的金色条就是 b 的投影;初始 35° 时,条下方写着 1.97,图下方的式子读作 a·b = |a| × 投影长度 = 2 × 1.966 = 3.93。b 越向 a 倾倒,投影越长:0° 时为 2 × 2.400 = 4.80,60° 时为 2 × 1.200 = 2.40;90° 时投影为 0,内积也是 0.00。超过 90° 后,金色条越过原点到左侧,投影长度变为负数,所以 120° 时内积也为负,即 2 × −1.200 = −2.40。也就是说,a·b 是 b 在 a 方向上伸出多少再乘以 a 的长度;如果 a 是单位向量,内积就是投影长度本身。
只看内积的符号,规律非常简单:下图中 a 沿 x 轴指向右方,滑块把 b 的角度 θ 从 0° 转到 360°。平面以过原点、垂直于 a 的虚线为界分成两半,a 一侧的半平面涂成绿色,另一侧涂成红色,b 的末端落在哪一侧决定内积的符号。初始 40° 时读数 a·b = 4.04 旁标着“正 · 同侧”;b 落在分界线上的 90° 和 270° 时,0.00 旁出现正交的标记;在两者之间为负,到 180° 时最小,为 −5.28。符号恰好在 90° 和 270° 改变,是因为 cos θ 在这两个角处经过 0 并改变符号,而两个长度总是正的,与符号无关。所以内积为正表示两个向量大致指向同一侧,为 0 表示垂直,为负表示大致指向相反的一侧;机器学习中的线性分类器,也是用权重向量 w 与输入 x 的内积加上一个常数后的符号,来判断点在分界的哪一侧。
余弦相似度是把内积除以两个长度、只留下 cos θ = a·b / (|a||b|) 的值,它总在 −1 到 1 之间。下图的两个滑块改变 b 的角度和长度;初始 45° 时 cos θ = 0.707,下方刻度条的指针位于 0 和 +1 之间的右侧。把长度滑块从 0.50 移到 3.00,指针和 0.707 纹丝不动;转动角度,指针就滑到 60° 时的 0.500、90° 时的 0.000、180° 时的 −1.000。所以余弦相似度忽略大小,只比较方向:讨论同一主题的长文和短文,词数不同使向量长度不同,但方向相近,因而得到较高的相似度。像词频这样各分量都不小于 0 的向量之间,余弦相似度停留在 0 到 1 之间;如果事先把嵌入的长度统一为 1,一次内积就直接等于余弦相似度,计算也更快。
内积为 0 的两个向量互相正交。下图中可以把 b 拖到平面上任何地方,a 长 2.5,固定指向右方。初始 b = (1.4, 2) 时 a·b = 3.50;把 b 移到 y 轴附近,使内积的绝对值小于 0.25,b 就变成金色并出现一个圆环,同时显示“正交”二字。因为 a 沿 x 轴方向,a·b = 2.5 × (b 的 x 分量),所以出现正交标记的是 x 分量大小小于 0.1 的、围绕 y 轴的一条窄带,而内积恰好为 0 的只有 y 轴本身。两个向量的内积为 0 时它们互相垂直,沿其中一个方向移动不会改变另一个方向上的分量。因为 x 轴和 y 轴的单位向量互相正交,改变一个坐标不会牵动另一个坐标;像傅里叶级数的正弦与余弦、主成分分析的各轴这样互相正交的基,可以用一次内积分别求出每个系数。