使用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)这样的自适应算法,这些算法会迭代地探索超参数空间:每个新测试的超参数设置将基于之前的结果选择。在1
和max_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决策的道德影响。
结论
人工智能和机器学习正在塑造我们的未来。通过持续的研究和创新,我们可以克服当前的挑战,并利用这些技术为社会带来更大的利益。