第 1 节 MLP

感知机

单层感知机大致如下:
notion image
准确地说,它由一次矩阵乘法和一个激活函数(通常是 ReLU)组成。
其中 是逐元素(element-wise)应用的。所谓 element-wise,就是函数不是作用在整个向量上得到一个整体结果,而是分别作用在向量的每一个分量上。例如如果
那么
也就是说,每个神经元的输出都会单独经过一次 ReLU:大于 0 的部分保留,小于 0 的部分变成 0。它的计算图如下:
notion image
中的每个元素称为特征, 中的每个元素称为标签(在监督学习中)。因此我们要做的事情,就是用一个矩阵把特征变换为标签。
激活函数是必要的;如果没有激活函数,整个变换就是:
这等价于一个简单的线性变换。

多层结构

如果使用多层神经元,就得到 MLP(Multi-Layer Perceptron,多层感知机):
notion image
在 MLP 中,我们可以更好地理解它的基本机制。当我们计算矩阵乘法时:
其中 本质上就是一个向量点积,等于:
它可以理解为带有强度信息的余弦相似度。因此训练之后,每个神经元()都表示某种特征,并通过 的数值来表示该神经元与上一层特征之间的相似程度。配合 函数,如果二者不相似甚至方向相反(),该特征就会被丢弃;如果二者相似,带强度的余弦相似度就会继续向前传播。

损失函数与代价函数

前向传播之后,我们需要计算损失函数:
损失函数的具体形式由任务决定,一个典型选择是 MSE:
在监督学习中,我们通常要最小化 ,使预测值尽可能接近真实值。
损失函数定义在单个训练样本上,而代价函数定义在多个样本的训练集上:
其中 是数据分布,我们最终的任务是找到能够最小化 的 。
在 i.i.d. 假设下,期望可以近似为:

梯度下降

给定优化问题:
一个典型选择是 梯度下降(Gradient Descent),它通过迭代寻找最小值。由泰勒展开可得:
如果希望 ,则需要:
其中 都是向量,因此它们必须方向相反:
其中 称为 学习率(Learning Rate)。
notion image

反向传播

对于深层网络,很难直接得到梯度的显式表达式,因此通常使用链式法则逐层计算导数,并利用得到的梯度更新权重,这就是所谓的反向传播。
这里你可能会有一个疑惑:神经网络里到处都是权重矩阵,那么“矩阵的导数”到底怎么求?看起来我们似乎没有专门学过矩阵求导。实际上,可以先把矩阵运算拆回普通的分量求和形式,先在分量上求导,再把结果重新合并成矩阵形式。
考虑一个最简单的线性变换:
其中 是矩阵, 和 是向量。把它按行展开,第 个输出分量是:
这个式子就不神秘了,它只是普通的求和。于是对输入分量 求导,有:
也就是说,第 个输出对第 个输入的导数,正好就是矩阵 中对应位置的元素。把所有 的结果合并起来,就得到:
如果我们从反向传播的角度看,假设上一层传回来的梯度是 ,那么根据链式法则:
这个转置来自分量求和时指标的重新排列,本质上仍然是普通链式法则。
同样,如果要求损失函数对权重矩阵 的导数,由
可得:
因此权重的梯度可以写成一个外积形式:
所以,矩阵导数并不是一种完全陌生的新规则。它的本质仍然是把每个元素拆开,用普通导数和链式法则计算;只是由于线性代数有非常好的结构,这些大量的分量计算最终可以合并成简洁的矩阵形式。这也是为什么深度学习里的反向传播可以写得很紧凑。
在实际工程中,现代深度学习框架(例如 PyTorch)已经提供了自动微分机制。我们只需要写出前向计算过程,框架就会自动记录计算图,并在调用反向传播时计算每个参数的梯度。因此大多数时候不需要手动推导和实现这些矩阵梯度;理解它们的意义,主要是为了知道反向传播背后发生了什么。
notion image

第 2 节 激活函数

分段线性函数

ReLU 是一种典型的分段线性函数:
然而,不仅 本身是分段线性函数,由线性层和 ReLU 激活函数构成的网络同样也是分段线性函数。
对于单层网络:
对于 ,ReLU 处于开启状态, 是一个线性函数;对于 ,ReLU 处于关闭状态,。
对于多层网络,一个固定点 有固定的开关模式,因此可以移除那些“死亡”的神经元:
notion image
移除“死亡”神经元之后,网络仍然是一个全连接网络。位于 所在区域内的点具有相同的激活模式,因此服从同一个线性函数。所以在整个空间上,神经网络是一个分段线性函数。

超平面与模式

在理解这里之前,先回忆一下几何中的“分割边界”。在二维平面中,一个一次方程对应一条直线,它可以把平面分成两侧;在三维空间中,一个一次方程对应一个平面,它可以把空间分成两部分。推广到更高维时,这种由线性方程定义、能够把空间分割开的对象就称为超平面(hyperplane)。
ReLU 函数在零点处具有特殊性:
这是高维空间中的一个超平面方程。这里的 是偏置项,它的几何作用是让超平面可以平移,而不是必须穿过原点。
为什么需要偏置?如果没有偏置,超平面方程就变成:
这意味着所有超平面都必须经过原点。二维中这就像所有直线都必须过原点;三维中则像所有平面都必须过原点。这样虽然也能切割空间,但切割方式会受到很强限制。
以二维为例,如果 3 条直线都必须经过原点,那么它们最多只能把平面分成 6 个区域;但如果直线不要求经过原点,并且处于一般位置,那么 3 条直线最多可以把平面分成 7 个区域。差别看起来只多了 1 个,但随着直线数量和维度增加,这种限制会越来越明显。
因此,偏置项 的作用不是一个可有可无的小修正。它让神经元对应的分割边界可以自由移动,从而让网络能够更灵活地划分特征空间。
在 的特征空间中,如果 有 m 个神经元,就对应 m 个超平面,从而把空间划分为多个线性区域。
现在考虑原始数据空间中处于不同模式的两个点 ,并且 足够接近,使得它们只在第 层有不同的 ReLU 激活。因此这两个点在第 层之前的行为相同,可以等价为同一个线性变换,记作 和 。于是第 层中的一个神经元 在原始数据空间中对应:
因此,神经网络可以理解为多个超平面,这些超平面把整个数据空间划分成大量多面体。模式数量为:
这就是深度神经网络具有强大近似能力的原因。

Dying ReLU

传统 ReLU 有一个严重问题,称为 “Dying ReLU”。
对于一个样本和一个神经元,如果该神经元在激活前的输出为负,就意味着这个神经元在本次反向传播中不会被更新。
如果认为该层之前的神经元在这次迭代中几乎不变,或者更新幅度很小,那么这个神经元就没有机会更新自身,这种现象称为 “Dying ReLU”。
解决这个问题的一种方法是使用 “Leaky ReLU”:
notion image
它仍然是分段线性函数。并且当 时,,从而可以让神经元继续更新。

GELU

ReLU 的另一个问题是零点奇异性,这会导致超平面边界上的点出现特殊行为。
为了解决这个问题,可以使用 GELU,即 Gaussian Error Linear Unit:
它与 ReLU 很接近,但二者的区别在于 GELU 是连续的:
notion image
此外,当 时,,因此 也能缓解 Dying ReLU 问题。

其他激活函数:sigmoid 与 tanh

在 ReLU 流行之前,神经网络中也经常使用 sigmoid 和 tanh。sigmoid 的形式是:
它的图像是:
notion image
它会把输入压到 之间。tanh 的形式是:
图像是:
notion image
它会把输入压到 之间。
传统观点认为,sigmoid 和 tanh 的主要问题是两侧会饱和。也就是说,当 很大或很小时,函数值会接近一个常数,导数接近 0。这样反向传播时梯度会变得很小,深层网络中容易出现梯度消失,前面层的参数很难有效更新。
但除了梯度饱和以外,还有一个更结构性的差异:sigmoid 和 tanh 是平滑的非线性函数,而 ReLU 是分段线性的。分段线性的好处是,在数据空间的某个小区域内,只要激活模式不变,网络整体就等价于同一个线性变换。换句话说,网络不是在每一个点附近都任意弯曲,而是在一个局部区域内保持简单的线性结构。
这种局部线性假设是合理的。很多真实数据在小邻域内变化比较平滑:例如一张图片稍微改变一点亮度,类别通常不会突然变化;一个输入特征轻微扰动,输出也往往应该连续变化。因此,在局部区域内使用同一个线性变换,既能表达稳定规律,又不会让模型在每个样本点附近都产生过于复杂的弯曲。
从防止过拟合的角度看,分段线性函数也提供了一种有用的归纳偏置。网络可以用很多线性区域拼接出复杂函数,但每个小区域内部仍然是简单的线性模型。这比完全依赖平滑非线性在所有位置连续弯曲更容易控制模型行为。直观地说,ReLU 网络把复杂性放在“如何划分区域”上,而不是让函数在每个点都自由弯曲。
因此,sigmoid 和 tanh 的失败不仅是因为两侧梯度接近 0,也因为它们没有提供 ReLU 这种清晰的分段线性结构。现代网络中常用 ReLU、Leaky ReLU、GELU 等激活函数,本质上都是在梯度传播、表达能力和局部线性归纳偏置之间做折中。
所以在现代深度网络中,tanh 和 sigmoid 越来越少作为隐藏层的主要激活函数,而更多作为输出函数使用,用来限制输出值的范围。例如 sigmoid 可以把输出限制在 ,因此常用于二分类概率;tanh 可以把输出限制在 ,因此常用于需要有界连续输出的场景。
不过这并不意味着 ReLU 或 GELU 在任何情况下都绝对优于 tanh 和 sigmoid。根据 No Free Lunch 定理,不存在一个算法或结构能够在所有任务、所有数据分布上都最优。激活函数的选择也一样,需要结合模型结构和任务需求。例如在 RNN 中,隐藏状态会沿时间反复递推,tanh 的有界输出有助于控制状态范围,因此仍然是合理的选择。

第 3 节 学习分布

Gibbs 熵与 Shannon 熵

在统计物理中,熵首先可以理解为系统“不确定性”或“可实现方式数量”的度量。一个宏观状态可能对应很多微观状态:例如只知道一盒气体的温度、体积和压强,并不知道每个分子的具体位置和速度;所有这些可能的分子排列与运动方式,就是这个宏观状态背后的微观状态。
如果一个宏观状态对应的微观状态数记为 ,那么熵希望满足一个很自然的性质:独立系统合并时,熵应该相加。假设系统 A 有 种微观状态,系统 B 有 种微观状态,二者独立时,总系统的微观状态数是乘法:
但我们希望熵满足加法:
因此需要一个函数把“状态数的乘法”转化为“熵的加法”。对数正好满足:
这就是为什么熵的形式中自然出现对数。于是得到 Boltzmann 熵:
其中 是 Boltzmann 常数, 是微观状态数。
举例来说,如果一个粒子只能处在 2 个格点之一,那么微观状态数是 2;如果有 3 个可区分粒子,每个粒子都有 2 种选择,那么微观状态数是 。这说明微观状态数增长得非常快,而对数可以把这种指数级增长压缩成更可比较的量。
接下来考虑全同粒子模型。所谓全同粒子,是指粒子之间不可区分:交换两个粒子的标签不会产生新的物理状态。假设一共有 个全同粒子,它们可以分布在若干个状态中,第 个状态里有 个粒子,并且 。那么对应的微观状态数是:
直观地说, 表示把 个粒子排进所有位置的方式数;但由于同一个状态里的 个粒子不可区分,内部交换不产生新的微观状态,所以要除以每个 。
为了把这个式子化成概率形式,需要用 Stirling 公式。对于很大的 ,有近似:
它的含义是:阶乘增长极快,但在对数尺度下可以用一个简单的表达式近似。将它代入微观状态数:
代入 ,也就是第 个状态中粒子的比例,得到:
因此单个粒子的平均熵可以写为:
去掉物理常数 ,就得到 Shannon 熵的形式:
这个式子可以理解为“平均惊讶程度”。如果某个事件概率很小,它发生时带来的信息量 很大;如果某个事件几乎必然发生,它的信息量就很小。Shannon 熵就是用概率 对这些信息量做加权平均。
热力学熵和 Shannon 熵形式相似,但语境不同。热力学熵描述物理系统的宏观不可逆性、能量分布和微观状态数,通常带有 Boltzmann 常数和物理单位;Shannon 熵描述概率分布中的不确定性或信息量,通常没有物理单位。二者的共同点是都在度量“一个宏观描述背后有多少可能性”。
这里的推导不需要过分掌握。更重要的是理解三件事:第一,熵用对数是为了把独立系统的状态数乘法变成熵的加法;第二,微观状态数越多,宏观描述越不确定,熵越大;第三,Shannon 熵可以看作热力学熵思想在概率分布上的抽象形式。

交叉熵

如果用另一个分布 来代替以估计:
则得到交叉熵的定义:
你可能想为什么P(x)不用替代,因为利用大数定理可以直接估计。
又因为 ,使用拉格朗日乘子法:
这里的拉格朗日乘子法和后面的变分,只是为了在“ 必须仍然是一个概率分布”这个约束下,说明交叉熵什么时候取到最小值。直观上,它们的作用是:一边改变 的形状,一边保证总概率仍然等于 1。这里不需要过分掌握这些数学工具,把它们看成增强直觉和信心的推导即可。
考虑 的变分:
于是得到:
因此交叉熵在 时取得最小值,此时它就是 Shannon 熵:
这个不等式的意义是:如果真实分布是 ,那么用真实分布本身来描述数据时,平均不确定性最低,也就是 Shannon 熵 ;如果改用另一个分布 去描述或编码这些来自 的数据,平均代价只会变大,不会更小。因此交叉熵可以理解为“用模型分布 去解释真实分布 时需要付出的平均代价”。当 时,这个代价达到最低。

KL 散度

定义 KL 散度为:
KL 散度衡量从 变为 所带来的熵增。此外,我们通常用 来衡量 之间的差异。
更准确地说,KL 散度衡量的是:当真实数据服从 ,但我们却用另一个分布 去描述、编码或预测这些数据时,相比直接使用真实分布 ,平均会多付出多少代价。因为 Shannon 熵 是使用真实分布时的最低平均代价,而交叉熵 是使用 描述来自 的数据时的平均代价,所以二者的差值就是额外代价:
如果 和 完全一致,那么使用 不会带来额外代价,KL 散度为 0;如果 在某些 认为很可能发生的地方给出了很小的概率,那么 会变大,交叉熵会升高,KL 散度也会变大。因此,KL 散度可以反映模型分布 与真实分布 的不匹配程度。
它之所以能作为“差异”的度量,还有一个关键性质:
并且只有当 时才取到 0。这说明 KL 散度不会给出负的差异;两个分布越一致,额外代价越接近 0。
不过需要注意,KL 散度不是严格意义上的距离,因为它通常不对称:
这是因为“用 解释来自 的数据”和“用 解释来自 的数据”是两个不同问题。深度学习中通常关心前者:真实数据来自 ,模型给出 ,训练的目标就是让 尽可能接近 ,从而减少这个额外代价。
到这里需要解释一个容易混淆的点:前面讲神经网络时,我们一直把它写成一个函数 ,好像输入 之后网络直接输出一个确定的 。例如回归问题中写作 ,分类问题中也常说“网络输出类别”。这种说法在工程上很方便,但从概率建模的角度看,它其实省略了“不确定性”。
如果强行把神经网络看成一个确定函数,那么等价于假设:给定 之后, 只能等于 ,其他所有取值概率都是 0。用概率分布写出来,就是一个 delta 分布:
这可以理解为“点分布近似”:模型把所有概率质量都压在一个点上,认为自己对输出完全确定。
但真实预测通常不是这样的。给定同一个输入 ,输出 可能仍然有噪声、不完整信息或多种合理答案。例如图像分类中,一张模糊图片可能 60% 像猫、35% 像狗、5% 是其他类别;回归问题中,同样的条件下也可能存在测量误差或自然波动。也就是说,模型不应该只给出一个点,而应该表达“我有多大把握”。
因此更恰当的观点是:神经网络并不是直接学习一个绝对确定的函数关系,而是在学习一个条件分布 。对于分类任务,softmax 输出的每一维就可以看成某个类别的概率;对于二分类任务,sigmoid 输出的是 ;对于回归任务,如果假设
那么网络输出的 是分布的均值,而不是全部分布本身。
从这个角度看,之前写的 只是分布参数的一部分,或者是某种点估计。真正与真实数据分布 对齐的对象,是模型分布 。KL 散度衡量的正是 和真实条件分布 之间的差异。
如果仍然坚持使用 delta 分布 ,那么只要真实分布 在 之外还有概率质量,KL 散度就可能发散。这个结果提醒我们:不能轻易声称神经网络学到了一个完全确定的函数关系。更稳妥的说法是,我们先假设一种输出分布形式,再让神经网络学习这个分布的参数。
因此如果从频率学派视角来看,存在一个真实分布 ,以及一个用来近似该分布的神经网络 ,我们可以用 KL 散度来衡量二者之间的差异:
所以:
因此,KL 散度其实就是我们真正想要最小化的目标:让神经网络给出的输出分布 尽可能接近真实条件分布 。后面所谓的损失函数,本质上就是把这个 KL 散度中与模型参数有关的部分拿出来优化。

损失函数

考虑 可以写成:
由于是监督学习任务,我们关心:
第二项是常数,因此我们的损失函数为:
这里需要用到一个直观版本的大数定律。真实的数据分布 通常是未知的,因此我们无法直接计算对整个分布的期望。但如果从这个分布中采样到足够多训练样本,那么这些样本上的平均值会逐渐接近真实期望。也就是说,可以用训练集上的经验平均来近似分布上的期望。
因此,根据大数定律:
接下来要选择 的具体形式。这个选择不是纯数学技巧,而是在表达我们对数据生成方式的假设:给定输入 之后,真实标签 会围绕网络预测值怎样波动?不同分布对应不同的误差结构,也会自然导出不同的损失函数。
首先对于回归任务,标签往往是完全确定的(也有不确定的情况),这意味着:
那么为:
  • 高斯分布
高斯分布表示我们认为误差 大多集中在 0 附近,小误差很常见,大误差会快速变得不太可能;并且正负方向的误差是对称的。这等价于假设数据里主要存在平滑、均匀的随机噪声。
得到
如果认为 是常数,最终得到:
  • Laplace 分布
Laplace 分布同样认为误差应当集中在 0 附近,但它比高斯分布更允许较大的偏差出现。直观上,它对应一种“多数样本误差较小,但偶尔会有明显偏离”的数据假设,因此对异常值通常比 MSE 更不敏感。
得到:
如果认为 是常数,最终得到:
在多分类问题中,标签通常写成 one-hot 向量。one-hot 向量就是只有一个位置为 1、其他位置都为 0 的向量,用来表示样本属于哪一个类别。例如有三个类别:猫、狗、鸟,如果某个样本真实类别是狗,那么它的标签可以写成:
这里第 2 个位置为 1,表示真实类别是第 2 类;其他位置为 0,表示它不属于那些类别。这样的标签也是确定的(也可以考虑为非确定的):
  • Boltzmann 分布
Boltzmann 分布常用于分类或能量模型的视角。它表示我们不是直接预测一个数值误差,而是给每个可能的输出状态分配一个能量:正确或更合理的状态应该有更低能量,因此概率更高;不合理的状态能量更高,因此概率更低。
因此需要把所有可能输出状态的权重加起来:
其中 称为配分函数(partition function),它的作用是做概率归一化。因为 只是一个非负的“权重”:能量越低,权重越大;能量越高,权重越小。但只有权重还不是概率,因为所有可能状态的概率总和必须等于 1。
再用每个状态自己的权重除以总权重,得到真正的概率:
这样就能保证:
直观上, 就是把一组“相对倾向”转换成合法概率分布的归一化因子。也正因为 依赖所有可能状态,它会在损失函数中形成一个负相:模型不仅要降低正确答案的能量,还要处理其他所有状态的总权重。
因此:
对于多分类问题,我们通常不直接使用大数定律,因为标签通常是 one-hot 向量,因此:
这里 是正相,用来降低正确样本的能量; 是负相,用来提高所有可能状态的期望能量。
可以证明所有 都是等价处理的,因此通常取 。并且我们通常把 作为网络的输出。
对于二分类问题,可以得到:
并且:
这就是我们所说的 sigmoid 函数:
notion image
最后总结一下:损失函数并不是凭空选择的,它和我们对数据的先验假设(Prior)是一一对应的。假设误差服从高斯分布,就会自然得到 MSE;假设误差服从 Laplace 分布,就会自然得到 L1 损失;假设输出类别服从 Boltzmann/能量分布,就会自然得到交叉熵或二分类交叉熵。也就是说,选择损失函数,本质上是在选择我们认为数据是如何围绕真实值或类别分布产生的。
因此,在建模时不应该只问“哪个 loss 常用”,还应该问“这个 loss 背后假设了怎样的数据分布”。当这个先验假设和数据本身更匹配时,训练目标才更合理,模型学到的分布 也更可能接近真实分布 。

Boltzmann 分布 和 Softmax

有了 Gibbs 熵之后,可以直接推出 Boltzmann 分布。直观上,问题是:如果我们只知道系统的平均能量,那么在所有满足这个条件的概率分布中,哪一个分布最“自然”?答案是选择熵最大的分布,因为它引入的额外假设最少。
因此考虑最大化 Gibbs 熵:
约束条件是概率归一化和平均能量固定:
使用拉格朗日乘子法,构造:
对每个 求导并令其为 0:
于是:
两边取指数,得到:
其中 是归一化常数。把常数重新吸收到参数里,记 ,并由 得到:
这就是 Boltzmann 分布,其中 是配分函数。物理中通常进一步写成 ,于是:
这个推导的关键点是:Boltzmann 分布不是凭空假设出来的,而是在“概率总和为 1、平均能量固定”这两个约束下,使 Gibbs 熵最大的分布。换句话说,它是在已知信息有限时,对系统状态最无偏的概率描述。
这也解释了为什么后面可以把分类问题写成能量模型:如果给每个候选类别或状态分配一个能量 ,那么在最大熵思想下,更低能量的状态自然获得更高概率:
其中:
因此,softmax 和交叉熵可以理解为 Boltzmann 分布在分类模型中的具体形式。

第 4 节 深度学习之前

支持向量机

二次规划问题

SVM 将学习任务考虑为找到一个超平面,使得两类数据点距离这个超平面的最小距离(即间隔)最大。
首先一个数据点到超平面的有向距离为:
考虑对于分类正确的样本,标签和有向距离的乘积应该大于 0。首先考虑简单情况,即硬间隔 SVM。我们假设已经满足 ,我们的目的是最大化它,因此考虑:
并且我们考虑最大化那个最小距离,即:
现在,请考虑缩放不变性,即 同时缩放 倍不改变函数。因此我们可以固定分子,将优化集中在分母。这意味着,我们希望 ,这个点就是间隔边界上的点,意味着所有的 都有 。而最大化整体意味着最小化分母,因此优化问题表述为:
这里的 是为了让求导后的形式更美观。这就是经典的硬间隔 SVM 的原始优化问题,它是一个带有线性不等式约束的凸二次规划问题。这个问题直接求解很复杂,因为约束是 个复杂的不等式。

拉格朗日对偶与支持向量

现在我们要将这个问题转化为一个对偶问题。首先将其拉格朗日化为:
这里要求 ,由此原问题等价为:
并且考虑它的对偶问题:
考虑内部的最小化问题,拉格朗日函数对 求导有:
从而对偶问题化为:
因此这个问题就简化了,约束变成了 个简单不等式和一个仿射等式。它的解必须满足 KKT 条件,其中一个条件是:
意味着对于 ,这些点没有贡献;而对于 ,这些点必须满足:
意味着这些点必须在间隔边界上,我们称这些点为支持向量,并且最终的决策只依赖支持向量:
其中只有支持向量参与求和。这个特性让支持向量机拥有非常大的稀疏性和鲁棒性。一个只使用少量支持向量的模型,就更倾向于把握规律而不是记忆,从而提升泛化能力。支持向量是类别判别的边界,它意味着模型通过记忆这些易错点来进行普遍性判断。

合页损失

我们要知道,事情的一开始,我们并没有找到一个超平面满足 ,而是有许多点的 。我们需要构造一个问题,把对偶问题之前的阶段写出来,这就是合页损失:
显然如果满足 ,那么合页损失退化为硬间隔 SVM。不满足 时,有一个惩罚项。我们的任务是:
由此我们引入软间隔的支持向量机。

软间隔的支持向量机

允许一些数据在硬间隔外甚至分类错误。也就是说,我们考虑取评估分类是否正确的项:
显然, 就是硬间隔满足点, 分类正确, 分类错误。我们考虑固定这个值 ,反而约束点:
称 为松弛距离,于是软间隔的优化问题为:
同样利用拉格朗日函数转化为对偶问题有:

核技巧

我们注意到对偶问题中,数据点只以 即内积的形式呈现。我们在考虑这样一件事情:在这个空间线性不可分的点,是否在其他空间就线性可分?这就是说我们考虑这样的映射:
而且在很多问题中,,这样的升维运算成本非常昂贵。这样内积就开始发挥作用了。对于两个数据点,考虑内积 ,核技巧的思路是,是否可以直接把内积映射到高维空间,即:
这里的 就是核函数, 是高维(甚至无限维)的特征空间。这样我们根本不用关心 的形式,直接利用核函数完成映射。这样对偶问题和决策函数为:
这样只需要在低维进行某些计算,就可以直接利用核函数映射到高维特征空间。有效的核函数一定对应着高维空间的内积,这是由 RKHS 和 Mercer 定理保证的。
将一个在原本的特征空间不可分的点通过非线性核函数映射到另一个线性空间,从而导致可分,这其实是一种隐式特征工程。它通过将每个数据点的可分性特征在高维空间放大来导致更大的区分。你可以想到,逻辑上应该可以找到一种处理导致训练集上必然可分,可以严格证明一个 Gram 矩阵正定的核有严格的可分超平面解。
但是这样做的结果是分类标准过于精细和复杂,模型极容易过拟合。
核函数的概念封装了输出层以前进行的特征工程,这让我们自然想到,是否可以将神经网络的隐层封装为一个核函数呢?
Chapter 2 正则化与优化 C++ OOP
Loading...