调整超参数对于优化机器学习模型至关重要,但这一过程计算量巨大且十分复杂。传统的网格搜索、随机搜索甚至贝叶斯优化方法常常会忽略超参数空间中的关键区域,从而导致模型并非最优。
本次演讲中,我们将展示我们开发的一款 JMP 插件,该插件利用空间填充式实验设计 (DOE) 来更高效地解决超参数调优难题。空间填充式 DOE 的使用确保了超参数组合在整个参数空间内更均匀地采样,从而减少了所需的评估次数,同时提高了找到最优设置的概率。
本次演讲还将重点介绍 JMP 18 中与 Python 的改进集成,以及如何利用 JMP 内置的 DOE 等功能来帮助数据科学家。本次演讲将先进的统计技术与实用易用的工具相结合,以提升模型在各种应用中的性能。
大家好,感谢各位莅临本次讲座。本次讲座的主题是利用空间填充设计来调整超参数,从而改进机器学习。我是 Peter Hirsch,我的合作演讲者是 Scott Allen。在详细介绍我们改进机器学习的方法之前,我想先分享一些研究成果。
这里有两个参赛者,他们的挑战是构建 10 个预测模型。每个预测模型都是针对分类响应变量的。如果我们看一下这两位参赛者的背景,一位是世界知名的数据科学家 Russ Wolfinger,另一位则并非世界知名的数据科学家。这就像我和迈克尔·乔丹一对一打篮球一样,结果很可能一边倒。
正如你所见,最终结果非常接近,而且那些并非世界知名的数据科学家实际上取得了更好的结果。这怎么可能呢?Torch Companion 插件是我的秘密武器。这个插件帮助我们所有人提升了建模结果,这就像在单挑篮球赛中拥有勒布朗·詹姆斯这样的队友一样。
我想先做一个非常简单的测试。当我们观察这张图片时,我们看到的是猫还是狗?再看看另一张图片,我们看到的是猫还是狗?很简单,我们可以看出左边是狗,右边是猫,但是我们如何确定图片中的动物是猫还是狗呢?关键特征是什么?如果我们要构建一个模型,该如何训练它来识别猫还是狗呢?这里有一张图,它直观地展示了神经网络的构建方式。在这个例子中,图片是一个手写的数字“4”,它被分成三层,每层有四个节点。
每个节点对原始输入都有不同的表示,这些节点和层组合起来用于预测。每个数据集的复杂程度可能不同。例如,上面的例子,仅仅识别一个点是绿色还是红色,可能比下面的例子(例如,识别狗或猫的图片)简单得多。后者可能需要更复杂的模型。层数、层大小或每层的节点数被称为超参数,需要进行调整才能优化每个模型。
我们如何调整模型来解决不同的问题?这里是 JMP 中 Torch 调优插件的启动窗口,里面有很多不同的选项。我们可以调整诸如训练轮数、学习率、层大小、激活函数等参数。有了这些选项,我们可以运行数百万种不同的组合。那么,我们该从哪里开始呢?
在探索超参数空间时,我们可以采取几种方法。第一种是网格搜索,我认为这是最常用的方法,或者说与全因子设计最为接近。如果我们采用这种方法,我们会考察所有因子的所有可能组合,这将导致我们需要运行超过两百五十万个不同的模型。在大多数情况下,这数量太多了。我们也可以进行随机搜索,即随机选择一些因子组合进行运行。
我们还可以采用贝叶斯优化方法,或者可以咨询 Russ Wolfinger。当然,如果你能随时联系到 Russ,或者找到其他和 Russ 水平相当的数据科学家,那就太好了,但这并非总是可行。我和 Scott,或者一个普通的实验人员,该如何解决这个问题呢?我们把它当作一个实验来处理。在 JMP 中,我们该如何进行实验呢?是每次只考虑一个因素吗?不,Drake 认为这不是个好主意。我们应该设计一个实验。接下来我们会简单讨论一下这种方法,然后我把话筒交给 Scott。
谢谢,Peter。接下来我们会一起了解一下这个 Torch Companion 插件的组成,展示一些示例,然后稍微实际操作一下。在此之前,我先简单介绍一下这个插件包含哪些内容。
这个插件实际上是将 JMP 的许多不同功能整合在一起,例如表格函数、DOE 平台、Russ 和他的团队开发的 Torch 深度学习插件,以及一些图表构建器输出。虽然这些功能您或许可以单独完成,但这个插件旨在打造一个无缝的工作流程。与许多 JMP 平台类似,用户需要指定列,这些列可以作为响应、因子和验证条件。然后,您需要指定 Torch 参数,或者在本例中指定参数范围或不同的选项,并将这些参数传递给 Torch 插件。我们想快速浏览一下这些界面。
列对话框与标准 JMP 平台中的对话框非常相似,您可以在其中加载响应列、因子列和验证列。因子列可以是数值型、字符型,也可以是图像模型(在本例中)。我认为 Torch 插件为 JMP 带来的一个独特功能就是能够查看图像模型,因此我们也确保将此功能集成到这个配套插件中。单击“确定”后,您将进入规范窗口。我们与 Russ 就此进行了一些讨论,以获得一些指导,了解应该包含哪些参数,以便筛选出最接近最优的模型。
本文的目标是将 Torch Companion 与 Torch Deep Learning 插件结合使用。我们并未列出所有可能需要调整的参数,但实际上,这将帮助您更高效地接近最优模型。我们可以调整模型类型(例如表格模型或图像模型)以及一些相关的调整参数。我们还可以查看不同的模型结构参数选项,特别是 DOE 试验次数。这样,您就可以摆脱每次只运行一个模型、一次只调整一个因素的繁琐方法,只需设置一系列参数,即可一键查看 200 到 300 个模型。
你会注意到这里有些选项是灰色的。我们希望这款插件能够方便Torch新手或机器学习新手使用,所以我们设置了一些限制条件。我知道Peter在开发过程中也很喜欢这些限制条件。
是的,它确实能让我保持专注。这很有帮助。
如果您不熟悉这些不同类型的模型,我们预先选择了一些最常用的模型和一些不错的起点。如果您想使用此插件筛选参数,可以选中“筛选参数”复选框,然后就可以查看一系列参数了。同样,我们会将一些可能并非最佳的选项灰显,这些选项会根据您的数据表而有所不同。我们还筛选了一些更常用的激活函数,并将其中一些参数设置为按 2 的幂次方缩放,这有助于您更高效地筛选各种参数,例如图层大小。
我们还想在这里添加一些高级选项。如果您选择高级选项,您将可以访问 Torch 插件中所有可用的模型类型、表格模型类型以及所有可用的激活函数。根据您对 Torch 深度学习的了解程度,您可以选择简单的路径,也可以选择高级路径。让我们来看一个例子。在这个例子中,我预先加载了一些不同的选项,包括一系列的训练轮数和学习率,选择了一些层大小,并将次数设置为 100。您可以根据需要设置任意次数的试验。
设置好所有参数范围后,点击“运行”。点击“运行”后,我们就进入了插件的后台运行。点击“运行”后,它会在进行一些表格操作后生成空间填充图。然后,它会将空间填充设计表中的每一行传递给 Torch 深度学习。实际上,在正式开始之前,我已经启动了一个模型。您可以看到我设置了运行 500 个 Torch 模型,并且可以看到它一直在运行,就像我们刚才讲解的那样。它正在遍历空间填充设计表中的每一行,让我们大致了解损失函数随训练轮数的变化情况,从而判断我们选择的参数是否合适。我们将继续讲解,稍后再来查看结果。
Torch深度学习插件运行后,完成所有模型的构建(无论是您指定的数百个、数十个还是其他数量),它会使用一些额外的表格函数和图表构建器来汇总结果,然后提供一个输出或报告窗口供您解读这些结果。根据解读结果,您可以选择两条不同的路径。一条路径会带您回到参数设置阶段。也许您没有得到任何令人满意的模型,也许您认为这些模型还有改进的空间。
您可以设置新的参数范围,选择不同的函数,然后重新开始循环,这样新结果就会添加到原始结果中。或者,您可能找到了一些非常优秀的模型,您对此充满信心,认为无需进一步改进。现在,您可以将这些模型直接导入 Torch 深度学习插件,以便进行更深入的模型优化;或者,您可以比较、保存并部署这些模型;或者,您可以调整在配套工具中无法调整的参数。这就是我们设计的流程,整个过程很有趣。不过,我必须说,Peter 才是模型构建方面的主要贡献者。Peter,也许您可以分享一下您的使用经验。
我想,如果这里有软件开发人员,你们可以把 Scott 看作是插件的开发者,而我是测试人员。我想到几点。这是一个实验设计(DOE),而 DOE 通常是一个迭代过程,我们先进行一次 DOE,从中学习,然后在此基础上构建一个可能更优的 DOE。如果我们看一下我从几个模型中得到的结果,你会发现大多数情况下我运行了不止一个 DOE。通常,这些模型运行速度非常快,只需几秒钟,因此可以运行大量的模型。有时运行时间会更长,需要运行多个 DOE,而且一开始肯定不想运行 100 个。比如,看看上面的第一个模型,那是一个图像模型,每个模型大约需要 10 分钟才能运行完毕。
如果你一开始就创建 200 个模型,那你可能要等到周末才能看到结果。但如果你看看其他一些模型,就会发现如果每个模型运行时间都只有 4 秒,那么运行 200 个模型可能稍微好一些。这里有几点建议。我喜欢先使用留出交叉验证集,因为这比 K 折交叉验证快得多。当你真正开始使用 K 折交叉验证时,如果你喜欢这种方式,最后在 Torch 中运行模型时,你可以切换验证列,但我认为在进行模型调优时,我更喜欢使用单一验证集。
另外,我很喜欢Scott内置的时间检查功能。如果你担心某个模型(比如图像模型)可能需要很长时间才能完成,你可以让调优插件帮你检查。
好的。谢谢你,彼得。我敢说,除了 Rust 之外,你在 JMP 制作的火炬模型数量可能是所有人中最多的。
绝对是表现最差的那些。
我们换个角度,进入插件,展示一些报告,以及如何筛选和优化这些模型。我们再来看看我们的模型。还没完全完成。我们只得到了大约 270 个,而我们指定的是 500 个。
另一个内置功能是取消操作。您可以取消当前操作,原因可能有很多。例如,运行时间超出预期,或者时间紧迫。无论是什么原因,您都可以取消。当您接受 torch 错误时,系统会提供选项,让您选择继续进行下一次运行。例如,您可能正在运行图像模型,所有模型都运行得很快,但之后遇到一个耗时很长的模型。
你可以继续进行DOE实验,直接跳过当前实验,进行下一个实验;或者你也可以完全停止运行DOE实验,我们这里就选择后者。程序会停止运行,然后生成报告,报告窗口现在就在这里。这就是报告窗口。我们的DOE实验共有500个实验,但你可以看到,我们已经得到了其中270个实验的结果。
接下来,我们将查看这个结果表格,我将引导大家了解一些最重要的元素。首先是汇总统计信息。该表格按验证 R 平方值排序,因此验证 R 平方值越高,行号越低。然后,您可以访问所有不同的参数设置、不同的输入以及一些输出,例如模型运行时间以及目前已运行的 DOE 数量。
首先,你可以查看 R 平方热图。它实际上就是将验证集的 R 平方值与训练集的 R 平方值绘制在一起。当然,你肯定希望模型在验证集和训练集上都具有较高的 R 平方值,但你也能看到这里 R 平方值的范围很广。如果你是 Torch 新手或机器学习新手,这一点尤其重要:如果你不确定应该设置哪些参数,那么你得到的模型可能就只有 R 平方值这么低。你可能会想,我恐怕真的无法构建一个好的模型了。
然后你调整一些参数,结果可能反而更糟。我们可以看到,当你筛选一系列参数时,就能更清楚地了解该模型的潜力。在这个例子中,我们可以看到一些模型表现相当不错,验证集和训练集的 R 平方值都很高。虽然有一些内置的数据过滤器,但这些都只是在图表构建器中,所以你当然可以随意使用这些数据绘制图表。还有两个标签页分别用于查看各个参数,例如模型调优参数(如学习率和训练轮数)及其随时间或模型空间的变化趋势,以及激活函数和其他层结构参数。
你可以考虑扫描多种不同类型的激活函数。我知道,彼得,你在运行这些模型时发现了一些有趣的结果。
当然。我们刚开始开发这个插件的时候,Russ 建议我们先用 ReLU 激活函数。ReLU 是最常用的,几乎人人都用,是个不错的起点。有些情况下 ReLU 的确表现不错,但大多数情况下,我们发现其他激活函数的效果更好一些。倒不是说 Russ 的方法不好,只是能够研究所有这些激活函数,看看能否通过调整参数获得更好的结果,这确实很有帮助。
不。我认为这确实是我们的一个目的:如果您不了解这些激活函数,或者即使您了解,也可能根据经验知道哪些函数适合某个数据集或模型类型,但如果您不了解,那么这个功能就能帮助您快速浏览所有激活函数。在这个例子中,我们浏览了其中的六个函数,但实际上还有 20 个函数可供您参考。
我们还有一个参数重要性输出。这实际上只是快速构建一个自助法森林模型,以显示哪些超参数或调优参数对响应(在本例中为验证集的 R 平方值)的影响最大。此外,我们还提供了各个模型的详细信息。您会注意到结果表中有一列提供了唯一的模型 ID,因此如果您想深入了解任何模型,只需打开该列即可。这只是 Torch 运行时导出的数据,因此即使我们基于验证集的 R 平方值汇总了所有信息,您仍然可以访问所有模型的详细信息。所有模型的汇总统计信息都可用。
我想报告窗口的内容基本都涵盖到了,最后再总结一下插件的几种不同工作流程选项。第一种是重新运行。在这种情况下,我们可能对某些模型的结果感到满意,但我们可以查看使用了哪些激活函数,也许我们想要增加层数或层大小,所以我们可以返回到之前的规范,并筛选出特定的函数。
也许我们只想查看这三个模型,但也可能想查看更大的图层尺寸。那么,我们可以指定,比如只查看 50 个图层,然后点击“运行”按钮,运行选定的参数序列,然后再运行另外 50 个图层,并将结果添加到表格中。这是一种可以考虑的工作流程选项。另一种是红色三角形中的一些选项。也许您对这个模型或这两个模型感到满意,并希望将它们导入 Torch 插件直接运行。
您无需来回切换并记住每个参数设置,然后手动输入到 Torch 插件中。只需点击红色三角形,然后选择“运行所选模型”。点击“运行所选模型”后,它会将这些参数传递给 Torch 插件并运行,然后在 Torch 插件中生成报告。现在,我们可以查看这些模型的对比情况。可以看到,我们已经传递了所有相关的参数,现在我们可以更直接地比较最佳拟合模型,并更好地了解这些汇总统计信息。
最后,也许你的模型运行时间很长。在这种情况下,你可能无法在一天内完成所有调优工作。如果你想保存结果并稍后继续,可以点击红色三角形,我们将保存此结果的数据表。保存后,我可以将其保存到任何我想要的位置,然后稍后重新加载。接下来,我们将演示如何操作。
我要关闭这个窗口,点击确定。现在,如果我想重新加载已保存的数据表,我会返回到我之前的原始数据表。这是我之前用于建模的数据表。我要运行插件(也就是配套程序),然后点击“调用”。你只需要确保输入正确的列,也就是你在调优时指定的列,然后点击确定。现在,我们不用在这里指定所有不同的参数,只需点击“加载”按钮即可,我之前没有打开这个按钮。
我们来这里,进入调优结果页面,然后点击“打开”。此时会弹出一个对话框,提示我们 x 轴变量、y 轴变量和验证列都与之前相同。如果其中任何一项与您最初运行的参数不匹配,则不会加载。点击“确定”后,我们将看到之前的调优运行结果,并且所有图表都会重新生成。您可以返回到设置页面,然后重新运行这些调优。
我想这就是我想展示的全部内容了。Torch 插件里还有一些其他选项,我真心希望大家能将它与 Russ 和他的团队开发的 Torch 深度学习插件结合使用。我相信,一旦您开始使用它,就会发现其中还有一些其他有用的功能。现在,或许我可以把话筒交给 Peter,让他谈谈一些结果,或者说最终结果。
听起来不错。谢谢,斯科特。这里红色部分是我模型验证得到的R平方值,蓝色部分是拉斯模型的验证结果。我这么说并非贬低拉斯。拉斯是一位优秀的数据科学家,但我认为这更多地体现了实验设计(DOE)的优势,而非一次只考虑一个因素。
这表明,如果让化学家和数据科学家分别运行模型,并使用实验设计(DOE),化学家可以取得与优秀数据科学家类似的成功,甚至可能做得更好。调优插件赋予了所有人这种能力,正如Scott所说,它并非旨在取代Torch插件,而是与Torch插件配合使用,并且将在应用商店上架。您可以同时获取这两个插件。
我给自己颁发了一枚奥运奖牌,因为我打败了Russ,我觉得这对任何人来说都是个相当不错的成绩,尤其对于一个没有数据科学背景的人来说更是如此。我们一开始讨论的是识别猫狗,但如果从你的实际工作角度来思考,你会发现有很多不同的图像模型,甚至是表格模型,你都可以使用这种深度学习神经网络方法,而调整这些超参数可以帮助你获得更好的结果。
这些图片来自 Torch 插件故事书中的一些示例。我认为每个人都有类似的数据,可以应用这种方法。当然,我们也要感谢 Russ。我知道我们之前有点“刁难”他,但他在开发这个插件的过程中也给了我们很大的帮助,帮我们设定了一些规则,让我不至于手忙脚乱。当然,还要感谢 JMP 指导委员会选择这次演讲。正如我们之前提到的,Torch 插件和 Tuning 插件都可以在应用商店下载。如果您想下载,可以扫描这里的二维码,或者直接访问 marketplace.jmp.com。谢谢。
谢谢。