1. Feature maps
回想一下,在我们讨论线性回归时,我们考虑了这样一个问题:根据房子的居住面积(用 x x x 表示)来预测房价(用 y y y 表示),并且我们用x的线性函数去拟合训练数据。那如果房价 y y y 用 x x x 的非线性函数来表示会更准确呢?在这种情况下,我们就需要比线性模型表达能力更强的一类模型。
我们首先考虑拟合三次函数 y = θ 3 x 3 + θ 2 x 2 + θ 1 x + θ 0 y = \theta_3 x^3 + \theta_2 x^2 + \theta_1 x + \theta_0 y = θ 3 x 3 + θ 2 x 2 + θ 1 x + θ 0 。我们可以把三次函数看作是在另一组不同的特征变量上的线性函数(定义如下)。具体来说,让函数 ϕ : R → R 4 \phi: \mathbb{R} \to \mathbb{R}^4 ϕ : R → R 4 定义为:
φ ( x ) = [ 1 x x 2 x 3 ] ∈ R 4 \varphi(x) = \begin{bmatrix} 1 \\ x \\ x^2 \\ x^3 \end{bmatrix} \in \mathbb{R}^4 φ ( x ) = 1 x x 2 x 3 ∈ R 4
让 θ ∈ R 4 \theta \in \mathbb{R}^4 θ ∈ R 4 是一个向量,里面包含 θ 0 \theta_0 θ 0 、θ 1 \theta_1 θ 1 、θ 2 \theta_2 θ 2 、θ 3 \theta_3 θ 3 这几个分量。这样我们就能把关于 x x x 的三次函数改写成:
θ 3 x 3 + θ 2 x 2 + θ 1 x + θ 0 = θ T φ ( x ) \theta_3 x^3 + \theta_2 x^2 + \theta_1 x + \theta_0 = \theta^T \varphi(x) θ 3 x 3 + θ 2 x 2 + θ 1 x + θ 0 = θ T φ ( x )
因此,变量 x x x 的三次函数可以看作是关于变量 φ ( x ) \varphi(x) φ ( x ) 的线性函数。为了区分这两组变量,在核方法的语境中:
原始的输入值,称为问题的 输入属性 (如本例中的 x x x ,房子的居住面积)。
原始输入被映射到一组新的量,将这些量称为 特征变量(features variables) 。
将 φ \varphi φ 称为 特征映射(feature map) ,它将属性映射到特征。
2. LMS with features
我们将推导用于拟合模型 θ T φ ( x ) \theta^T \varphi(x) θ T φ ( x ) 的梯度下降算法。首先回想一下,对于拟合 θ T x \theta^T x θ T x 的普通最小二乘问题,批量梯度下降的更新为(推导见第一讲笔记 ):
θ : = θ + α ∑ i = 1 n ( y ( i ) − h θ ( x ( i ) ) ) x ( i ) = θ + α ∑ i = 1 n ( y ( i ) − θ T x ( i ) ) x ( i ) \theta := \theta + \alpha \sum_{i=1}^n \left( y^{(i)} - h_\theta(x^{(i)}) \right) x^{(i)} = \theta + \alpha \sum_{i=1}^n \left( y^{(i)} - \theta^T x^{(i)} \right) x^{(i)} θ := θ + α i = 1 ∑ n ( y ( i ) − h θ ( x ( i ) ) ) x ( i ) = θ + α i = 1 ∑ n ( y ( i ) − θ T x ( i ) ) x ( i )
令 φ : R d → R p \varphi : \mathbb{R}^d \to \mathbb{R}^p φ : R d → R p 是一个特征映射,将属性 x x x (在 R d \mathbb{R}^d R d 中)映射到 R p \mathbb{R}^p R p 中的特征 φ ( x ) \varphi(x) φ ( x ) 。现在我们的目标是拟合函数 θ T φ ( x ) \theta^T \varphi(x) θ T φ ( x ) ,其中 θ \theta θ 是 R p \mathbb{R}^p R p 而不是 R d \mathbb{R}^d R d 中的向量。我们可以将上述算法中所有出现 x ( i ) x^{(i)} x ( i ) 的地方替换为 φ ( x ( i ) ) \varphi(x^{(i)}) φ ( x ( i ) ) ,得到新的更新:
θ : = θ + α ∑ i = 1 n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) (a) \theta := \theta + \alpha \sum_{i=1}^n \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \varphi(x^{(i)}) \tag{a} θ := θ + α i = 1 ∑ n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) ( a )
类似地,相应的随机梯度下降更新规则为:
θ : = θ + α ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) \theta := \theta + \alpha \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \varphi(x^{(i)}) θ := θ + α ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) )
3. LMS with the kernel trick
当特征 φ ( x ) \varphi(x) φ ( x ) 是高维时,上述梯度下降更新或随机梯度更新的计算成本会变得很高。例如,考虑将特征映射 φ \varphi φ 直接扩展到高维输入 x x x 。假设 x ∈ R d x \in \mathbb{R}^d x ∈ R d ,令 φ ( x ) \varphi(x) φ ( x ) 为包含 x x x 的所有次数 ≤ 3 \le 3 ≤ 3 的单项式的向量:
φ ( x ) = [ 1 x 1 x 2 ⋮ x d x 1 2 x 1 x 2 x 1 x 3 ⋮ x 2 x 1 ⋮ x 1 3 x 1 2 x 2 ⋮ ] (b) \varphi(x) = \begin{bmatrix}1 \\ x_1 \\ x_2 \\ \vdots \\ x_d \\ x_1^2 \\ x_1 x_2 \\ x_1 x_3 \\ \vdots \\ x_2 x_1 \\ \vdots \\ x_1^3 \\ x_1^2 x_2 \\ \vdots\end{bmatrix} \tag{b} φ ( x ) = 1 x 1 x 2 ⋮ x d x 1 2 x 1 x 2 x 1 x 3 ⋮ x 2 x 1 ⋮ x 1 3 x 1 2 x 2 ⋮ ( b )
特征 φ ( x ) \varphi(x) φ ( x ) 的维度大约是 d 3 d^3 d 3 这个数量级,即 d i m φ ( x ) = O ( d 3 ) dim \varphi(x) = O(d^3) d im φ ( x ) = O ( d 3 ) 。
为了简单起见,我们把带重复的所有单项式都包含进来(例如 x 1 x 2 x 3 x_1x_2x_3 x 1 x 2 x 3 和 x 2 x 3 x 1 x_2x_3x_1 x 2 x 3 x 1 都会出现在 φ ( x ) \varphi(x) φ ( x ) 里)。因此, φ ( x ) \varphi(x) φ ( x ) 中总共有 1 + d + d 2 + d 3 1 + d + d^2 + d^3 1 + d + d 2 + d 3 项。
对于计算目的来说,这是一个过长到无法承受的向量。当 d = 1000 d = 1000 d = 1000 时,每次更新至少需要计算和存储一个 1000 3 = 10 9 1000^3 = 10^9 100 0 3 = 1 0 9 维的向量,这比普通最小二乘更新规则慢 10 6 10^6 1 0 6 倍。
乍一看,每次更新需要 d 3 d^3 d 3 的运行时间和内存用量似乎是不可避免的,因为向量 θ \theta θ 本身的维度就是 p ≈ d 3 p ≈ d^3 p ≈ d 3 ,而我们可能需要更新 θ \theta θ 的每一个分量并把它存下来。不过,我们会引入 核技巧(kernel trick) ,有了它就不需要显式地存储 θ \theta θ ,运行时间也能大幅改善。
为了简单起见,我们初始时设定 θ = 0 \theta = 0 θ = 0 ,并且专注于迭代更新 ( a ) (a) ( a ) 式 :
θ : = θ + α ∑ i = 1 n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) (a) \theta := \theta + \alpha \sum_{i=1}^n \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \varphi(x^{(i)}) \tag{a} θ := θ + α i = 1 ∑ n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) ( a )
我们注意到,在迭代过程中的任何时候, θ \theta θ 都可以表示为向量 φ ( x ( 1 ) ) , … , φ ( x ( n ) ) \varphi(x^{(1)}), \ldots, \varphi(x^{(n)}) φ ( x ( 1 ) ) , … , φ ( x ( n ) ) 的线性组合。 我们可以通过归纳法证明如下:
At initialization, we have θ = 0 = ∑ i = 1 n 0 ⋅ φ ( x ( i ) ) \theta = 0 = \sum_{i=1}^n 0 \cdot \varphi(x^{(i)}) θ = 0 = ∑ i = 1 n 0 ⋅ φ ( x ( i ) )
Assume at some point, θ \theta θ can be represented as
θ = ∑ i = 1 n β i φ ( x ( i ) ) , β 1 , … , β n ∈ R \theta = \sum_{i=1}^n \beta_i \varphi(x^{(i)}), \beta_1, \ldots, \beta_n \in \mathbb{R} θ = i = 1 ∑ n β i φ ( x ( i ) ) , β 1 , … , β n ∈ R
Then we claim that in the next round, θ \theta θ is still a linear combination of φ ( x ( 1 ) ) , … , φ ( x ( n ) ) \varphi(x^{(1)}), \ldots, \varphi(x^{(n)}) φ ( x ( 1 ) ) , … , φ ( x ( n ) ) because:
θ : = θ + α ∑ i = 1 n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) = ∑ i = 1 n β i φ ( x ( i ) ) + α ∑ i = 1 n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) = ∑ i = 1 n ( β i + α ( y ( i ) − θ T φ ( x ( i ) ) ) ) ⏟ new β i φ ( x ( i ) ) \begin{aligned}\theta &:= \theta + \alpha \sum_{i=1}^n \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \varphi(x^{(i)}) \\&= \sum_{i=1}^n \beta_i \varphi(x^{(i)}) + \alpha \sum_{i=1}^n \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \varphi(x^{(i)}) \\&= \sum_{i=1}^n \underbrace{\left( \beta_i + \alpha \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) \right)}_{\text{new } \beta_i} \varphi(x^{(i)})\end{aligned} θ := θ + α i = 1 ∑ n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) = i = 1 ∑ n β i φ ( x ( i ) ) + α i = 1 ∑ n ( y ( i ) − θ T φ ( x ( i ) ) ) φ ( x ( i ) ) = i = 1 ∑ n new β i ( β i + α ( y ( i ) − θ T φ ( x ( i ) ) ) ) φ ( x ( i ) )
你可能会意识到,我们的目的是用一组系数 β 1 , … , β n \beta_1, \ldots, \beta_n β 1 , … , β n 来隐式表示 p p p 维向量 θ \theta θ 。为了做到这一点,我们继续推导出系数 β 1 , … , β n \beta_1, \ldots, \beta_n β 1 , … , β n 的更新规则。从上面的等式可以看出,新的 β i \beta_i β i 依赖于旧的 :
β i : = β i + α ( y ( i ) − θ T φ ( x ( i ) ) ) \beta_i := \beta_i + \alpha \left( y^{(i)} - \theta^T \varphi(x^{(i)}) \right) β i := β i + α ( y ( i ) − θ T φ ( x ( i ) ) )
这里等式右边仍然有旧的 θ \theta θ ,将 θ = ∑ j = 1 n β j φ ( x ( j ) ) \theta = \sum_{j=1}^n \beta_j \varphi(x^{(j)}) θ = ∑ j = 1 n β j φ ( x ( j ) ) 代入:
∀ i ∈ { 1 , … , n } , β i : = β i + α ( y ( i ) − ∑ j = 1 n β j φ ( x ( j ) ) T φ ( x ( i ) ) ) \forall i \in \{1, \ldots, n\},\quad \beta_i := \beta_i + \alpha \left( y^{(i)} - \sum_{j=1}^n \beta_j \varphi(x^{(j)})^T \varphi(x^{(i)}) \right) ∀ i ∈ { 1 , … , n } , β i := β i + α ( y ( i ) − j = 1 ∑ n β j φ ( x ( j ) ) T φ ( x ( i ) ) )
即
∀ i ∈ { 1 , … , n } , β i : = β i + α ( y ( i ) − ∑ j = 1 n β j ⟨ φ ( x ( j ) ) , φ ( x ( i ) ) ⟩ ) \boxed{\forall i \in \{1, \ldots, n\},\quad \beta_i := \beta_i + \alpha \left( y^{(i)} - \sum_{j=1}^n \beta_j \langle \varphi(x^{(j)}), \varphi(x^{(i)}) \rangle \right)} ∀ i ∈ { 1 , … , n } , β i := β i + α ( y ( i ) − j = 1 ∑ n β j ⟨ φ ( x ( j ) ) , φ ( x ( i ) )⟩ )
我们将 φ ( x ( j ) ) T φ ( x ( i ) ) \varphi(x^{(j)})^T \varphi(x^{(i)}) φ ( x ( j ) ) T φ ( x ( i ) ) 重写为 ⟨ φ ( x ( j ) ) , φ ( x ( i ) ) ⟩ \langle \varphi(x^{(j)}), \varphi(x^{(i)}) \rangle ⟨ φ ( x ( j ) ) , φ ( x ( i ) )⟩ 以强调它是两个特征向量的内积 。通过把 β i \beta_i β i 看作 θ \theta θ 的新表示 ,我们成功地把批量梯度下降算法转化成了一个迭代更新 β \beta β 值 的算法。
看起来,在每一次迭代中,我们仍然需要计算所有 i , j i,j i , j 对的 ⟨ φ ( x ( j ) ) , φ ( x ( i ) ) ⟩ \langle \varphi(x^{(j)}), \varphi(x^{(i)}) \rangle ⟨ φ ( x ( j ) ) , φ ( x ( i ) )⟩ 值,而每一对的计算大概需要 O ( p ) O(p) O ( p ) 次运算。不过,有两个重要的特性可以补救:
我们可以在循环开始之前,先把所有 i , j i, j i , j 配对的 ⟨ φ ( x ( j ) ) , φ ( x ( i ) ) ⟩ \langle \varphi(x^{(j)}), \varphi(x^{(i)}) \rangle ⟨ φ ( x ( j ) ) , φ ( x ( i ) )⟩ 两两内积都预先算好。
对于 ( b ) (b) ( b ) 式定义的特征映射 φ \varphi φ (以及许多其他有趣的特征映射),计算 ⟨ φ ( x ( j ) ) , φ ( x ( i ) ) ⟩ \langle \varphi(x^{(j)}), \varphi(x^{(i)}) \rangle ⟨ φ ( x ( j ) ) , φ ( x ( i ) )⟩ 可以很高效,不一定需要显式计算 φ ( x ( i ) ) \varphi(x^{(i)}) φ ( x ( i ) ) 。这是因为:
⟨ φ ( x ) , φ ( z ) ⟩ = 1 + ∑ i = 1 d x i z i + ∑ i , j x i x j z i z j + ∑ i , j , k x i x j x k z i z j z k = 1 + ⟨ x , z ⟩ + ⟨ x , z ⟩ 2 + ⟨ x , z ⟩ 3 \begin{aligned}
\langle \varphi(x), \varphi(z) \rangle &= 1 + \sum_{i=1}^d x_i z_i + \sum_{i,j} x_i x_j z_i z_j + \sum_{i,j,k} x_i x_j x_k z_i z_j z_k \\&= 1 + \langle x, z \rangle + \langle x, z \rangle^2 + \langle x, z \rangle^3
\end{aligned} ⟨ φ ( x ) , φ ( z )⟩ = 1 + i = 1 ∑ d x i z i + i , j ∑ x i x j z i z j + i , j , k ∑ x i x j x k z i z j z k = 1 + ⟨ x , z ⟩ + ⟨ x , z ⟩ 2 + ⟨ x , z ⟩ 3
因此,要计算 ⟨ φ ( x ) , φ ( z ) ⟩ \langle \varphi(x), \varphi(z) \rangle ⟨ φ ( x ) , φ ( z )⟩ ,我们可以先以 O ( d ) O(d) O ( d ) 的时间计算 ⟨ x , z ⟩ \langle x, z \rangle ⟨ x , z ⟩ ,然后再用常数次操作计算 1 + ⟨ x , z ⟩ + ⟨ x , z ⟩ 2 + ⟨ x , z ⟩ 3 1 + \langle x, z \rangle + \langle x, z \rangle^2 + \langle x, z \rangle^3 1 + ⟨ x , z ⟩ + ⟨ x , z ⟩ 2 + ⟨ x , z ⟩ 3 。如你所见,特征之间的内积 ⟨ φ ( x ) , φ ( z ) ⟩ \langle \varphi(x), \varphi(z) \rangle ⟨ φ ( x ) , φ ( z )⟩ 在这里至关重要。我们把对应于特征映射 φ \varphi φ 的核定义为一个满足 K : X × X → R K: \mathcal{X} \times \mathcal{X} \to \mathbb{R} K : X × X → R 的函数:
K ( x , z ) ≜ ⟨ φ ( x ) , φ ( z ) ⟩ \boxed{K(x, z) \triangleq \langle \varphi(x), \varphi(z) \rangle} K ( x , z ) ≜ ⟨ φ ( x ) , φ ( z )⟩
(p.s. X \mathcal{X} X is the space of the input x(因为是输入对),In our running example, X = R d \mathcal{X} = \mathbb{R}^d X = R d )
总结讨论,我们把最终算法写为如下形式:
对所有 i , j ∈ { 1 , … , n } i, j \in \{1, \ldots, n\} i , j ∈ { 1 , … , n } ,计算 K ( x ( i ) , x ( j ) ) ≜ ⟨ φ ( x ( i ) ) , φ ( x ( j ) ) ⟩ K(x^{(i)}, x^{(j)}) \triangleq \langle \varphi(x^{(i)}), \varphi(x^{(j)}) \rangle K ( x ( i ) , x ( j ) ) ≜ ⟨ φ ( x ( i ) ) , φ ( x ( j ) )⟩ ,设 β : = 0 \beta := 0 β := 0 。
Loop:∀ i ∈ { 1 , … , n } , β i : = β i + α ( y ( i ) − ∑ j = 1 n β j K ( x ( i ) , x ( j ) ) ) (c) \forall i \in \{1, \ldots, n\}, \quad \beta_i := \beta_i + \alpha \left( y^{(i)} - \sum_{j=1}^n \beta_j K(x^{(i)}, x^{(j)}) \right) \tag{c} ∀ i ∈ { 1 , … , n } , β i := β i + α ( y ( i ) − j = 1 ∑ n β j K ( x ( i ) , x ( j ) ) ) ( c )
或者用向量符号表示,令 K K K 为 n × n n \times n n × n 矩阵,其中 K i j = K ( x ( i ) , x ( j ) ) K_{ij} = K(x^{(i)}, x^{(j)}) K ij = K ( x ( i ) , x ( j ) ) ,我们有
β : = β + α ( y ⃗ − K β ) \beta := \beta + \alpha(\vec{y} - K\beta) β := β + α ( y − K β )
使用上述算法,我们可以有效地更新向量 θ \theta θ 的表示 β \beta β ,每次更新需要 O ( n ) O(n) O ( n ) 时间。最后,我们需要证明表示 β \beta β 的信息足以计算预测值 θ T φ ( x ) \theta^T \varphi(x) θ T φ ( x ) 。实际上,我们有:
θ T φ ( x ) = ∑ i = 1 n β i φ ( x ( i ) ) T φ ( x ) = ∑ i = 1 n β i K ( x ( i ) , x ) (d) \theta^T \varphi(x) = \sum_{i=1}^n \beta_i \varphi(x^{(i)})^T \varphi(x) = \sum_{i=1}^n \beta_i K(x^{(i)}, x) \tag{d} θ T φ ( x ) = i = 1 ∑ n β i φ ( x ( i ) ) T φ ( x ) = i = 1 ∑ n β i K ( x ( i ) , x ) ( d )
你可能会意识到,关于特征映射 φ ( ⋅ ) \varphi(\cdot) φ ( ⋅ ) ,我们本质上需要知道的全部信息都包含在相应的核函数 K ( ⋅ , ⋅ ) K(\cdot, \cdot) K ( ⋅ , ⋅ ) 。我们将在下一节中进一步阐述这一点。
4. Properties of kernels
在上一小节里,我们从一个明确定义的特征映射 φ \varphi φ 出发,它导出了核函数 K ( x , z ) ≜ ⟨ φ ( x ) , φ ( z ) ⟩ K(x, z) \triangleq \langle \varphi(x), \varphi(z) \rangle K ( x , z ) ≜ ⟨ φ ( x ) , φ ( z )⟩ 。然后我们看到核函数是如此内在,以至于只要定义了核函数,整个训练算法就可以完全用核的语言来写,而无需引用特征映射 φ \varphi φ ,测试样本的测试也是如此(见公式 d d d )。
因此,我们很自然地想定义其他核函数 K ( ⋅ , ⋅ ) K(\cdot, \cdot) K ( ⋅ , ⋅ ) 并运行算法 ( c ) (c) ( c ) 。这是因为我们注意到算法 ( c ) (c) ( c ) 并不需要显式访问特征映射 φ \varphi φ ,因此我们只需要确定特征映射 φ \varphi φ 的存在性,而不太关心知道 φ \varphi φ 的显式形式。
不过,不是随便定义一个函数都可以成为 kernel 的。什么样的函数 K ( ⋅ , ⋅ ) K(\cdot, \cdot) K ( ⋅ , ⋅ ) 可能对应于某个特征映射 φ \varphi φ ?换句话说,我们能否判断是否存在某个特征映射 φ \varphi φ ,使得对于所有 x , z x, z x , z 有 K ( x , z ) = φ ( x ) T φ ( z ) K(x, z) = \varphi(x)^T \varphi(z) K ( x , z ) = φ ( x ) T φ ( z ) ?
如果我们能通过精确刻画合法核函数 来回答这个问题,那我们就能选择核函数 K K K 而不是选择特征映射 φ \varphi φ 。具体来说,我们可以选择一个函数 K K K ,验证它满足该刻画(存在一个 K K K 对应的特征映射 φ \varphi φ ),然后运行 ( c ) (c) ( c ) 。这样做的好处是,我们不需要能够计算 φ \varphi φ 或解析地写出它,只需要知道它的存在就行了。在介绍了几个核的具体例子之后,我们将在本小节末尾回答这个问题。
e . g .1 e.g. 1 e . g .1
假设 x , z ∈ R d x, z \in \mathbb{R}^d x , z ∈ R d ,首先考虑如下定义的函数 K ( ⋅ , ⋅ ) K(\cdot, \cdot) K ( ⋅ , ⋅ ) :
K ( x , z ) = ( x T z ) 2 K(x, z) = (x^T z)^2 K ( x , z ) = ( x T z ) 2
我们也可以将其写为:
K ( x , z ) = ( ∑ i = 1 d x i z i ) ( ∑ j = 1 d x j z j ) = ∑ i = 1 d ∑ j = 1 d x i x j z i z j = ∑ i , j = 1 d ( x i x j ) ( z i z j ) \begin{aligned}K(x, z) &= \left( \sum_{i=1}^d x_i z_i \right) \left( \sum_{j=1}^d x_j z_j \right) \\&= \sum_{i=1}^d \sum_{j=1}^d x_i x_j z_i z_j \\&= \sum_{i,j=1}^d (x_i x_j)(z_i z_j)\end{aligned} K ( x , z ) = ( i = 1 ∑ d x i z i ) ( j = 1 ∑ d x j z j ) = i = 1 ∑ d j = 1 ∑ d x i x j z i z j = i , j = 1 ∑ d ( x i x j ) ( z i z j )
因此,我们看到 K ( x , z ) = ⟨ φ ( x ) , φ ( z ) ⟩ K(x, z) = \langle \varphi(x), \varphi(z) \rangle K ( x , z ) = ⟨ φ ( x ) , φ ( z )⟩ 是核函数,对应于以下特征映射 φ \varphi φ (这里以 d = 3 d=3 d = 3 为例):
φ ( x ) = [ x 1 x 1 x 1 x 2 x 1 x 3 x 2 x 1 x 2 x 2 x 2 x 3 x 3 x 1 x 3 x 2 x 3 x 3 ] \varphi(x) = \begin{bmatrix}x_1 x_1 \\ x_1 x_2 \\ x_1 x_3 \\ x_2 x_1 \\ x_2 x_2 \\ x_2 x_3 \\ x_3 x_1 \\ x_3 x_2 \\ x_3 x_3\end{bmatrix} φ ( x ) = x 1 x 1 x 1 x 2 x 1 x 3 x 2 x 1 x 2 x 2 x 2 x 3 x 3 x 1 x 3 x 2 x 3 x 3
重新审视核的计算效率视角,注意计算高维的 φ ( x ) \varphi(x) φ ( x ) 需要 O ( d 2 ) O(d^2) O ( d 2 ) 时间,而计算 K ( x , z ) K(x, z) K ( x , z ) 只需要 O ( d ) O(d) O ( d ) 时间,后者与输入属性的维度成线性关系。
e . g .2 e.g. 2 e . g .2
考虑 K ( ⋅ , ⋅ ) K(\cdot, \cdot) K ( ⋅ , ⋅ ) 定义为:
K ( x , z ) = ( x T z + c ) 2 = ∑ i , j = 1 d ( x i x j ) ( z i z j ) + ∑ i = 1 d ( 2 c x i ) ( 2 c z i ) + c 2 \begin{aligned}K(x, z) &= (x^T z + c)^2 \\&= \sum_{i,j=1}^d (x_i x_j)(z_i z_j) + \sum_{i=1}^d (\sqrt{2c} x_i)(\sqrt{2c} z_i) + c^2\end{aligned} K ( x , z ) = ( x T z + c ) 2 = i , j = 1 ∑ d ( x i x j ) ( z i z j ) + i = 1 ∑ d ( 2 c x i ) ( 2 c z i ) + c 2
这个函数 K K K 是一个核函数,对应于以下特征映射(同样以 d = 3 d=3 d = 3 为例):
φ ( x ) = [ x 1 x 1 x 1 x 2 x 1 x 3 x 2 x 1 x 2 x 2 x 2 x 3 x 3 x 1 x 3 x 2 x 3 x 3 2 c x 1 2 c x 2 2 c x 3 c ] \varphi(x) = \begin{bmatrix}x_1 x_1 \\ x_1 x_2 \\ x_1 x_3 \\ x_2 x_1 \\ x_2 x_2 \\ x_2 x_3 \\ x_3 x_1 \\ x_3 x_2 \\ x_3 x_3 \\ \sqrt{2c} x_1 \\ \sqrt{2c} x_2 \\ \sqrt{2c} x_3 \\ c\end{bmatrix} φ ( x ) = x 1 x 1 x 1 x 2 x 1 x 3 x 2 x 1 x 2 x 2 x 2 x 3 x 3 x 1 x 3 x 2 x 3 x 3 2 c x 1 2 c x 2 2 c x 3 c
参数 c c c 控制 x i x_i x i (一阶项)和 x i x j x_i x_j x i x j (二阶项) 之间的相对权重。
更广泛地说,核 K ( x , z ) = ( x T z + c ) k K(x, z) = (x^T z + c)^k K ( x , z ) = ( x T z + c ) k 对应于一个到 ( d + k k ) \binom{d+k}{k} ( k d + k ) 维特征空间的映射(可以自行通过分配多项式次数的方式进行验证),该特征空间包含所有次数不超过 k k k 的形如 x i 1 x i 2 … x i k x_{i_1} x_{i_2} \ldots x_{i_k} x i 1 x i 2 … x i k 的单项式。然而,然而,尽管工作在这个 O ( d k ) O(d^k) O ( d k ) 维空间中,计算 K ( x , z ) K(x, z) K ( x , z ) 仍然只需要 O ( d ) O(d) O ( d ) 时间,因此我们永远不需要在这个非常高维的特征空间中显式表示特征向量。
4.1 Kernels as similarity metrics
现在,我们来聊一个稍微有点不一样的角度来看核函数。直观地说(这种直觉有些问题,不过先不管它),如果 φ ( x ) \varphi(x) φ ( x ) 和 φ ( z ) \varphi(z) φ ( z ) 很接近,那么我们可能期望 K ( x , z ) = φ ( x ) T φ ( z ) K(x, z) = \varphi(x)^T \varphi(z) K ( x , z ) = φ ( x ) T φ ( z ) 很大。相反,如果 φ ( x ) \varphi(x) φ ( x ) 和 φ ( z ) \varphi(z) φ ( z ) 很相距很远——比如说几乎正交——那么 K ( x , z ) = φ ( x ) T φ ( z ) K(x, z) = \varphi(x)^T \varphi(z) K ( x , z ) = φ ( x ) T φ ( z ) 就会很小。因此,我们可以将 K ( x , z ) K(x, z) K ( x , z ) 视为衡量 φ ( x ) \varphi(x) φ ( x ) 和 φ ( z ) \varphi(z) φ ( z ) 相似程度,或 x x x 和 z z z 相似程度的某种度量。
基于这种直觉,假设对于你在解决的某个学习问题,你想到了一个函数 K ( x , z ) K(x, z) K ( x , z ) ,你认为它可能是 x x x 和 z z z 之间相似度的合理度量。例如,你选择了:
K ( x , z ) = exp ( − ∥ x − z ∥ 2 2 σ 2 ) K(x, z) = \exp\left( -\frac{\|x - z\|^2}{2\sigma^2} \right) K ( x , z ) = exp ( − 2 σ 2 ∥ x − z ∥ 2 )
这是衡量 x x x 和 z z z 之间相似度的合理度量,当 x x x 和 z z z 接近时接近 1,当 x x x 和 z z z 接近时接近 0。是否存在一个特征映射 φ \varphi φ ,使得上述定义的核 K K K 满足 K ( x , z ) = φ ( x ) T φ ( z ) K(x, z) = \varphi(x)^T \varphi(z) K ( x , z ) = φ ( x ) T φ ( z ) ?在这个特定的例子中,答案是肯定的。这个核称为高斯核(the Gaussian kernel) ,对应一个无限维的特征映射 φ \varphi φ 。我们将精确刻画一个函数 K K K 需要满足什么性质才能成为一个有效的核函数,即对应某个特征映射 φ \varphi φ 。
4.2 Necessary conditions & Sufficient conditions
现在假设 K K K 确实是确实是一个对应于某个特征映射 φ \varphi φ 的有效核,我们首先看它满足什么性质。考虑某个有限的 n n n 个点的集合 { x ( 1 ) , … , x ( n ) } \{x^{(1)}, \ldots, x^{(n)}\} { x ( 1 ) , … , x ( n ) } (不一定是训练集),并定义一个方形的 n × n n \times n n × n 矩阵 K K K ,其 ( i , j ) (i,j) ( i , j ) 元素为 K i j = K ( x ( i ) , x ( j ) ) K_{ij} = K(x^{(i)}, x^{(j)}) K ij = K ( x ( i ) , x ( j ) ) 。这个矩阵称为核矩阵 。注意,我们重载了符号,用 K K K 同时表示核函数 K ( x , z ) K(x, z) K ( x , z ) 和核矩阵 K K K ,因为它们有显然的密切关系。
4.21 symmetric
现在,如果 K K K 是一个有效的核,那么
K i j = K ( x ( i ) , x ( j ) ) = φ ( x ( i ) ) T φ ( x ( j ) ) = φ ( x ( j ) ) T φ ( x ( i ) ) = K ( x ( j ) , x ( i ) ) = K j i K_{ij} = K(x^{(i)}, x^{(j)}) = \varphi(x^{(i)})^T \varphi(x^{(j)}) = \varphi(x^{(j)})^T \varphi(x^{(i)}) = K(x^{(j)}, x^{(i)}) = K_{ji} K ij = K ( x ( i ) , x ( j ) ) = φ ( x ( i ) ) T φ ( x ( j ) ) = φ ( x ( j ) ) T φ ( x ( i ) ) = K ( x ( j ) , x ( i ) ) = K j i
因此 K K K 必须是对称的。
4.22 positive semi-definite
令 φ k ( x ) \varphi_k(x) φ k ( x ) 表示向量 φ ( x ) \varphi(x) φ ( x ) 的第 k k k 个坐标,我们发现对任意向量 z z z :
z T K z = ∑ i ∑ j z i K i j z j = ∑ i ∑ j z i φ ( x ( i ) ) T φ ( x ( j ) ) z j = ∑ i ∑ j z i ∑ k φ k ( x ( i ) ) φ k ( x ( j ) ) z j = ∑ k ( ∑ i z i φ k ( x ( i ) ) ) ( ∑ j z j φ k ( x ( j ) ) ) = ∑ k ( ∑ i z i φ k ( x ( i ) ) ) 2 ≥ 0 \begin{aligned}z^T K z &= \sum_i \sum_j z_i K_{ij} z_j \\&= \sum_i \sum_j z_i \varphi(x^{(i)})^T \varphi(x^{(j)}) z_j \\&= \sum_i \sum_j z_i \sum_k \varphi_k(x^{(i)}) \varphi_k(x^{(j)}) z_j \\&= \sum_k \left( \sum_i z_i \varphi_k(x^{(i)}) \right) \left( \sum_j z_j \varphi_k(x^{(j)}) \right) \\&= \sum_k \left( \sum_i z_i \varphi_k(x^{(i)}) \right)^2 \\&\ge 0\end{aligned} z T K z = i ∑ j ∑ z i K ij z j = i ∑ j ∑ z i φ ( x ( i ) ) T φ ( x ( j ) ) z j = i ∑ j ∑ z i k ∑ φ k ( x ( i ) ) φ k ( x ( j ) ) z j = k ∑ ( i ∑ z i φ k ( x ( i ) ) ) ( j ∑ z j φ k ( x ( j ) ) ) = k ∑ ( i ∑ z i φ k ( x ( i ) ) ) 2 ≥ 0
由于 z z z 是任意的,这表明 K K K 是半正定 的(K ⪰ 0 K \succeq 0 K ⪰ 0 )。
因此,我们证明,如果 K K K 是一个有效的核函数,那么其对应的核矩阵 K ∈ R n × n K \in \mathbb{R}^{n \times n} K ∈ R n × n 是对称半正定 的。
更一般地,上述条件不仅是 K K K 为有效核(也称为Mercer 核 )的必要条件,也是充分条件。以下结果归功于 Mercer:
定理(Mercer) :令 K : R d × R d ↦ R K : \mathbb{R}^d \times \mathbb{R}^d \mapsto \mathbb{R} K : R d × R d ↦ R 给定。则 K K K 为有效(Mercer)核当且仅当对任意 { x ( 1 ) , … , x ( n ) } ( n < ∞ ) \{x^{(1)}, \ldots, x^{(n)}\} ~ (n < \infty) { x ( 1 ) , … , x ( n ) } ( n < ∞ ) ,相应的核矩阵是对称半正定的。
kernel 的效果示例
数字识别问题:其中给定一张手写数字(0-9)的图像(16×16 像素),我们需判断它是哪个数字。使用简单的多项式核 K ( x , z ) = ( x T z ) k K(x, z) = (x^T z)^k K ( x , z ) = ( x T z ) k 或者高斯核,SVM 能够在这个问题上获得非常好的性能。
其特征空间:输入属性 x x x 只是图像像素强度值的 256 维向量,系统没有任何关于视觉的先验知识,甚至不知道哪些像素彼此相邻。
字符串问题:分类的对象 x x x 是字符串(比如,x x x 是一个氨基酸列表,串联起来构成一个蛋白质),使用(类似动态规划的)字符串匹配算法,可以高效地计算 K ( x , z ) = φ ( x ) T φ ( z ) K(x, z) = \varphi(x)^T \varphi(z) K ( x , z ) = φ ( x ) T φ ( z ) ,这样我们就可以在这个高维的特征空间中隐式地工作,而无需显式计算该空间中的特征向量。
其特征空间:考虑 φ ( x ) \varphi(x) φ ( x ) 是一个特征向量,它计算 x x x 中每个长度为 k k k 的子串出现的次数。如果我们考虑英文字母的字符串,那么有 26 k 26^k 2 6 k 个这样的子串,对应 φ ( x ) \varphi(x) φ ( x ) 是一个 26 k 26^k 2 6 k 维的向量。
可见,核函数使得我们可以在非常复杂且难以表示的高维空间中进行学习。
5. Application
我们已经看到了核在线性回归中的应用。在下一部分中,我们将介绍支持向量机,核可以直接应用于其中。
实际上,核的思想比线性回归和 SVM 具有更广泛的适用性。具体来说,如果你有任何学习算法,可以仅用输入属性向量之间的内积 ⟨ x , z ⟩ \langle x, z \rangle ⟨ x , z ⟩ 来表示,那么通过将其替换为 K ( x , z ) K(x, z) K ( x , z ) (其中 K K K 是一个核),你可以"神奇地"让你的算法在 K K K 对应的高维特征空间中高效工作。例如,这个核技巧可以应用于感知器,从而推导出核感知器算法。我们将在本课程后面看到的许多算法也适用于这种方法,这种方法后来被称为"核技巧"。
参考
CS229 课程讲义
https://cs229.stanford.edu/main_notes.pdf