第4章 机器学习入门

前一章介绍了与预测相关的统计学和概率论中的各种概念。由于许多最先进的方法依赖于机器学习,本章将介绍一些基本定义和概念。它不打算提供深入的理解,而是计划概述与本书相关的主要概念。它提供了使用软件包拟合和配置机器学习模型时实际相关概念的概述。它不介绍具体的算法,因为通常用于负荷预测的机器学习算法将在第10章中详细讨论。更深入的概述可以在附录D.2的进一步阅读列表中找到。

4.1 定义与相关概念

机器学习的常见定义是,它包括使计算机能够从数据中学习并在特定任务中提高性能而无需显式编程的算法。一个典型的此类任务是描述一组通常被测量或预设的输入变量与一个或多个输出之间的关系(关于其他机器学习任务,请参见下一节)。

根据这一定义,机器学习可以与计算机科学中研究的经典算法和程序(即有限序列的明确定义指令)区分开来。传统算法按照程序员在设计时实现的步骤确定性地执行任务,从而产生特定的性能。相比之下,机器学习算法利用经验/观察(即数据)来改进任务内的性能,甚至可能在运行时进行改进。这使得算法能够处理那些用人类编写和设计的经典算法和程序难以解决的任务。区分机器学习与经典编程的第二种方式是,对于经典编程,人们提供输入和一个函数(算法)来计算输出。而在机器学习中,人们提供一些示例输入和输出来找到一个函数,该函数随后可用于新的输入以计算输出。

上述定义也可用于区分机器学习与统计学(参见第3章中一些基本概念的介绍)。区分两者的一种观点是,统计模型旨在推断变量之间的关系,而机器学习模型旨在做出最准确的预测,即最大化性能。统计模型的一个常见目的是推断变量之间的关系,即创建数据生成过程的数学模型,以形式化理解或检验关于系统行为的假设。

虽然统计模型也能进行预测,但这通常是通过做出参数假设来实现的,比如假设数据遵循特定分布(参见第3章)。虽然这提高了模型的可理解性和可解释性,但它引入了模型偏差,对于复杂数据可能会阻碍准确预测的实现。同样,由于过多的输入变量会阻碍过程的可解释性,统计学家可能希望避免 $p>> n$ 的情况,即输入变量数量远大于样本数量。因此,统计学家可能希望通过执行变量选择来避免过度参数化,剔除对推断贡献不显著的项。这通常能提高模型理解,但可能会抑制预测准确性,因为即使微小的贡献也能改善预测。

相比之下,机器学习模型旨在从经验(过去的数据)中学习,主要目标是改进预测,换句话说,它通常牺牲对底层机制的理解以换取性能。机器学习模型大多是非参数方法(例如,参见第3.4节),并且通常能够处理大量输入变量,而无需大量手动预处理或特征选择。利用复杂模型并去除限制性假设,机器学习应用优化技术来寻找近似的算法解决方案(参见第4.3节)。相比之下,统计模型有时可以找到精确的闭式解。除了优化,机器学习方法通常关注开发避免过拟合的方法,即寻找能够良好泛化到未训练过的新数据点的模型和方法。这包括各种正则化方法(参见第8.2.5节)。所有这些都是以牺牲可解释性为代价来提高预测性能,与统计方法相比。

虽然前几段强调了机器学习与经典计算机算法和统计学的一些主要区别,但它们并非完全分离。这些概念之间存在相当大的重叠,机器学习在很大程度上依赖于经典计算机科学和统计学的技术和方法。例如,了解数据生成过程通常能提供关于什么构成良好预测器的见解,并且通常是应用建模过程中的关键步骤。机器学习还依赖于计算机科学和算法的几个领域,例如,当数据集变得太大而无法放入单台计算机(或其GPU)的内存时。实际机器学习中的许多工作涉及使用分布式计算等计算机科学方法来管理数百万、数十亿甚至数万亿参数的策略(本书不涉及这方面)。除此之外,机器学习还严重依赖其他数学概念,如优化、矩阵代数和微积分。

这如何转化为短期负荷预测?

与近年来的许多领域一样,机器学习模型已越来越多地应用于预测问题。与图像识别或自然语言处理等其他许多学科相比,在时间序列预测中,它们尚未在该领域占据主导地位,优于简单的基准方法和更复杂的统计方法,如第9章所述。这是因为许多时间序列问题的数据可用性有限,而且许多机器学习算法往往不必要地复杂。直到最近几年,机器学习模型(例如循环神经网络或梯度提升)才开始持续优于其他方法(例如,参见M5时间序列预测竞赛的讨论[1])。随着专门深度学习方法(如DeepAR [2]和N-BEATS [3])的出现,更先进的专门机器学习模型可能在许多时间序列问题中得到改进的趋势似乎正在形成。然而,由于统计模型能更好地理解可用数据与预测之间的关系,在负荷预测过程中应始终使用准确的统计模型作为基准(参见第9章)。M5竞赛表明[1],统计模型和机器学习模型的组合可以达到最先进的结果,同时保持至少部分可解释性,结合了两种方法的优点。这使得它们在实际应用中特别有吸引力。

4.2 机器学习分类与术语

前一节介绍了机器学习作为使计算机能够通过从数据中学习来提高特定任务内性能的算法。最常见的机器学习任务是描述一组输入和输出变量之间的关系。这个任务被称为监督学习。除了监督学习,还有其他子类型的机器学习,最重要的是无监督学习和强化学习。

4.2.1 监督学习

监督学习是从数据中学习一组输入和输出变量之间关系的任务,即学习某个函数 f 以便能够进行预测。这些输入通常被称为实例或样本。实例是以某种方式(例如通过传感器)测量或获取的值的集合。它通常记为 $\textbf{X} \in \mathbb {R}^n$ 。用统计术语来说,实例是 n 个随机变量 $X_1, X_2, \ldots , X_n$ 的一个实现向量,因此也可以写成 $\textbf{X}= (X_1, X_2, \ldots , X_n)$ (第3.1节)。这些输入在统计文献中通常被称为预测变量或自变量。在机器学习文献(以及本章其余部分)中,更常用的术语是特征。在本书中,这两个术语都会被使用。

统计学家可能将输出称为响应或因变量。根据任务是预测数值变量还是定性变量(如类别成员),在机器学习中,输出在机器学习文献中被称为目标或标签。如果监督学习任务是预测数值变量,则该任务被称为回归。为解决这一问题,机器学习算法旨在建模一个函数 $f\colon\mathbb{R}^{n}\to\mathbb{R}.$ ,或者在多目标变量的情况下建模 $f\colon{\mathbb{R}}^{n}\to{\mathbb{R}}^{k}$ 。在后一种情况下,回归问题可能被称为多目标或多输出回归。注意不要将其与多元回归或多变量回归混淆,后者指的是输入的维度,即 $n>1$ 。注意,术语“回归”有时用于表示线性回归(参见第9.3节)。然而,线性回归只是众多回归方法中的一种,回归任务可以使用许多不同的算法来执行,本书将对此进行讨论。

一项常见的机器学习任务是预测一个实例被分配到k个类别或类中的哪一个。这里,机器学习算法等价于建模一个函数$f\colon\mathbb{R}^{n}\{1,\ldots,k\}$,每个类别被分配一个整数。这个输出可以是代表特定类别的数值代码,但更常见的是,机器学习算法生成一个关于类别的概率分布。这个任务被称为分类。根据输出是单变量还是多变量,输出分别表示为$Y\in\mathbb{R}$或$\mathbf{Y}\in\mathbb{R}^{k}$(为简便起见,以下将单变量情况作为多变量情况在$k=1)$时的特例来呈现)。

关系f是从数据集中学习得到的。虽然形式上顺序无关紧要,但数据集可以看作N个实例及其相应标签或目标的元组集合,即$\boldsymbol{\mathcal{X}}=\left\{(\mathbf{X}_{1},\mathbf{Y}_{1}),(\mathbf{X}_{2},\mathbf{Y}_{2}),\ldots,(\mathbf{X}_{j},\mathbf{Y}_{j}),(\mathbf{X}_{N},\mathbf{Y}_{N})\right\}$。然而,由于许多算法使用线性代数,通常也将数据集的输入集合表示为矩阵X,输出集合表示为向量或矩阵Y。注意,为简单起见,输入被介绍为n维向量,但对于不同的机器学习任务,它们可能具有更高的维度,例如图像或视频。因此,可以更普遍地将它们视为张量。但为了方便和清晰起见,本文将重点关注矩阵和向量,这将是负荷预测中最常见的形式。

4.2.2 无监督学习

无监督学习通常指在没有标签的情况下学习和识别数据中模式的算法。将数据集表示为具有N个成员$\mathbf{X}_{1},\ldots,\mathbf{X}_{i},\ldots,\mathbf{X}_{N}$的集合$\mathcal{X}$,每个$\mathbf{X}_{i}=(X_{1},\ldots,X_{j},\ldots,X_{n})^{T}$由n个特征组成。无监督学习任务可用于建模数据集中的模式$\mathcal{X}$、每个实例内部的模式$\mathbf{X}_{i}$,或两者都建模。

与在数据集中寻找模式最常关联的问题类型是寻找数据集的分区或分组,即对数据集进行聚类。目标是找到k个分组$\mathcal{X}_{1}^{\prime},\ldots,\mathcal{X}_{i}^{\prime},\mathcal{X}_{k}^{\prime}$,使得$\cup_{i=1}^{k}\mathcal{X}_{i}^{\prime}=\mathcal{X}$。最常见的算法是基于质心的k-means聚类、基于距离的层次聚类以及基于密度的模型DBSCAN和OPTICS。对这些算法的讨论不在本书范围内,但关于k-means和层次聚类可参见[4],关于DBSCAN和OPTICS的讨论可参见[5]。另一种可用于聚类的方法的例子称为有限混合模型,在第11.3.2节中给出,但此处用于建模复杂分布。

在每个单独实例$\mathbf{X}_{i}$内寻找模式的最常见原因是降维以及相关的寻找嵌入(即有意义的潜在数据表示)的问题。降维方法旨在通过寻找数据的低维表示来应对维数灾难1。数据的这种低维表示可以用作特征,例如在监督学习或预测中。使用低维数据作为输入进行预测的模型可以称为下游模型。它也可用于在二维或三维表示中可视化高维数据。流行的方法包括主成分分析(PCA)和t分布随机邻居嵌入(t-SNE)。图4.1显示了使用PCA将三个家庭的时间序列从每天96个值(15分钟数据)降为二维的结果。左侧是三个家庭在15分钟分辨率下的一些示例样本。可以看出,行为通常非常不同,负荷出现在一天中的不同时间。右侧是应用PCA后的二维数据散点图,目的是找到数据的两个描述性特征。添加了特定家庭的颜色高亮,以说明即使维度已大幅降低,不同家庭的数据通常仍保持在一起,表明它们之间的一些差异在这种低维表示中得以保留。

对这些方法的详细讨论不在本书范围内。找到合适的原始输入潜在表示对于处理图像或文本数据至关重要。例如,许多机器学习模型需要固定长度的数值输入序列,无法处理不同长度的句子。这通常与神经网络(第10.4节)相关。目标是找到一个固定宽度的低维表示,即使对于不同长度的输入(例如不同句子长度),在潜在空间中相似的实例彼此更接近。

图4.1 15分钟分辨率家庭数据集的样本(左)和应用PCA后的二维表示(右)

密度估计也可以视为无监督学习任务,它同时学习数据集和实例中的模式。第3.4节介绍了一些来自统计学领域的更经典的密度估计方法。然而,最近对于文本、图像和视频等复杂分布,出现了生成式机器学习方法,如变分自编码器(VAE)、归一化流、生成对抗网络(GAN)和扩散模型。这些概念有时应用于时间序列(包括负荷数据),但在此领域尚未成熟,因此本书不再进一步讨论。模型的目标是估计一个分布(参见第3.1节),例如对预测估计中的不确定性进行推断,或者也可以用于从数据集的分布中采样新数据(或实现)。

最近,还出现了半监督和自监督学习方法,例如作为大型语言模型的一部分。在这里,标签要么部分存在以训练嵌入模型,要么通过部分遮蔽数据来创建。潜在表示也是生成模型的核心。然而,这些方法在此领域尚未成熟,因此本书不再进一步讨论。

4.2.3 强化学习

第三个常见的机器学习子类别是强化学习。与无监督和监督学习算法不同,它包含的算法不是从固定数据集中学习,而是与环境交互,即学习系统与环境数据之间存在反馈回路。强化学习任务通常建模为马尔可夫决策过程(MDP),其中学习系统称为智能体,它与环境交互。首先,它观察环境的当前状态,并根据学习到的策略选择合适的动作。该动作导致来自环境的奖励作为反馈。然后环境进入新状态,过程以迭代方式继续。策略根据奖励进行调整,从而使智能体学习。根据算法不同,智能体可以选择已知效果良好的动作(利用),或者探索新动作(探索)。由于策略将状态/动作对映射到奖励,这种映射可以由监督学习算法以及最近的深度学习算法(第10.5节)支持。

然而,现实世界的应用常常面临不同的挑战。第一个问题是信用分配问题,奖励信号通常被延迟,只有在执行一系列动作后才能获得,这使得很难将个体动作的影响归因于奖励。第二个问题是奖励破解,即错误制定的目标函数可能导致意外结果。最后,在无效动作成本高昂的应用中,探索新动作往往并非可取。此时,仿真(通常称为“环境”)可以支持学习最优策略。强化学习概念也已部分应用于时间序列预测问题,但尚未成熟,本书不做进一步讨论。

这如何转化为短期负荷预测?

时间序列预测可以表述为多元回归问题。因此,监督式机器学习模型通常可以应用于时间序列预测问题。虽然监督式方法最为常见,但无监督和强化学习方法也可以用于预测,既可以单独使用,也可以更常见地与监督式方法结合使用。例如,在预测聚合时间序列时,可以使用聚类技术对组成信号的各时间序列数据进行划分。然后,在合并预测结果之前,对生成的聚类训练模型。与直接预测聚合时间序列相比,这可以提高准确性,因为各个序列可能具有相似的特征,这些特征可用于设计精确的聚类预测模型。此外,降维可以改进预测模型,并应用于探索性数据分析,以识别重要模式和/或开发新输入。

4.3 梯度下降优化简介

如上所述,使用机器学习时,必须基于训练集上的预测误差确定最优参数。例如,在神经网络模型中(第10.4节),必须训练网络的权重。然而,除了预测误差外,还需要同时优化受模型影响的其他组成部分,例如所选参数的范围(或约束)(见第8.2.4节正则化)。总体而言,这个待优化的函数称为损失函数或成本函数。

许多统计方法中的优化问题可以使用解析闭式解来解决,而机器学习中的大多数优化问题(如寻找神经网络的权重)则相当复杂,例如具有非凸成本函数,即它们有多个局部最优值或鞍点。图4.2展示了一个56层预训练卷积神经网络的损失函数示例。对于简单的成本函数,通常可以找到全局最优解,但对于更复杂的成本函数,解决方案通常只是局部最优解。因此,优化通常不是确定性的,换句话说,运行相同的过程(例如训练神经网络)可能得到不同的解,即性能好坏不同的模型。

大多数最先进的机器学习模型,特别是神经网络,都使用某种形式的梯度下降。参数,即权重 $\beta_{:}$,根据损失函数的梯度进行调整(参见第10.4节人工神经网络的介绍)。因此,如果成本函数相对于当前权重的梯度为正,则意味着权重减小会导致成本下降。类似地,如果梯度为负,则权重增加会导致成本函数下降。需要注意的是,许多统计方法也使用梯度方法,特别是对于参数和观测值数量众多、难以直接通过闭式解找到最优解的问题。

图4.2 用于图像识别的预训练56层卷积神经网络ResNET-56沿两个随机归一化方向的损失函数示例,使用文献[6]中描述的Loss Landscape工具生成
图4.3 基本成本函数的梯度下降示意图。根据梯度下降的方向更新权重 $w$。更新的步长基于学习率。这里展示了两种不同的学习率。

为演示此过程,考虑一个基本成本函数(如图4.3所示,由 $(w-4)^{2})$ 定义)。初始时,权重为 $w=7.9$,且该点处成本函数的梯度为正。这表明在该权重附近,增加权重会导致成本函数增加。因此,应减少权重以降低成本函数的值,并找到更接近最优值的值(此处为 $w=4$ 时的零)。然后在新值处重复该过程。问题是减少多少值。这由所谓的学习率或步长决定。图4.3展示了两种不同的学习率,其中一种在一次迭代后比另一种更接近真实最小值(在 $w=4$ 处)。显然,学习率是算法的一个重要超参数(见第8.2.3节超参数调优)。学习率太小,收敛时间会太长(并可能过早停止)而无法达到最小值。学习率太大,解会过于不稳定,甚至可能根本不收敛。

在这个简单示例中,梯度是针对完整训练数据计算的。这称为批量梯度下降。它使用高效的矩阵运算计算每个实例的误差,并对整个数据集取平均以确定梯度。这种平均提供了稳定的学习路径,因此导致快速收敛。这仅适用于简单问题和小数据集。对于更大的神经网络,例如卷积神经网络和大型数据集(如图像),这是不可行的,因为梯度计算变得过于复杂,矩阵无法放入计算机内存(即使内存很大,这也是低效的资源使用)。相反,对于大型数据集,使用数据集中的样本通常足以很好近似当前迭代的梯度。

图4.4 梯度下降(平滑)、随机梯度下降(不稳定)和小批量梯度下降(折中)收敛路径的示意图

当每一步仅考虑一个实例时,称为随机梯度下降。随机梯度下降的优点是算法每次迭代更快。然而,与批量梯度下降相比,该算法导致的学习路径较不规律和稳定。代价函数不会平滑下降,而是会“锯齿状”波动,甚至可能暂时“爬坡”,因为单个样本无法准确近似整个数据集的梯度。虽然这看似不理想,但在训练复杂神经网络时却有帮助,因为它为优化过程引入了随机性,有助于估计量逃离局部极小值或鞍点。因此,当前大多数深度学习模型使用小批量梯度下降,它结合了批量梯度下降和随机梯度下降的思想。图4.4展示了这三种梯度下降算法的路径。

在小批量梯度下降中,算法每一步基于训练集的一个子集而非完整数据集或单个实例计算梯度。这提供了一种折衷,因为它利用梯度计算中的高效矩阵运算,结果收敛比随机梯度下降更平滑、更稳定。一个缺点是给训练过程引入了额外的超参数,因为除了步长,还需要提供批量大小。选择小批量大小需确保足够的多样性以逃离局部极小值,同时提供一定的稳定性和从快速矩阵计算中获得足够的计算效率。

除了分割训练集计算梯度的方式外,还有许多其他方法可以改进普通梯度下降。一种流行的修改是添加动量。普通随机梯度下降可能在损失函数某个维度曲面梯度比其他维度陡峭得多的区域遇到困难。这里添加动量项,对于梯度指向相同方向的维度增加动量,对于梯度改变方向的维度减小动量。这导致向局部最优移动时收敛更快、振荡更少(如图4.5所示)。

图4.5 不带动量和带动量的随机梯度下降收敛路径示意图

许多优化算法引入了某种形式的自适应学习率,根据某些规则改变步长值。简单的调度可能会随时间衰减(减小)步长,以在训练开始时产生较大变化,然后在接近局部最优时进行微调。另一种变体是循环学习率,其中学习率根据规则迭代地增大和减小,以提高逃离局部最优的机会。对现有众多优化算法的概述超出了本书的范围。一些流行的优化器概述见[7]。一种有效且流行的优化算法是自适应矩估计(Adam),它使用自适应学习率和动量背后的思想。与使用简单学习率衰减调度的无动量普通随机梯度下降相比,它通常能更快收敛到局部极小值。此外,它不太容易陷入鞍点,并且对步长和衰减调度等初始化参数的依赖较小。因此,使用默认超参数的Adam是在实践中训练深度神经网络的可行方法。

4.4 问题

对于需要使用真实需求数据的问题,尝试使用附录D.4中列出的一些数据。

  1. 选择单个家庭或建筑的时间序列,并将数据集排列成矩阵,使每一行代表一天。将其重采样为小时数据,使矩阵有24列。使用你偏好的库(例如Scikit-Learn2)应用主成分分析(PCA)来降维。然后,也应用t-SNE进行比较。使用散点图可视化二维和三维结果。是否看到数据点聚类?找出可能造成不同分组的解释。通过在图中使用不同颜色验证你的假设。接下来,重复每个算法的应用。结果是否有变化?
  2. 使用包含多个家庭数据的数据集。通过重新排列数据创建矩阵$\mathbf {X_1}$,使矩阵的每一行代表一个家庭的一天。运行k-means聚类,目标找到10个簇。可视化每个簇的成员并比较它们。是否看到明显的簇,或者是否有非常相似模式可以合并的簇?尝试更少的目标簇。这是否导致“更好”的分组?在没有“真实答案”的情况下,通常有哪些方法可以评估和比较聚类结果?
  3. 聚类可以使用原始负荷数据或从负荷数据中提取特征进行。$\mathbf {X_1}$已包含原始数据。接下来,通过应用PCA将数据降维到6个分量(即矩阵有6列)创建矩阵$\mathbf {X_2}$。创建第三个矩阵$\mathbf {X_3}$,在其中推导一些手动特征,例如一天中某些时间的平均值和最大值。重复上一问题中目标为10个簇的k-means聚类。再次可视化每个簇的成员,并比较三种表示(原始数据、手动特征和PCA自动特征)的结果。结果变化大吗?哪种方法导致更明显的簇?

参考文献

  1. S. Makridakis, E. Spiliotis, V. Assimakopoulos, The M5 accuracy competition: results, findings and conclusions. Int. J. Forecast. (2020)
  1. David Salinas, Valentin Flunkert, Jan Gasthaus, Tim Januschowski, Deepar: probabilistic forecasting with autoregressive recurrent networks. Int. J. Forecast. 36(3), 1181–1191 (2020)
  1. B.N. Oreshkin, D. Carpov, N. Chapados, Y. Bengio, N-beats: neural basis expansion analysis for interpretable time series forecasting (2019). arXiv:1905.10437
  1. T. Hastie, R. Tibshirani, J. Friedman, The Elements of Statistical Learning: Data Mining, Inference, and Prediction. Springer Series in Statistics (2009)
  1. M. Ankerst, M.M. Breunig, H.-P. Kriegel, J. Sander, Optics: ordering points to identify the clustering structure. ACM Sigmod Record 28(2), 49–60 (1999)
  1. H. Li, Z. Xu, G. Taylor, C. Studer, T. Goldstein, Visualizing the loss landscape of neural nets, in Neural Information Processing Systems (2018)
  1. S. Ruder, An overview of gradient descent optimization algorithms (2017). arXiv:1609.04747v2

除非在材料的致谢行中另有说明,本章中的图像或其他第三方材料均包含在本章的知识共享许可中。如果材料未包含在本章的知识共享许可中,且您的预期使用不被法定法规允许或超出允许使用范围,您将需要直接获得版权持有人的许可。