使用Apache Spark扩展搜索

通过新的SparkTrials类,您可以指示Hyperopt在Apache Spark集群上分布式地执行调优任务。最初在Databricks内部开发的这一API,现已贡献给Hyperopt。

超参数调优和模型选择通常涉及训练数百或数千个模型。SparkTrials并行运行这些训练任务的批次,每个任务在一个Spark执行器上运行,从而实现大规模的调优扩展。要使用SparkTrials与Hyperopt,只需将SparkTrials对象传递给Hyperopt的fmin()函数:

import hyperopt

best_hyperparameters = hyperopt.fmin(
  fn = training_function,
  space = search_space,
  algo = hyperopt.tpe.suggest,
  max_evals = 64,
  trials = hyperopt.SparkTrials())

在底层,fmin()将生成新的超参数设置以进行测试,并将它们传递给SparkTrials,后者在集群上异步运行这些任务,如下所示:

  • Hyperopt的主要逻辑在Spark驱动程序上运行,计算新的超参数设置。
  • 当一个工作节点准备好接受新任务时,Hyperopt会为该超参数设置启动一个单任务的Spark作业。
  • 在该任务中,运行在一个Spark执行器上,用户代码将被执行以训练和评估一个新的机器学习模型。
  • 完成后,Spark任务将返回结果,包括损失,给驱动程序。

这些新结果被Hyperopt用来计算未来任务的更好的超参数设置。

由于SparkTrials在每个Spark工作节点上拟合和评估每个模型,因此它仅限于调优单机机器学习模型和工作流,例如scikit-learn或单机TensorFlow。对于分布式机器学习算法,如Apache Spark MLlib或Horovod,您可以使用Hyperopt的默认Trials类。

SparkTrials API

SparkTrials可以通过三个参数进行配置,所有这些参数都是可选的:

parallelism 同时评估的最大试验数量。更高的并行度允许扩展测试更多的超参数设置。默认值为Spark的SparkContext.defaultParallelism

  • 权衡:parallelism参数可以与fmin()中的max_evals参数一起设置。Hyperopt将总共测试max_evals个超参数设置,分批进行,每批大小为parallelism。如果parallelism = max_evals,那么Hyperopt将进行随机搜索:它将独立选择所有要测试的超参数设置,然后并行评估它们。如果parallelism = 1,那么Hyperopt可以充分利用像Parzen树估计器(TPE)这样的自适应算法,这些算法会迭代地探索超参数空间:每个新测试的超参数设置将基于之前的结果选择。在1max_evals之间设置parallelism允许您在可扩展性(更快地获得结果)和自适应性(有时获得更好的模型)之间进行权衡。
  • 限制:目前并行度有一个硬性上限为128。SparkTrials还会检查集群的配置,看看Spark允许多少个并发任务;如果并行度超过这个最大值,SparkTrials将把并行度降低到这个最大值。

timeout fmin()允许运行的最大时间(以秒为单位),默认为None。超时提供了一种预算机制,允许对调优时间进行上限限制。当达到超时时,如果可能,运行将被终止,fmin()退出,返回当前的结果集。

spark_session SparkTrials使用的SparkSession实例。如果没有提供,SparkTrials将寻找现有的SparkSession

SparkTrials API也可以通过调用help(SparkTrials)来查看。

使用SparkTrials的示例工作流程

下面,我们给出了一个使用SparkTrials调优scikit-learn模型的示例工作流程。此示例改编自scikit-learn文档示例,用于带有MNIST的稀疏逻辑回归。

from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.utils import check_random_state

from hyperopt import fmin, hp, tpe
from hyperopt import SparkTrials, STATUS_OK

# 加载MNIST数据,并通过标准化特征对其进行预处理。
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)

random_state = check_random_state(0)
permutation = random_state.permutation(X.shape[0])
X = X[permutation]
y = y[permutation]
X = X.reshape((X.shape[0], -1))

X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=5000, test_size=10000)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 首先,设置scikit-learn工作流程,并将其封装在一个函数中。
def train(params):
  """
  这是我们传递给Hyperopt的主要训练函数。
  它接收超参数设置,根据这些设置拟合模型,
  评估模型,并返回损失。

  :param params: 指定要测试的超参数设置的映射
  :return: 拟合模型的损失
  """
  # 我们将调整两个超参数:
  #  正则化参数和惩罚类型(L1 vs L2)。
  regParam = float(params['regParam'])
  penalty = params['penalty']

  # 提高容差以加快收敛速度
  clf = LogisticRegression(C=1.0 / regParam,
                           multi_class='multinomial',
                           penalty=penalty, solver='saga', tol=0.1)
  clf.fit(X_train, y_train)
  score = clf.score(X_test, y_test)

  return {'loss': -score, 'status': STATUS_OK}

# 接下来,为Hyperopt定义一个搜索空间。
search_space = {
  'penalty': hp.choice('penalty', ['l1', 'l2']),
  'regParam': hp.loguniform('regParam', -10.0, 0),
}

# 选择一个搜索算法供Hyperopt使用。
algo=tpe.suggest  # 树状Parzen估计器,一种贝叶斯方法

# 我们可以通过不显式传递`trials`参数来在本地(仅在驱动程序机器上)运行Hyperopt。
best_hyperparameters = fmin(
  fn=train,
  space=search_space,
  algo=algo,
  max_evals=32)
best_hyperparameters

# 我们可以通过调用带有`SparkTrials`实例的`fmin`来在Spark集群上分布式调优。
spark_trials = SparkTrials()
best_hyperparameters = fmin(
  fn=train,
  space=search_space,
  algo=algo,
  trials=spark_trials,
  max_evals=32)
best_hyperparameters

人工智能与机器学习

概述

人工智能(AI)和机器学习(ML)是当今科技领域最热门的话题之一。它们不仅改变了我们与技术的互动方式,还推动了各个行业的创新和发展。

人工智能

人工智能是指通过计算机系统模拟人类智能的能力。这些系统能够执行通常需要人类智能的任务,如视觉识别、语音识别和决策制定。

应用领域

  • 医疗保健:AI用于诊断疾病、个性化治疗和药物研发。
  • 金融:AI用于风险评估、欺诈检测和自动化交易。
  • 交通:AI用于自动驾驶汽车和交通流量管理。

机器学习

机器学习是人工智能的一个子集,专注于开发能够从数据中学习的算法。这些算法通过分析大量数据来识别模式和趋势,从而改进其性能。

主要技术

  • 监督学习:使用标记数据训练模型。
  • 无监督学习:从未标记数据中发现模式。
  • 强化学习:通过试错和奖励机制学习。

未来展望

随着技术的进步,AI和ML的应用将变得更加广泛和深入。未来的挑战包括数据隐私、算法偏见和伦理问题。

关键挑战

  • 数据隐私:保护用户数据免受滥用。
  • 算法偏见:确保算法公平和无偏见。
  • 伦理问题:解决AI决策的道德影响。

结论

人工智能和机器学习正在塑造我们的未来。通过持续的研究和创新,我们可以克服当前的挑战,并利用这些技术为社会带来更大的利益。