0. 前言
这一章开始学习真正的深度网络。
最简单的深度网络称为多层感知机。多层感知机由多层神经元组成, 每一层与它的上一层相连,从中接收输入; 同时每一层也与它的下一层相连,影响当前层的神经元。
这一章从基本的概念介绍开始讲起,包括过拟合、欠拟合和模型选择。 为了解决这些问题,本章将介绍权重衰减和暂退法等正则化技术,以及将讨论数值稳定性和参数初始化相关的问题。最后应用一个真实的案例:房价预测。
对应实践:https://github.com/silenceZheng66/deep_learning/blob/master/d2l/0x04.ipynb
0.1. 结论
- 多层感知机通过激活函数+隐藏层摆脱线性模型的限制。
- 欠拟合是指模型无法继续减少训练误差。过拟合是指训练误差远小于验证误差。
- 由于不能基于训练误差来估计泛化误差,因此简单地最小化训练误差并不一定意味着泛化误差的减小。机器学习模型需要注意防止过拟合,即防止泛化误差过大。
- 验证集可以用于模型选择,但不能过于随意地使用它。
- 应该选择一个复杂度适当的模型,避免使用数量不足的训练样本。简单模型导致欠拟合,复杂模型导致过拟合。
- 正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。
- 保持模型简单的一个特别的选择是使用$L_2$惩罚的权重衰减。这会导致学习算法在更新步骤中递减权重。权重衰减功能在深度学习框架的优化器中提供。
- 在同一训练代码实现中,不同的参数集可以有不同的更新行为。
- 暂退法在前向传播过程中,计算每一内部层的同时丢弃一些神经元。
- 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。
- 暂退法将活性值$h$替换为具有期望值$h$的随机变量。
- 暂退法仅在训练期间使用。
- 前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。
- 反向传播按相反的顺序(从输出层到输入层)计算和存储神经网络的中间变量和参数的梯度。
- 在训练深度学习模型时,前向传播和反向传播是相互依赖的。
- 训练比预测需要更多的内存。
- 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。
- 需要用启发式的初始化方法来确保初始梯度既不太大也不太小
- ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。
- 随机初始化是保证在进行优化前打破对称性的关键。
- Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。
- 在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。
- 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
- 在相应的假设条件下,可以在测试时检测并纠正协变量偏移和标签偏移。在测试时,不考虑这种偏移可能会成为问题。
1. 多层感知机
开始对深度神经网络的探索!
1.1. 隐藏层
在线性神经网络章节描述了仿射变换, 它是一种带有偏置项的线性变换。
softmax回归模型通过单个仿射变换将输入直接映射到输出,然后进行softmax操作。
如果我们的标签通过仿射变换后确实与我们的输入数据相关,那么这种方法确实足够了。 但是,仿射变换中的线性是一个很强的假设。
1.1.1. 线性模型可能会出错
线性意味着单调假设: 任何特征的增大都会导致模型输出的增大(如果对应的权重为正), 或者导致模型输出的减小(如果对应的权重为负)。
有时这是有道理的。 例如,如果我们试图预测一个人是否会偿还贷款。 我们可以认为,在其他条件不变的情况下, 收入较高的申请人比收入较低的申请人更有可能偿还贷款。
但是,虽然收入与还款概率存在单调性,但它们不是线性相关的。 收入从0增加到5万,可能比从100万增加到105万带来更大的还款可能性。 处理这一问题的一种方法是对我们的数据进行预处理, 使线性变得更合理,如使用收入的对数作为我们的特征。
然而我们可以很容易找出违反单调性的例子。 例如,我们想要根据体温预测死亡率。 对于体温高于37摄氏度的人来说,温度越高风险越大。 然而,对于体温低于37摄氏度的人来说,温度越高风险就越低。 在这种情况下,我们也可以通过一些巧妙的预处理来解决问题。 例如,我们可以使用与37摄氏度的距离作为特征。
但如果是对于图像分类问题,单个像素的强度大小对预测整张图片为某个类别的作用并非简单的线性关系。任何像素的重要性都以复杂的方式取决于该像素的上下文(周围像素的值)。
然而数据可能会有一种考虑到特征之间的相关交互作用的表示,在这个表示的基础上可以使用线性模型。对于深度神经网络,我们使用观测数据来联合学习隐藏层表示和应用于该表示的线性预测器。
1.1.2. 在网络中加入隐藏层
隐藏层也称隐含层。
可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。
我们可以把前L-1层看作表示,把最后一层(输出)看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。 下面,我们以图的方式描述了多层感知机(单隐藏层的多层感知机)。
这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。 输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此,这个多层感知机中的层数为2。 注意,这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元, 而隐藏层中的每个神经元又会影响输出层中的每个神经元。
但全连接层的多层感知机的参数开销可能很高,在不改变输入或输出大小的情况下,需要在参数节约和模型有效性之间进行权衡。
1.1.3. 从线性到非线性,激活函数!
我们通过矩阵 $\mathbf{X} \in \mathbb{R}^{n \times d}$ 来表示 $n$ 个样本的小批量,其中每个样本具有$d$个输入特征。对于具有$h$个隐藏单元的单隐藏层多层感知机, 用 $\mathbf{H} \in \mathbb{R}^{n \times h}$ 表示隐藏层的输出,称为隐藏表示(hidden representations)。 在数学或代码中,$\mathbf{H}$ 也被称为隐藏层变量(hidden-layer variable)或隐藏变量(hidden variable)。
因为隐藏层和输出层都是全连接的, 所以我们有隐藏层权重 $\mathbf{W}^{(1)} \in \mathbb{R}^{d \times h}$ 和隐藏层偏置 $\mathbf{b}^{(1)} \in \mathbb{R}^{1 \times h}$ 以及输出层权重 $\mathbf{W}^{(2)} \in \mathbb{R}^{h \times q}$ 和输出层偏置 $\mathbf{b}^{(2)} \in \mathbb{R}^{1 \times q}$。 形式上,我们按如下方式计算单隐藏层多层感知机的输出 $\mathbf{O} \in \mathbb{R}^{n \times q}$:
首先回顾一下什么是仿射函数:
仿射函数即由由1阶多项式构成的函数,一般形式为 f (x) = A x + b,这里,A 是一个 m×k 矩阵,x 是一个 k 向量,b是一个m向量,实际上反映了一种从 k 维到 m 维的空间映射关系。
添加隐藏层之后,模型现在需要跟踪和更新额外的参数(权重和偏移),但却仍然是线性模型!因为隐藏单元由输入的仿射函数给出,而输出(在softmax操作前)只是隐藏单元的仿射函数。仿射的仿射依然是仿射函数(线性模型可以表示任意一个仿射函数)。
下面证明这一等价性,即对于任意权重值,只需合并隐藏层,便可产生具有参数 $\mathbf{W} = \mathbf{W}^{(1)}\mathbf{W}^{(2)}$ 和 $\mathbf{b} = \mathbf{b}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)}$ 的等价单层模型(即同样是线性模型):
因此为了克服线性模型的限制,还需要一个额外的关键要素:在仿射变换之后对每个隐藏单元应用非线性的激活函数(activation function) $\sigma$。 激活函数的输出(例如,$\sigma(\cdot)$)被称为活性值(activations)。
有了激活函数,就不可能再将我们的多层感知机退化成线性模型,如下:
由于 $\mathbf{X}$ 中的每一行对应于小批量中的一个样本, 出于记号习惯的考量, 我们定义非线性函数 $\sigma$ 也以按行的方式作用于其输入, 即一次计算一个样本(与之前的softmax函数相同)。
这里我们应用于隐藏层的激活函数通常不仅按行操作,也按元素操作。 这意味着在计算每一层的线性部分之后,我们可以计算每个活性值,而不需要查看其他隐藏单元所取的值。
为了构建更通用的多层感知机, 我们可以继续堆叠这样的隐藏层, 例如$\mathbf{H}^{(1)} = \sigma_1(\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}$ 和 $\mathbf{H}^{(2)} = \sigma_2(\mathbf{H}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)})$, 一层叠一层,从而产生更有表达能力的模型。
1.1.4. 通用近似定理(Universal Approximation Theorem)
人工神经网络最有价值的地方可能就在于,它可以在理论上证明:“一个包含足够多隐含层神经元的多层前馈网络,能以任意精度逼近任意预定的连续函数”。这个定理即为通用近似定理,这里的“Universal”,也有人将其翻译成“万能的”,也有译为“万能逼近定理”。
也就是说,通用近似定理告诉我们,不管连续函数$f(x)$在形式上有多复杂,我们总能确保找到一个神经网络,对任何可能的输入$x$,以任意高的精度(通过增加隐含层神元的个数来提升近似的精度)近似输出$f(x)$(即使函数有多个输入和输出)。
多层感知机可以通过隐藏神经元,捕捉到输入之间复杂的相互作用, 这些神经元依赖于每个输入的值。 我们可以很容易地设计隐藏节点来执行任意计算。即使是网络只有一个隐藏层,给定足够的神经元和正确的权重, 我们可以对任意函数建模,尽管实际中学习该函数是很困难的。
虽然一个单隐层网络能学习任何函数, 但我们不应该尝试使用单隐藏层网络来解决所有问题,因为这种网络结构可能会格外庞大,进而无法正确地学习和泛化。通过使用更深(而不是更广)的网络,可以更容易地逼近许多函数。
参考:
通用近似定理(学习笔记)
1.2. 激活函数(activation function)
激活函数通过计算加权和并加上偏置来确定神经元是否应该被激活,它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。
1.2.1. ReLU函数
最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU),因为它实现简单,同时在各种预测任务中表现良好。
ReLU提供了一种非常简单的非线性变换。 给定元素$x$,ReLU函数被定义为该元素与0的最大值:
图像:
通俗地说,ReLU函数通过将相应的活性值设为0,仅保留正元素并丢弃所有负元素。ReLU激活函数是分段线性的。
ReLU导数图像:
当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。 注意,当输入值精确等于0时,ReLU函数不可导。此时默认使用左侧的导数,即当输入为0时导数为0。可以忽略这种情况,因为输入可能永远都不会是0。
“如果微妙的边界条件很重要,我们很可能是在研究数学而非工程”。
使用ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。 这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题(稍后详细介绍)。
ReLU函数有许多变体,包括参数化ReLU函数(pReLU)。该变体为ReLU添加了一个线性项,因此即使参数是负的,某些信息仍然可以通过:
1.2.2. sigmoid函数
对于一个定义域在$\mathbb{R}$中的输入, sigmoid函数将输入变换为区间(0, 1)上的输出。 因此,sigmoid通常称为挤压函数(squashing function): 它将范围(-inf, inf)中的任意输入压缩到区间(0, 1)中的某个值:
图像:
当输入接近0时,sigmoid函数接近线性变换。
在最早的神经网络中,科学家们专注于阈值单元。阈值单元在其输入低于某个阈值时取值0,当输入超过阈值时取值1。
当人们逐渐关注到到基于梯度的学习时, sigmoid函数是一个自然的选择,因为它是一个平滑的、可微的阈值单元近似。 当我们想要将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数 (可以将sigmoid视为softmax的特例)。
sigmoid函数的导数为下面的公式:
sigmoid导数图像:
当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0。
然而,sigmoid在隐藏层中已经较少使用,它在大部分时候被更简单、更容易训练的ReLU所取代。 在后面关于循环神经网络的章节中将描述利用sigmoid单元来控制时序信息流的架构。
1.2.3. tanh函数
tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上。 tanh函数的公式如下:
图像:
当输入在0附近时,tanh函数接近线性变换。 函数的形状类似于sigmoid函数,不同的是tanh函数关于坐标系原点中心对称。
tanh函数的导数是:
tanh导数图像:
当输入接近0时,tanh函数的导数接近最大值1。与sigmoid函数导数图像中看到的类似,输入在任一方向上越远离0点,导数越接近0。
1.2.4. 关于激活函数的小结
这些知识只是掌握了一个类似于1990年左右深度学习从业者的工具。
使用深度学习框架只需几行代码就可以快速构建模型,而以前训练这些网络需要研究人员编写数千行的C或Fortran代码。
这些激活函数在框架中可以直接调用,如y = torch.relu(x)
。
1.3. 实现多层感知机
从零实现:
继续使用Fashion-MNIST图像分类数据集,并与之前softmax回归的结果进行比较。将每个图像视为具有784个输入特征(使用reshape将每个二维图像转换为一个长度为784的向量)和10个类的简单分类数据集,实现一个具有单隐藏层的多层感知机,包含256个隐藏单元。选择2的若干次幂作为层的宽度(隐含层单元的个数)是因为考虑到内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。
对于每一层都要记录一个权重矩阵和一个偏置向量,并为损失关于这些参数的梯度分配内存。
手动实现一个简单的多层感知机是很容易的。然而如果有大量的层,从零开始实现多层感知机会变得很麻烦(例如,要命名和记录大量参数)。
框架实现:
使用高级API更简洁地实现多层感知机。
对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层。
2. 模型选择、欠拟合和过拟合
机器学习问题中,我们的目标是发现模式(pattern),确定模型真正发现了一种可泛化的模式而不是简单的记住了所有数据。
我们的目标是发现某些模式, 这些模式捕捉到了我们训练集潜在总体的规律。 如果成功做到了这点,即使是对以前从未遇到过的个体, 模型也可以成功地评估风险。 如何发现可以泛化的模式是机器学习的根本问题。
困难在于,在训练模型时,我们只能访问数据中的小部分样本。 最大的公开图像数据集包含大约一百万张图像。 而在大部分时候,我们只能从数千或数万个数据样本中学习。 在大型医院系统中,我们可能会访问数十万份医疗记录。 当我们使用有限的样本时,可能会遇到这样的问题: 当收集到更多的数据时,会发现之前找到的明显关系并不成立。
模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合(overfitting), 用于对抗过拟合的技术称为正则化(regularization)。
比如在使用Fashion-MNIST数据集时如果有足够多的神经元、层数和训练迭代周期, 模型最终可以在训练集上达到完美的精度,但此时在测试集上的准确性却下降了。
2.1. 训练误差和泛化误差
误差越小,模型越有效。
训练误差(training error)是指, 模型在训练数据集上计算得到的误差。
泛化误差(generalization error)是指, 模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。
泛化误差永远不能被准确地计算出。 这是因为无限多的数据样本是一个虚构的对象。 实际中只能通过将模型应用于一个独立的测试集来估计泛化误差, 该测试集由随机选取的、未曾在训练集中出现的数据样本构成。
对于之前提到的记住所有数据的模式举一个例子,应用查表法来进行预测,对于$28\times28$的灰度图像,如果每个像素可以取$256$个灰度值中的一个, 则有$256^{784}$个可能的图像。 这意味着指甲大小的低分辨率灰度图像的数量比宇宙中的原子要多得多。 即使我们可能遇到这样的数据,我们也不可能存储整个查找表。
2.1.1. 独立同分布假设
监督学习情景中, 通常会假设训练数据和测试数据都是从相同的分布中独立提取的(独立同分布)。 这意味着对数据进行采样的过程没有进行“记忆”。 换句话说,抽取的第2个样本和第3个样本的相关性, 并不比抽取的第2个样本和第200万个样本的相关性更强。
但这个假设很多时候是有漏洞的,例如一个模型应用在多个数据集时,不同数据集的分布可能都是不同的。其次,抽样过程可能与时间有关,从而违反独立性。有时轻微违法独立同分布假设时模型依然可以运行良好,但另一些时候在违背独立同分布的数据上应用模型会导致错误。
当训练模型时,我们试图找到一个能够尽可能拟合训练数据的函数。 但是如果它执行地“太好了”,而不能对看不见的数据做到很好泛化,就会导致过拟合。 这种情况正是我们想要避免或控制的。 深度学习中有许多启发式的技术旨在防止过拟合。
2.1.2. 模型复杂性
模型复杂性由什么构成是一个复杂的问题。 一个模型是否能很好地泛化取决于很多因素。 例如,具有更多参数的模型可能被认为更复杂, 参数有更大取值范围的模型可能更为复杂。 通常对于神经网络,我们认为需要更多训练迭代的模型比较复杂, 而需要“早停”(early stopping)的模型(即较少训练迭代周期)就不那么复杂。
很难比较本质上不同大类的模型之间(例如,决策树与神经网络)的复杂性。统计学家认为,能够轻松解释任意事实的模型是复杂的, 而表达能力有限但仍能很好地解释数据的模型可能更有现实用途。
几个影响模型泛化的因素:
- 可调整参数的数量。当可调整参数的数量(有时称为自由度)很大时,模型往往更容易过拟合。
- 参数采用的值。当权重的取值范围较大时,模型可能更容易过拟合。
- 训练样本的数量。即使你的模型很简单,也很容易过拟合只包含一两个样本的训练集。而过拟合一个有数百万个样本的数据集则需要一个极其灵活的模型。
2.2. 模型选择
在机器学习中,我们通常在评估几个候选模型后选择最终的模型。 这个过程叫做模型选择。
有时进行比较的模型在本质上是完全不同的(比如,决策树与线性模型)。 又有时我们需要比较不同的超参数设置下的同一类模型。
例如,训练多层感知机模型时,我们可能希望比较具有不同数量的隐藏层、不同数量的隐藏单元以及不同的的激活函数组合的模型。 为了确定候选模型中的最佳模型,我们通常会使用验证集。
2.2.1. 验证集
原则上,在确定所有的超参数之前,我们不希望用到测试集。 如果在模型选择过程中使用测试数据,可能会有过拟合测试数据的风险。过拟合了训练数据,还可以在测试数据上的评估来判断过拟合。 但我们无法知晓模型是否过拟合了测试数据。
因此决不能依靠测试数据进行模型选择,但也不能仅仅依靠训练数据来选择模型,因为我们无法估计训练数据的泛化误差。
同时虽然理想情况下我们只会使用测试数据一次,以评估最好的模型或比较一些模型效果,但现实是测试数据很少在使用一次后被丢弃。我们很少能有充足的数据来对每一轮实验采用全新测试集。
解决此问题的常见做法是将数据分成三份, 除了训练和测试数据集之外,还增加一个验证数据集(validation dataset), 也叫验证集(validation set)。
但现实是验证数据和测试数据之间的边界也十分模糊。d2l书中每次实验都在使用训练集和验证集,而没有真正的测试集,实验报告的准确度都是验证集准确度。
2.2.2. $K$折交叉验证
当训练数据稀缺时,可能无法提供足够的数据来构成一个合适的验证集。 一个解决方案是采用$K$折交叉验证。
原始训练数据被分成$K$个不重叠的子集。 然后执行$K$次模型训练和验证,每次在$K-1$个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。 最后,通过对$K$次实验的结果取平均来估计训练和验证误差。
2.3. 欠拟合,过拟合
比较训练和验证误差时要注意两种常见的情况: 欠拟合,过拟合。
欠拟合:训练误差和验证误差都很严重,但它们之间仅有一点差距。如果模型不能降低训练误差,这可能意味着模型过于简单(即表达能力不足),无法捕获试图学习的模式。 又由于训练和验证误差之间的泛化误差很小, 我们有理由相信可以用一个更复杂的模型降低训练误差。 这种现象被称为欠拟合(underfitting)。
过拟合:当我们的训练误差明显低于验证误差时要小心, 这表明严重的过拟合(overfitting)。过拟合并不总是一件坏事,特别是在深度学习领域,最好的预测模型在训练数据上的表现往往比在保留(验证)数据上好得多。最终通常更关心验证误差,而不是训练误差和验证误差之间的差距。
是否过拟合或欠拟合可能取决于模型复杂性和可用训练数据集的大小。
2.3.1. 模型复杂性
关于过拟合和模型复杂性的经典直觉:给定由单个特征$x$和对应实数标签$y$组成的训练数据, 我们试图找到下面的$d$阶多项式来估计标签$y$。
这只是一个线性回归问题,特征是$x$的幂给出的, 模型的权重是$w_i$给出的,偏置是$w_0$给出的 (因为对于所有的$x$都有$x^0$ = 1)。线性回归问题可以使用平方误差作为损失函数。
高阶多项式函数比低阶多项式函数复杂得多。高阶多项式的参数较多,模型函数的选择范围较广。 因此在固定训练数据集的情况下, 高阶多项式函数相对于低阶多项式的训练误差应该始终更低(最坏也是相等)。 其实当数据样本包含了$x$的不同值时, 函数阶数等于数据样本数量的多项式函数可以完美拟合训练集(因为y就是一个多项式,通过优化参数总可以表示出来y)。下图直观地描述了多项式的阶数和欠拟合与过拟合之间的关系。
2.3.2. 数据集大小
训练数据集中的样本越少,我们就越有可能(且更严重地)过拟合。 随着训练数据量的增加,泛化误差通常会减小。一般来说,更多的数据不会有什么坏处。
对于固定的任务和数据分布,模型复杂性和数据集大小之间通常存在关系。 给出更多的数据,我们可能会尝试拟合一个更复杂的模型。 能够拟合更复杂的模型可能是有益的。 如果没有足够的数据,简单的模型可能更有用。 对于许多任务,深度学习只有在有数千个训练样本时才优于线性模型。 从一定程度上来说,深度学习目前的生机要归功于廉价存储、互联设备以及数字化经济带来的海量数据集。
2.4. 多项式回归
通过多项式拟合来探索上述概念。 一样放到notebook中,话说如果都放到notebook中我为什么不把博客格式都做成notebook…
给定$x$,使用以下三阶多项式来生成训练和测试数据的标签:
噪声项$\epsilon$服从均值为0且标准差为0.1的正态分布。 在优化的过程中,我们通常希望避免非常大的梯度值或损失值,所以将特征从$x^i$调整为$\frac{x^i}{i!}$,这样可以避免很大的$i$带来的特别大的指数值。训练集和测试集各生成100个样本。
分别对3阶、2阶(线性函数)和高阶多项式训练并观察结果,可以看出3阶是正常的,线性函数会产生欠拟合问题,而高阶(20)则会产生过拟合问题。
结果说明2阶多项式模型过于简单。而在20阶多项式模型的实验中,实际上只有前5阶有非零的权值,其余阶均为0,这种情况下,高阶多项式模型的参数过多,但训练样本只有100个,数量较少,模型无法从中学习到高阶权值应为0的特点,即模型被数据中的噪声轻易的影响了。虽然高阶模型能够得到更小的训练误差,但在测试集上的表现会比在训练集上要差,故过拟合。
但对于这个实验,使用高阶多项式模型的损失仍然小于线性模型(在同样的迭代周期下)。
3. 权重衰减
正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。假设我们已经拥有尽可能多的高质量数据,我们便可以将重点放在正则化技术上。
在多项式回归的例子中, 我们可以通过调整拟合多项式的阶数来限制模型的容量。事实上这种限制特征的数量是缓解过拟合的一种常用技术,但这种直接丢弃特征的做法可能过于生硬。 多项式对多变量数据的自然扩展称为单项式(monomials),也就是多变量幂的乘积。单项式的阶数是幂的和。 例如,$x_1^2 x_2$和$x_3 x_5^2$都是3次单项式。
随着阶数$d$的增长,带有阶数$d$的项数迅速增加。 给定$k$个变量,阶数为$d$的项的个数为:(这个式子的含义就是从k-1+d个中取k-1个,即$C^{k-1}_{k-1+d}$)
例如对于3个变量(x1,x2,x3)的多项式,阶数为1的项有3个(x1,x2,x3),对应从3个(3-1+1)中选2个(3-1),也就是$C^2_3 = C^1_3 = 3$。具体计算方式如下(就是排列组合):
那么对于2阶项就对应从4个(3-1+2)中选2个,即$C^2_4 = 6种$,分别是:x1x2,x1x3,x2x3和三个变量单独的2次项。
因此即使是阶数上的微小变化,也会显著增加模型的复杂性。仅仅通过简单的限制特征数量(在多项式回归中体现为限制阶数)可能仍然使模型在过简单和过复杂中徘徊,我们需要一个更细粒度的工具来调整函数的复杂性,使其达到一个合适的平衡位置。
3.1. 范数与权重衰减
回顾范数的三个性质,以及$L_1$范数:向量元素的绝对值之和 和 $L_2$范数:向量元素平方和的平方根。
在训练参数化机器学习模型时, 权重衰减(weight decay)是最广泛使用的正则化的技术之一, 它通常也被称为$L_2$正则化。 这项技术通过函数与零的距离来衡量函数的复杂度, 因为在所有函数$f$中,函数$f = 0$(所有输入都得到值$0$) 在某种意义上是最简单的。 但是应该如何精确地测量一个函数和零之间的距离并没有标准答案。
一种简单的方法是通过线性函数 $f(\mathbf{x}) = \mathbf{w}^\top \mathbf{x}$ 中的权重向量的某个范数来度量其复杂性(这是一种正则化线性模型), 例如$| \mathbf{w} |^2$。 要保证权重向量比较小, 最常用方法是将其范数作为惩罚项加到最小化损失的问题中。 (为什么权重大会导致模型复杂度提高?)
这样一来训练目标就由最小化训练标签上的预测损失变为最小化预测损失和惩罚项之和。 此时如果权重向量增长的太大, 我们的学习算法可能会更集中于最小化权重范数$| \mathbf{w} |^2$(简而言之我们想起到的效果就是在最小化损失函数的同时保证权重不太大,至于为什么这样做,不太懂)。现在回顾一下之前的线性回归例子。其中损失由下式给出:
$\mathbf{x}^{(i)}$是样本$i$的特征, $y^{(i)}$是样本$i$的标签, $(\mathbf{w}, b)$是权重和偏置参数。 为了惩罚权重向量的大小, 我们必须以某种方式在损失函数中添加$| \mathbf{w} |^2$, 但是模型应该如何平衡这个新的额外惩罚的损失?通常通过正则化常数 $\lambda$ 来描述这种权衡, 这是一个非负超参数,我们使用验证数据拟合:
这样操作后对于$\lambda = 0$,保持了原来的损失函数。 对于$\lambda > 0$,则可以通过这一惩罚项来增大损失函数,从而使参数向$| \mathbf{w} |$更小的方向进行优化(我的理解是这样的)。 这里仍然除以$2$是因为当求导时, $2$和$1/2$会抵消,以确保更新表达式看起来既漂亮又简单。 关于为什么这里使用范数的平方而不是标准范数(即欧几里得距离)则是为了便于计算,通过使用$L_2$范数的平方(之前也提到过机器学习经常使用该范数的平方而不是它本身),我们去掉平方根,留下权重向量每个分量的平方和。 这使得惩罚的导数很容易计算,即惩罚项导数的和等于和的导数。
此外,关于为什么我们首先使用$L_2$范数,而不是$L_1$范数。这是因为这个选择在整个统计领域中都是有效的和受欢迎的。 $L_2$正则化线性模型构成经典的岭回归(ridge regression)算法, $L_1$正则化线性回归是统计学中类似的基本模型, 通常被称为套索回归(lasso regression)。
使用$L_2$范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,$L_1$惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。 这称为特征选择(feature selection),这可能是其他场景下需要的。
$L_2$正则化回归的小批量随机梯度下降更新如下式,其中$\mathcal{B}$为小批量,$\eta$为预先确定的正数,$\lambda$是正则化常数 :
我们依然是根据估计值与观测值之间的差异来更新$\mathbf{w}$,但同时也在试图将$\mathbf{w}$的大小缩小到零(有点没看懂)。 这就是为什么这种方法有时被称为权重衰减。 我们仅考虑惩罚项,优化算法在训练的每一步衰减权重。 与特征选择相比,权重衰减为我们提供了一种连续的机制来调整函数的复杂度。 较小的$\lambda$值对应较少约束的$\mathbf{w}$, 而较大的$\lambda$值对$\mathbf{w}$的约束更大(这里约束就是使值更小的意思吧)。
是否对相应的偏置$b^2$(为什么是b方?可能也是范数平方吧)进行惩罚在不同的实践中会有所不同, 在神经网络的不同层中也会有所不同。 通常,网络输出层的偏置项不会被正则化。
3.2. 权重衰减演示的从零实现
通过高维线性回归演示如何实现权重衰减。(见实践)
简单说就是先生成了一些高维(200个特征)的数据,用如下公式:
标签是关于输入的线性函数。 标签同时被均值为0,标准差为0.01高斯噪声破坏。
然后将$L_2$的平方惩罚添加到原始目标函数中。最终通过对比使用正则化和不使用正则化的过拟合优化情况可以看到正则化后测试误差减小。
3.3. 权重衰减演示的框架实现
由于权重衰减在神经网络优化中很常用, 深度学习框架为了便于我们使用权重衰减, 将权重衰减集成到优化算法中,以便与任何损失函数结合使用。 此外,这种集成还有计算上的好处, 允许在不增加任何额外的计算开销的情况下向算法中添加权重衰减。 由于更新的权重衰减部分仅依赖于每个参数的当前值, 因此优化器必须至少接触每个参数一次。
4. 暂退法(Dropout)
在概率角度看,可以通过以下论证来证明这一技术的合理性: 我们已经假设了一个先验,即权重的值取自均值为0的正态分布。我们希望模型深度挖掘特征,即将其权重分散到许多特征中, 而不是过于依赖少数潜在的虚假关联。
4.1. 重新审视过拟合
当面对更多的特征而样本不足时,线性模型往往会过拟合。 相反,当给出更多样本而不是特征,通常线性模型不会过拟合。
但线性模型泛化的可靠性是有代价的,线性模型不会考虑到特征之间的交互作用。对于每个特征,线性模型必须指定正的或负的权重,而忽略其他特征。
泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡(bias-variance tradeoff)。 线性模型有很高的偏差:它们只能表示一小类函数。 然而,这些模型的方差很低(泛化性好):它们在不同的随机数据样本上可以得出相似的结果。
深度神经网络位于偏差-方差谱的另一端。 与线性模型不同,神经网络并不局限于单独查看每个特征,而是学习特征之间的交互。 例如,神经网络可能推断“尼日利亚”和“西联汇款”一起出现在电子邮件中表示垃圾邮件, 但单独出现则不表示垃圾邮件。
即使我们有比特征多得多的样本,深度神经网络也有可能过拟合。深度网络的泛化性质令人费解,而这种泛化性质的数学基础仍然是悬而未决的研究问题。
4.2. 扰动的稳健性
在探究泛化性之前,我们先来定义一下什么是一个“好”的预测模型? 我们期待“好”的预测模型能在未知的数据上有很好的表现: 经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。 简单性以较小维度的形式展现,此外,参数的范数也代表了一种有用的简单性度量。
简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感。 例如,当我们对图像进行分类时,我们预计向像素添加一些随机噪声应该是基本无影响的。1995年,克里斯托弗·毕晓普用数学证实了“要求函数光滑”和“要求函数对输入的随机噪声具有适应性”之间的联系。
在2014年,斯里瓦斯塔瓦等人就如何将毕晓普的想法应用于网络的内部层提出了一个想法: 在训练过程中,他们建议在计算后续层之前向网络的每一层注入噪声。 因为当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。
这个想法被称为暂退法(dropout)。 暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。 这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。
暂退法的原始论文提到了一个关于有性繁殖的类比: 神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为“共适应性”。 作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。
那么关键的挑战就是如何注入这种噪声。 一种想法是以一种无偏向(unbiased)的方式注入噪声。 这样在固定住其他层时,每一层的期望值等于没有噪音时的值。
在毕晓普的工作中,他将正态分布的噪声添加到线性模型的输入中。 在每次训练迭代中,他将从均值为零的分布$\epsilon \sim \mathcal{N}(0,\sigma^2)$ 采样噪声添加到输入$\mathbf{x}$, 从而产生扰动点$\mathbf{x}’ = \mathbf{x} + \epsilon$, 预期是$E[\mathbf{x}’] = \mathbf{x}$。
在标准暂退法正则化中,通过按保留(未丢弃)的节点的分数进行规范化来消除每一层的偏差。 换言之,每个中间活性值$h$以暂退概率$p$由随机变量$h’$替换,如下所示:
根据此模型的设计,其期望值保持不变,即$E[h’] = h$。
4.3. 暂退法实践
下图为dropout前后的多层感知机,在左图中,删除了$h_2$和$h_5$, 因此输出的计算不再依赖于$h_2$或$h_5$,并且它们各自的梯度在执行反向传播时也会消失。 这样,输出层的计算不能过度依赖于$h_1, \ldots, h_5$的任何一个元素。
通常在测试时不使用暂退法(训练时用)。 给定一个训练好的模型和一个新的样本,我们不会丢弃任何节点,因此不需要标准化。 然而也有一些例外:一些研究人员在测试时使用暂退法, 用于估计神经网络预测的“不确定性”: 如果通过许多不同的暂退法遮盖后得到的预测结果都是一致的,那么我们可以说网络发挥更稳定。
4.4. 暂退法的实现
从零实现和框架实现具体见对应实践,几个可以注意的点如下:
- 在靠近输入层的地方设置较低的暂退概率。
- 框架中,在训练时,Dropout层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入)。 在测试时,Dropout层仅传递数据。
5. 前向传播与反向传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
反向传播(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。 简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。 该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。假设有函数 $Y=f(\mathrm{X})$ 和 $\mathrm{Z}=g(\mathrm{Y})$, 其中输入 和输出 $X, Y, Z$ 是任意形状的张量。利用链式法则, 我们可以计算Z关于 $X$ 的导数
这里使用prod运算符在执行必要的操作 (如换位和交换输入位置) 后将其参数相乘。对于向量只是矩阵矩阵乘法。对于高维张量则使用适当的对应项。运算符prod指代了所有的这些符号。
在训练神经网络时,在初始化模型参数后, 我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。 注意,反向传播重复利用前向传播中存储的中间值,以避免重复计算。 带来的影响之一是我们需要保留中间值,直到反向传播完成。 这也是训练比单纯的预测需要更多的内存(显存)的原因之一。 此外,这些中间值的大小与网络层的数量和批量的大小大致成正比。 因此,使用更大的批量来训练更深层次的网络更容易导致内存不足(out of memory)错误。
6. 数值稳定性和模型初始化
到目前为止学习的每个模型都是根据某个预先指定的分布来初始化模型的参数。但事实上这种初始化方案并不是理所当然的,初始化方案的选择在神经网络学习中起着举足轻重的作用,它对保持数值稳定性至关重要。 此外,这些初始化方案的选择可以与非线性激活函数的选择有趣的结合在一起。 我们选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇到梯度爆炸或梯度消失。
一些有用的启发式方法在整个深度学习生涯中都很有用。
6.1. 梯度消失和梯度爆炸
在深度神经网络中输出关于任何一组参数(权重)的梯度都可以表示n个矩阵与梯度向量的乘积。其中n个矩阵和梯度向量取决于关于哪组参数求梯度,设当前深度神经网络为L层,当关于 $l$ 层参数时,n为 $L-l$ ,梯度向量为$\partial_{\mathbf{W}}(l) \boldsymbol{h}^{(l)}$。
注:每一层 $l$ 由变换 $f_{l}$ 定义, 该变换的参数为权重 $\mathbf{W}^{(l)}$, 其隐藏变量是 $\mathbf{h}^{(l)}$ (令 $\mathbf{h}^{(0)}=输入\mathbf{x}$ )。
这样不稳定的梯度(太多概率相乘)造成两个问题:
一是容易受到数值下溢影响(概率乘积过小),即便对概率取对数,将数值表示的压力从尾数转移到指数,也有可能出现数值溢出问题(当概率趋近零,取对数后对数值趋近负无穷)。
二是威胁到优化算法的稳定性。 此时面临的问题要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛; 要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
6.1.1. 梯度消失(gradient vanishing)
sigmoid函数曾经是导致梯度消失问题的一个常见的原因。
当sigmoid函数的输入很大或是很小时,它的梯度都会消失。 此外,当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。 当我们的网络有很多层时,除非我们很小心,否则在某一层可能会切断梯度。 这个问题曾经困扰着深度网络的训练,因此,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。
6.1.2. 梯度爆炸(gradient exploding)
当梯度爆炸是由于深度网络的初始化所导致时,我们没有机会让梯度下降优化器收敛。
6.1.3. 打破对称性
神经网络设计中的另一个问题是其参数化所固有的对称性。例如对于简单的多层感知机,每一层的隐藏单元之间具有排列对称性。
例如对于一个含两个隐藏单元隐藏层的多层感知机,输出层将两个隐藏单元的多层感知机转换为仅一个输出单元。如果将隐藏层的所有参数初始化为 $\mathbf{W}^{(1)}=c , c$ 为常量。在这种情况下, 在前向传播期间, 两个隐藏单元采用相同的输入和参数, 产生相同的激活, 该激活被送到输出单元。在反向传播期间, 根据参数 $\mathbf{W}^{(1)}$ 对输出单元进行微分, 得到一个梯度, 其元素都取相同的值。因此,在基于梯度的迭代 (例如, 小批量随机梯度下降)之后, $\mathbf{W}^{(1)}$ 的所有元素仍然采用相同的值。这样的迭代永远不会打破对称性, 则可能永远也无法实现网络的表达能力。隐藏层的行为就好像只有一个单元。 小批量随机梯度下降不会打破这种对称性,但暂退法正则化可以。
6.2. 参数初始化
减缓上述三个问题的一种办法是在参数初始化方面进行改良,在优化期间做一些工作和适当的正则化也可以进一步提高稳定性。
6.2.1. 默认初始化
如果不人为指定初始化方法,框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。
6.2.2. Xavier初始化
对于只有线性计算的全连接层的输出$o_{i}$,设有$n_{\mathrm{in}}$个输入 $x_{j}$ 及对应的相关权重 $w_{i j}$,则输出可由下式表示:
权重 $w_{i j}$ 都是从同一分布中独立抽取的。假设该分布(并不一定是正态分布,只是需要均值和方差存在)具有零均值和方差 $\sigma^{2}$,同时假设层 $x_{j}$ 的输入也具有零均值和方差 $\gamma^{2}$, 它们独立于 $w_{i j}$ 并且彼此独立。在这种假设下就可以按如下方式计算 $o_{i}$ 的期望和方差:
所以保持输出与输入的方差不变的一种方法是设置 $n_{\text {in }} \sigma^{2}=1$ 。 在反向传播过程中也是类似的问题, 梯度从更靠近输出的层传播的。使用与正向传播相同的推断, 可以得出除非 $n_{\text {out }} \sigma^{2}=1$, 否则梯度的方差可能会增大($n_{\text {out }}$ 是该层的输出的数量)。但很明显不可能同时满足这两个条件($n_{\text {in}}$和$n_{\text {out}}$相等且与$\sigma^{2}$乘积为1)。则只需满足:
这就是现在标准且实用的Xavier初始化的基础,它以其提出者第一作者的名字命名。
通常, Xavier初始化从均值为零, 方差 $\sigma^{2}=\frac{2}{n_{\text {in }}+n_{\text {aut }}}$ 的正态分布中采样权重。我们也可以利用 Xavier的直觉来选择从均匀分布中抽取权重时的方差。注意均匀分布 $U(-a, a)$ 的方差为 $\frac{a^{2}}{3}$ 。将 $\frac{a^{2}}{3}$ 代 入到 $\sigma^{2}$ 的条件中,将得到初始化值域:
虽然上述的“不存在非线性计算”的假设在神经网络中很容易被违反, 但Xavier初始化方法在实践中被证明是有效的。
6.2.3. 更多初始化方法
上面的推理仅仅触及了现代参数初始化方法的皮毛。 深度学习框架通常实现十几种不同的启发式方法。 参数初始化一直是深度学习基础研究的热点领域。 其中包括专门用于参数绑定(共享)、超分辨率、序列模型和其他情况的启发式算法。
7. 环境和分布偏移
许多机器学习应用中存在的问题之一就是在将基于模型的决策引入环境时可能会破坏模型。比如用户根据模型的某些特点,做出对应更改从而获取非法利益。
7.1. 分布偏移的类型
分布偏移,在我理解就是两个(或多个)数据集间分布不同的情况,比如在训练集和测试集之间,如果没有一个关于两者间相互关系的预估,那将不能学习到有用的模型。
基于对未来数据可能发生变化的一些限制性假设,有些算法可以检测这种偏移,甚至可以动态调整,提高原始分类器的精度。
7.1.1. 协变量偏移(covariate shift)
在不同分布偏移中, 协变量偏移可能是最为广泛研究的。 协变量偏移是指:输入的分布可能随时间而改变, 但标签函数(即条件分布 $P(y \mid \mathbf{x})$ )没有改变。
统计学家称之为协变量偏移是因为这个问题是由于协变量(特征)分布的变化而产生的。具体的例子比如在训练分类器时,训练集为真实图片,而测试集为卡通图片。
当认为 $\mathbf{x}$ 导致 $y$ 时, 标签偏移是一个合理的假设。
7.1.2. 标签偏移(label shift)
标签偏移(label shift)描述了与协变量偏移相反的问题。它假设标签边缘概率 $P(y)$ 可以改变, 但是类别条件分布 $P(\mathbf{x} \mid y)$ 在不同的领域之间保持不变。
当认为 $y$ 导致 $\mathbf{x}$ 时, 标签偏移是一个合理的假设。例如预测患者的疾病, 我们可能根据症状来判断, 即使疾病的相对流行率随着时间的推移而变化。标签偏移在这里是恰当的假设, 因为疾病会引起症状,输入为症状(不变),输出为可能的疾病(随时间而分布变化)。
有时标签偏移和协变量偏移假设可以同时成立。在这些情况下,使用基于标签偏移假设的方法通常是有利的。这是因为这些方法倾向于包含看起来像标签 (低维) 的对象, 而不是像输入(高维)的对象。
7.1.3. 概念偏移(concept shift)
当标签的定义发生变化时,就会出现这种问题。精神疾病的诊断标准、所谓的时髦、以及工作头衔等等,都是概念偏移的日常映射。
7.2. 分布偏移纠正
许多情况下训练分布与测试分布是不同的,有时这对模型没什么影响,有时则需要运用一些手段去应对这种偏移。
7.2.1. 经验风险与实际风险
在模型的训练期间,训练数据 ${(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)}$ 的特征和相关的标签经过迭代,在每一个小批量之后更新模型 $f$ 的参数。为了简单起见,我们先不考虑正则化,此时极大地降低了训练损失(即经验风险最小化):
其中 $l$ 是损失函数, 用来度量给定标签 $y_{i}$, 预测 $f\left(\mathbf{x}_{i}\right)$ 的 “糟糕程度”。 统计学家称上式中的这一项 $l\left(f\left(\mathbf{x}_{i}\right), y_{i}\right)$ 为经验风险。 经验风险 (empirical risk) 是为了近似真实风险(true risk)。
真实风险是整个训练数据上的平均损失, 即从其真实分布 $p(\mathbf{x}, y)$ 中抽取的所有数据的总体损失的期望值:
然而在实践中通常无法获得总体数据。因此, 经验风险最小化是一种实用的机器学习策略,希望能近似最小化真实风险。
7.2.2. 协变量偏移纠正
下面三种纠正原理暂时放一下,详细看还是得多读几遍书。
给出完整的协变量偏移纠正算法,假设我们有一个训练集 ${(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)}$ 和一个未标记的测试集 ${\mathbf{u}_1, \ldots, \mathbf{u}_m}$ 对于协变量偏移,我们假设 $1 \leq i \leq n$ 的 $\mathbf{x}_{i}$ 来自某个源分布 $q(\mathbf{x})$, $\mathbf{u}_{i}$ 来自目标分布 $p(\mathbf{x})$。以下是纠正协变量偏移的典型算法:
- 生成一个二元分类训练集: ${(\mathbf{x}_1, -1), \ldots, (\mathbf{x}_n, -1), (\mathbf{u}_1, 1), \ldots, (\mathbf{u}_m, 1)}$ 。
- 用对数几率回归训练二元分类器得到函数 $h_{\circ}$
- 使用 $\beta_{i}=\exp \left(h\left(\mathbf{x}_{i}\right)\right)$ 或更好的 $\beta_{i}=\min \left(\exp \left(h\left(\mathbf{x}_{i}\right)\right), c\right)$ (c为常量)对训练数据进行加权。
- 使用权重 $\beta_{i}$ 进行”加权经验风险最小化“中 ${(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)}$ 的训练。
上述算法依赖于一个重要的假设:需要目标分布(例如, 测试分布)中的每个数据样本在训练时出现的概率非零。如果找到 $p(\mathbf{x})>0$ 但 $q(\mathbf{x})=0$ 的点,那么相应的重要性权重会是无穷大(因为 $\beta_{i} \stackrel{\operatorname{def}}{=} \frac{p\left(\mathbf{x}_{i}\right)}{q\left(\mathbf{x}_{i}\right)}$)。
加权经验风险最小化:
7.2.3. 标签偏移纠正
标签偏移的一个好处是,如果我们在源分布上有一个相当好的模型,那么我们可以得到对这些权重的一致估计,而不需要处理周边的其他维度。 在深度学习中,输入往往是高维对象(如图像),而标签通常是低维(如类别)。
7.2.4. 概念偏移纠正
概念偏移很难用原则性的方式解决。 例如,在一个问题突然从“区分猫和狗”偏移为“区分白色和黑色动物”的情况下, 除了从零开始收集新标签和训练没有其他的办法。 但在实践中这种极端的偏移是罕见的,通常情况下,概念的变化总是缓慢的。 在这种情况下,我们可以使用与训练网络相同的方法,使其适应数据的变化。 换言之,我们使用新数据更新现有的网络权重,而不是从头开始训练。
7.3. 学习问题的分类方法
机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。
机器学习能解决的问题包括以下几种(参考):
- 分类问题:根据数据样本上抽取出的特征,判定其属于有限个类别中的哪一个。
- 回归问题:根据数据样本上抽取出的特征,预测一个连续值的结果。
- 聚类问题:根据数据样本上抽取出的特征,让样本抱抱团(相近/相关的样本在一团内)。
在机器学习模拟学习的方法上,有许多分类,如批量学习、强化学习等等,目前就是在讨论这方面(这些学习问题)的类别有哪些。
7.3.1. 批量学习(batch learning)
在批量学习中, 我们可以访问一组训练特征和标签 ${(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)}$, 使用这些特性和标签训练 $f(\mathbf{x})$ 。 然后部署此模型来对来自同一分布的新数据 $(\mathbf{x}, y)$ 进行评分。 例如, 我们可以根据猫和狗的大量图片训练一个猫检测器。 一旦我们训练了它, 就把它作为智能猫门计算视觉系统的一部分, 来控制只允许猫进入该门。 然后这个系统会被安装在客户家中, 基本再也不会更新。
7.3.2. 在线学习(online learning)
“在线”逐个学习数据$\left(\mathbf{x}_{i}, y_{i}\right)$。我们首先观测到$\mathbf{x}_{i}$,然后得出一个估计值 $f\left(\mathbf{x}_{i}\right)$, 当完成估计后,我们才观测到 $y_{i}$。然后根据模型的决定(估计), 给予模型奖励或惩罚。
例如, 我们预测明天的股票价格来根据这个预测进行交易。在一天结束时, 我们会评估模型的预测是否盈利。
在线学习的循环如下,这样看起来就清晰易懂了:
7.3.3. 老虎机(bandits)
在一个老虎机问题中,只有有限数量的手臂可以拉动。 也就是说我们可以采取的行动是有限的。 老虎机问题是一个相较于上述问题更简单的情景,可以获得更强的最优性理论保证。 这个问题经常被视为一个单独的学习问题的情景。
7.3.4. 控制
在很多情况下,环境(许多算法形成的环境模型)会记住我们所做的事,虽然不一定是以对抗的方式,并且环境会根据记忆做出相应的反应。 例如,咖啡锅炉控制器将根据之前是否加热锅炉来观测到不同的温度。 在这种情况下,PID(比例—积分—微分)控制器算法是一个流行的选择,温度PID控制器的原理是将温度偏差的比例、积分和微分通过线性组合构成控制量,对控制对象进行控制。
这里还是有点没看明白,英文翻译的不好。 22.06.16
近年来,控制理论(如PID的变体)也被用于自动调整超参数, 以获得更好的解构和重建质量,提高生成文本的多样性和生成图像的重建质量。
7.3.5. 强化学习(reinforcement learning)
强化学习强调如何基于环境而行动,以取得最大化的预期利益。 国际象棋、围棋、西洋双陆棋或星际争霸都是强化学习的应用实例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。
7.3.6. 基于应用环境选择学习方法
上述不同情况之间的一个关键区别是: 在静止环境中可能一直有效的相同策略,在环境能够改变的情况下可能不会始终有效。
环境变化的速度和方式在很大程度上决定了我们可以采用的算法类型。 例如,如果我们知道事情只会缓慢地变化,就可以迫使任何估计也只能缓慢地发生改变。 如果我们知道环境可能会瞬间发生变化,但这种变化非常罕见,我们就可以在使用算法时考虑到这一点。
当一个数据科学家试图解决的问题会随着时间的推移而发生变化时这些类型的知识至关重要。
7.4. 机器学习中的公平、责任和透明度
当部署机器学习系统时,你不仅仅是在优化一个预测模型,通常是在提供一个会被用来(部分或完全)进行自动化决策的工具。 这些技术系统可能会通过其进行的决定而影响到每个人的生活。
从 预测 到 决策 的飞跃不仅提出了新的技术问题, 而且还提出了一系列必须仔细考虑的伦理问题。
后记
Kaggle房价预测比赛的实践,放到下一篇笔记中吧。
还遇到了kramed渲染不了公式中大括号的问题,先将就,等我学了JS回来再修复。
还发现了链接图片的原理,前面加斜杠是表示在域名下一级。