AI 数学课程 · 第 42 课,共 180

点积将特征变成分数

展开点积以查看各特征的贡献,构建线性分类器分数,并使用 NumPy 排查顺序和概率方面的误解。

分享这篇文章

AI 模型可以打印出 1.51.5 这样的分数,却不说明哪些输入特征让这个数字上升或下降。点积让我们可以一次查看这个计算的一小部分:将每个特征乘以同一坐标上的权重,再把各个乘积相加。

学完本课后,你将能够把点积展开为带符号的特征贡献,使用 NumPy 实现点积,并读取二元线性分类器内部的原始分数,而不会把它误认为概率。

学习目标: 将点积解释为加权特征分数。

本课建立在第 041 课:内积度量对齐程度之上;在那一课中,同一个运算描述了两个向量彼此指向的相对方向。Mathematics for Machine Learning第 3.2 节提供了数学参考。这里的特征名称、数字、代码、视觉内容、分类器演示和练习题均为原创。

点积将特征与权重配对

令 x=(x1,…,xn)x=(x_1,\ldots,x_n) 为一个特征向量:它是一个按固定顺序排列、表示某个输入的数字列表。令 w=(w1,…,wn)w=(w_1,\ldots,w_n) 为一个权重向量:它是一个按固定顺序排列、说明模型如何组合这些特征的参数列表。两个向量都有 nn 个坐标,并且两个列表中的坐标 ii 必须表示同一件事。

转置记号让形状检查变得直观。如果把 ww 看作一个 n×1n\times1 的列向量,那么 wTw^{\mathsf T} 是 1×n1\times n,而 wTxw^{\mathsf T}x 是 1×11\times1 的结果——一个标量分数。求和式以更容易检查的形式表达了同一件事:每个坐标进行一次乘法,然后沿着一条加法链相加。

顺序是数据契约的一部分。如果 x2x_2 是错误率,那么 w2w_2 就必须是错误率权重。两个数组即使长度相同,只要坐标被调换,也可能描述错误的模型。

点积也是上一课介绍的标准实内积,但这里的角色不同。一个向量是输入表示,另一个向量是学习得到的或人为选择的评分参数。这样的角色分配使每个乘积 wixiw_i x_i 都值得检查。

一个完整的分数示例让每项贡献都可见

使用一个小的特征向量和权重向量:

x=(2.0, 0.5, 4.0, 3.0),w=(1.2, −0.8, 0.0, 0.4).x=(2.0,\ 0.5,\ 4.0,\ 3.0),\qquad w=(1.2,\ -0.8,\ 0.0,\ 0.4).

四个坐标已经是模型的数值输入。它们的名称只是这个示例中的标签;在真实流程中,预处理决定每个数字表示什么以及使用什么尺度。

坐标 ii 的贡献是 wixiw_i x_i。当特征与权重同号时,它为正;当二者异号时,它为负;当其中一个为零时,它为零。正贡献会把分数向上推,负贡献会把分数向下拉。大小 ∣wixi∣\lvert w_i x_i\rvert 表示在这个特定分数中该坐标的直接影响有多大。

跟踪每个特征乘积如何形成点积总和

该表是贡献图的完整数值备用呈现。
特征数值 xᵢ权重 wᵢ贡献 wᵢxᵢ
覆盖率2.001.20正 +2.40
错误指示量0.50−0.80负 −0.40
参考偏差4.000.00零 0.00
已验证信号3.000.40正 +1.20
点积总和3.20
一个点积的贡献瀑布图四个带标签的步骤依次加入贡献:正 2.40、负数 −0.40、零 0.00 和正 1.20。最终点积总和为 3.20。正、负和零步骤也通过文字和线型标出。运行分数0.0003.20覆盖率+2.40错误指示量−0.40参考偏差0.00已验证信号+1.20点积总和3.20

从上到下阅读表格,即可跟随每个数值、权重、符号和贡献,无需依赖图表的颜色或几何形状。

实线、虚线和轮廓标记是冗余提示:表格以及正、负或零标签本身就传达了含义。

该表是权威的备用呈现:贡献图快速展示运行总和的视觉轨迹,但不会把任何数字隐藏在颜色、悬停文本或客户端状态中。即使特征值为 4.04.0,零权重特征对这个模型分数也没有贡献。

如果模型还有偏置 bb,要把这个偏移量与特征乘积分开。令 b=−1.7b=-1.7,仿射分数变为

s=wTx+b=3.2−1.7=1.5.s=w^{\mathsf T}x+b=3.2-1.7=1.5.

偏置会让每个输入的分数都平移相同的量。它不表示四个特征中的某一个贡献了 −1.7-1.7。

为什么坐标乘积有用,但也有局限

这个和严格具有可加性。如果只有特征 ii 改变了 Δ\Delta,那么

wT(x+Δei)=wTx+wiΔ,w^{\mathsf T}(x+\Delta e_i)=w^{\mathsf T}x+w_i\Delta,

其中 eie_i 是第 ii 个位置为 11、其他位置为 00 的向量。因此,固定线性分数会改变 wiΔw_i\Delta——这个变化与其他坐标之间没有隐藏的交互项。

这使得 wixiw_i x_i 成为解释这一次线性计算的有用方式。但它并不意味着这个乘积就是完整的因果归因。训练好的系统可能包含相关特征、预处理步骤或后续非线性层。此外,不同单位或尺度的特征之间不能直接比较权重大小。标准化特征可能改变数值权重,但在相应更新参数后仍可保持模型预测等价。

线性分类器对分数进行阈值判断

二元线性分类器使用仿射分数

g(x)=wTx+bg(x)=w^{\mathsf T}x+b

然后应用如下的决策规则:

y^={1if g(x)≥0,0if g(x)<0.\hat y= \begin{cases} 1 & \text{if }g(x)\ge 0,\\ 0 & \text{if }g(x)<0. \end{cases}

对于上面的输入,g(x)=1.5g(x)=1.5,因此零阈值会将其分配到类别 11。阈值是第二步;点积本身只提供加权分数。改变阈值会改变决策,但不会改变特征乘积。

满足 g(x)=0g(x)=0 的点集在二维中是一条直线,在更高维度中是一个超平面。在标准欧几里得几何下,权重向量 ww 垂直于这条边界。沿着与 ww 对齐的方向移动输入会提高分数;逆着它移动会降低分数。这正是点积能把一列特征变成相对于分类器边界的位置的原因。

这种区别也出现在 scikit-learn 中。它的线性模型指南将预测写成截距加特征的加权组合(线性模型),而 LogisticRegression.decision_function 返回与到超平面的带符号距离相关的置信分数(LogisticRegression 文档)。这些分数不是概率。逻辑模型可以应用 sigmoid 函数:

σ(g)=11+e−g,\sigma(g)=\frac{1}{1+e^{-g}},

它会把 g=1.5g=1.5 映射为约 0.8180.818。这个数值是由模型链接函数产生的概率估计;它不是点积本身的含义,而估计是否校准良好是另一个问题。在同一份文档中,返回概率估计的 API 是 predict_proba。

同一个运算也可以表示注意力中的兼容性

在注意力计算中,查询 qq 和键 kk 都是表示向量。它们的点积 qTkq^{\mathsf T}k 是一个兼容性分数,用于把这个键与该查询的其他键进行比较。算术运算没有改变:配对对应坐标,乘法,再求和。

这里的解释不同于特征示例。在 wTxw^{\mathsf T}x 中,ww 扮演参数角色,xx 扮演输入角色,所以 wixiw_i x_i 是一个模型分数的坐标贡献。在 qTkq^{\mathsf T}k 中,两个向量都来自表示,因此一个乘积只是兼容性计算的一部分,并不自动构成某个词元为何重要的因果解释。第 041 课继续讲解这个分数如何经过缩放和 softmax;原始点积仍然是第一步。

NumPy 让实现贴近代数

对于一维数组,numpy.dot 计算两个向量的内积并返回一个标量。当目标是在求和前检查贡献时,逐元素乘法很有用:

import numpy as np

x = np.array([2.0, 0.5, 4.0, 3.0])
w = np.array([1.2, -0.8, 0.0, 0.4])
b = -1.7

contributions = w * x
raw_score = np.dot(w, x)
classifier_score = raw_score + b

assert np.allclose(contributions.sum(), raw_score)
print(contributions)
print(raw_score)
print(classifier_score)

输出为:

[ 2.4 -0.4  0.   1.2]
3.2
1.5

assert 检查的是核心恒等式:对可见的坐标乘积求和,应与紧凑的点积调用一致。在调试笔记本中同时保留这两种形式,比把 dot 当作黑盒更容易审计分数。

边界情况能发现看似合理的错误

四项检查可以避免大多数初学者错误:

  • 形状相同不代表含义相同。 如果特征顺序改变而权重顺序没有改变,NumPy 仍然可以将形状为 (4,)(4,) 的数组相乘。例如,将上面的权重与 x′=(2.0,4.0,0.5,3.0)x'=(2.0,4.0,0.5,3.0) 配对,会得到 2.4−3.2+0.0+1.2=0.42.4-3.2+0.0+1.2=0.4,而不是 3.23.2。代码可以运行,但模型输入错了。
  • 零向量的点积为零。 如果每个特征都是零,那么对任意 ww 都有 wTx=0w^{\mathsf T}x=0。有偏置时,分类器分数仍然是 bb。因此,分数为零并不能证明所有特征彼此抵消,而且零向量没有方向,无法进行基于角度的解释。
  • 负数不自动代表坏事。 负特征与负权重相乘会得到正贡献。例如,(−2)(−0.7)=+1.4(-2)(-0.7)=+1.4。符号描述的是这个模型中的乘积,而不是给特征贴上道德标签。
  • 分数不是概率。 原始值可以是 −4-4、00 或 1212。只有明确选择的输出规则——例如阈值、sigmoid 或 softmax——才会把这个分数变成决策或归一化估计。

下一课将从一个加权分数转向另一个几何问题:当选定的大小概念改变时,两点相距多远?Math for AI 课程页面将第 043 课:距离取决于所选择的几何列为下一步。

检查你的理解

Question 1

Show the step-by-step solution

令 x=(2,−1,3)x=(2,-1,3) 且 w=(0.5,2,−1)w=(0.5,2,-1)。计算三个坐标贡献和点积。哪一项会降低分数?

对应的乘积为

0.5(2)=1,2(−1)=−2,(−1)(3)=−3.0.5(2)=1,\qquad 2(-1)=-2,\qquad (-1)(3)=-3.

按坐标顺序相加:

wTx=1+(−2)+(−3)=−4.w^{\mathsf T}x=1+(-2)+(-3)=-4.

第二项和第三项会降低总和,因为它们为负。第三项向下的幅度更大,为 33 而不是 22。

Question 2

Show the step-by-step solution

对于 x=(3,2,−4)x=(3,2,-4) 和 w=(−2,0.5,0)w=(-2,0.5,0),计算分数,并解释第三个特征为什么不改变分数。

逐坐标相乘:

(−2)(3)=−6,0.5(2)=1,0(−4)=0.(-2)(3)=-6,\qquad 0.5(2)=1,\qquad 0(-4)=0.

因此分数为

wTx=−6+1+0=−5.w^{\mathsf T}x=-6+1+0=-5.

第三个特征的值为 −4-4,但它的权重为零,所以乘积为零。对于这个拟合出的分数,该坐标会被忽略;这不意味着底层信号在另一个模型中或重新训练后永远不会有作用。

Question 3

Show the step-by-step solution

一个分类器的 x=(2,−1)x=(2,-1)、w=(1,−2)w=(1,-2) 且 b=−4b=-4。计算它的仿射分数,并应用零阈值。

先计算点积:

wTx=1(2)+(−2)(−1)=2+2=4.w^{\mathsf T}x=1(2)+(-2)(-1)=2+2=4.

然后加上偏置:

g(x)=4+(−4)=0.g(x)=4+(-4)=0.

分数恰好位于阈值上。按照 g(x)≥0⇒y^=1g(x)\ge 0\Rightarrow \hat y=1 的规则,该输入被分配到类别 11。如果规则使用严格的 >>,就会明确边界约定,并可能分配不同的类别。

Question 4

Show the step-by-step solution

正确的特征顺序是 x=(2,1,4)x=(2,1,4),权重为 w=(1,−3,2)w=(1,-3,2)。一个 bug 传入了 x′=(2,4,1)x'=(2,4,1)。计算两个分数并指出故障。

按预期顺序时,

wTx=1(2)+(−3)(1)+2(4)=2−3+8=7.w^{\mathsf T}x=1(2)+(-3)(1)+2(4)=2-3+8=7.

使用调换后的特征向量时,

wTx′=1(2)+(−3)(4)+2(1)=2−12+2=−8.w^{\mathsf T}x'=1(2)+(-3)(4)+2(1)=2-12+2=-8.

两个数组的形状都是 (3,)(3,),因此单独的形状检查无法发现这个错误。乘积把权重与错误的特征含义配对了;数据模式不仅要保持数组形状,也必须保持坐标顺序。

Question 5

Show the step-by-step solution

一个中心化特征的值为 xi=−2x_i=-2,其学习得到的权重为 wi=−0.7w_i=-0.7。这个坐标会降低分数吗?

不要只根据特征的符号判断,而是计算乘积:

wixi=(−0.7)(−2)=+1.4.w_i x_i=(-0.7)(-2)=+1.4.

它会让分数提高 1.41.4。两个负号相互抵消。在中心化或以其他方式变换后的特征空间中,负特征值是普通数字,不是错误。

Question 6

Show the step-by-step solution

原始分类器分数为 g(x)=1.5g(x)=1.5。1.51.5 是概率吗?如果模型明确使用 sigmoid 链接函数,在讨论校准之前它会产生什么数字?

原始分数不是概率:它可以超出区间 [0,1][0,1]。sigmoid 给出

σ(1.5)=11+e−1.5≈0.8176.\sigma(1.5)=\frac{1}{1+e^{-1.5}}\approx0.8176.

因此,链接函数产生约 0.8180.818。称其为有用的概率估计,需要模型及其校准假设;点积本身只产生了分数 1.51.5。

Question 7

Show the step-by-step solution

在 NumPy 中,x.shape == (4,) 且 w.shape == (4,),但数据流程重构后分数突然改变。请使用这个完整示例给出一个能揭示坐标顺序错误的数值检查。

重新计算逐元素乘积,并将它们的和与预期的有序分数比较:

w∗x=(2.4,−0.4,0.0,1.2),∑iwixi=3.2.w*x=(2.4,-0.4,0.0,1.2),\qquad \sum_i w_i x_i=3.2.

然后在点积之前打印特征名称及其数值。如果流程产生了 (2.0,4.0,0.5,3.0)(2.0,4.0,0.5,3.0),而权重仍保持原顺序,那么可见乘积会变为 (2.4,−3.2,0.0,1.2)(2.4,-3.2,0.0,1.2),总和为 0.40.4。数组仍然具有兼容的形状,所以除了形状检查,还需要贡献表或带名称的特征顺序断言。

Question 8

Show the step-by-step solution

一种注意力式比较使用 q=(1,2,−1)q=(1,2,-1) 和 k=(2,0,1)k=(2,0,1)。计算 qTkq^{\mathsf T}k,并解释它与分类器中的 wTxw^{\mathsf T}x 有何不同的一种含义。

配对并相加:

qTk=1(2)+2(0)+(−1)(1)=2+0−1=1.q^{\mathsf T}k=1(2)+2(0)+(-1)(1)=2+0-1=1.

结果是查询与键之间的兼容性分数。在分类器中,ww 是参数向量,xx 是输入,因此每个 wixiw_i x_i 都是特征分数的坐标贡献。在注意力中,qq 和 kk 都是表示;坐标乘积会贡献于二者的比较,但不自动构成因果特征归因。

资料来源

  1. Mathematics for Machine Learning book PDF, Section 3.2
  2. NumPy documentation: numpy.dot
  3. scikit-learn documentation: Linear Models
  4. scikit-learn documentation: LogisticRegression