原文作者:Charles Parker
原文地址:https://dzone.com/articles/machine-learning-automation-beware-of-the-hype
译者微博:@从流域到海域
译者博客:blog.csdn.net/solo95
最近围绕 “自动化机器学习”的讨论有相当大的热度。“自动化机器学习”的总体思路是,原本必须由机器学习工程师完成的工作可以实现自动化,从而将潜在用户从需要具备专业知识的必要前提中解放出来。
据推测,这种自动化的最终目标是让更多人能够使用机器学习。毕竟,如果一件事情能够自动完成,那意味着任何可以按下按钮的人都可以成功做到,对吧?
也有可能不会。博主会在这篇文章中提出一个包含三部分的论点,即“机器学习自动化”实际上仅仅是指使机器学习能够被任何拥有数据的人使用这一目标得以实现的一个差强人意的代理。此外,我认为更直接的途径是通过自动化和交互性的结合来实现,我们经常在软件世界中将其称为“抽象”。通过理解什么才是强有效的机器学习抽象,我们将以更好地方式去构想出创新的方法使得机器学习的使用门槛变得更低。
今年博主有幸在巴塞罗那参加了NIPS。尤其想指出的是,我很享受参加这个著名的NIPS研讨会,在该研讨会中,您可以看到机器学习研究领域的大量高质量的工作(成果)。我在NIPS期间参加的讲习班各有各出色表现,但结合起来看,它们相互之间会有点不和谐。
一方面,您能够参与到有希望将机器学习带离人类操作员的研讨会,并且这些研讨会能尽可能多地实现自动化。下面两个是我的最爱:
另一方面,您还可以参加几个关于如何进一步整合人员到机器学习管道的研讨会,可以通过将人类安插进学习过程或找到更直观的方式向他们展示他们学习的结果。
那么现在发生了什么?看起来我们希望机器学习是自动的。。。但我们同时也想找到让人类密切参与的方法?这两者同时存在是奇怪的一对想法。当然,人们希望事物自动化,但他们为什么还要保持参与度,那么这两个目标如何共存?
我所参加的他们的两个研讨会之间很好地提出并回应了这个话题。来自Twitter的Alex Wiltschko就使用贝叶斯参数优化来优化他们Hadoop作业的性能(以及其他方面)进行了一次有趣的演讲,他总体上提出了一个有关优化的很好的观点:如果有一种方法可以“欺骗”你的对象,那么对象的增加并不会让事情直观地变得“更好”,计算机会找到它。这意味着你需要非常仔细地选择你的对象,义使得数学目标总是符合你的直觉。在他的用例下,这意味着很多试验和错误,他与运行Hadoop集群的人进行了许多磋商。
在交互式学习的研讨会上,一个回应和例子来自“交互性鸿沟(interactivity divide)”的另一面。Emma Brunskill已经整合了一套系统,用来优化向年轻数学学生展示的教程模块(视频,练习等)。该系统试图优化的目标就像学生在期末测试中的表现。很简单,对吗?然而除了要教授的某一科目特别困难之外,通过很少的教程模块来提高学生的成绩也一样十分困难。这项优化进行到最后,让人感觉徒劳无获,于是他们立即决定再也不碰教学这个课题。这个答案当然不会令人满意,课程在优化上应该是一个约束 ,而不是优化的结果。
但最重要的是,如果没有人类操作员去输入指令,计算机就无法了解当前状况;人也不知道哪些地方是机器需要知道的,除非人就处在整个处理流程之中。(这段没有翻译原文,译者直接用中文把作者的意思叙述了一遍,原文表达混乱。)
这就是交互性和自动化之间的紧张关系。
一方面,人们希望并需要将机器学习的许多繁琐而且不必要的细节自动化; 但通常这些细节需要专业知识和/或资本才能适当地解决,这最终成为自动化实行的障碍。
另一方面,人们仍然希望并且客观上也需要与机器学习(过程/模型)进行交互,以便能够理解“机器”学到了什么,并且如果最初的结果并不令人满意,也可以引导学习过程以取得更好的结果。重要的是,我们不需要引用类似luddite等不令人信服的技术来解释这种观点。现实情况是,人们应该对机器学习算法得出的第一个结果持审视的态度,因为计算机试图优化的数值对象经常与实际对象不匹配。一旦人和机器在问题的本质上达成一致,机器学习的效果就会非常好,但它有时需要几轮互动才能达到需要的精度。
换言之,我们不需要“自动”的机器学习。我们所需要的机器学习,人类操作它起来应该是舒服和自然的。通过自动化消除耗费人力的细节只是这个过程的一小部分。
如果你在软件领域工作,这听起来很熟悉,那是因为我们一直都是这样希望的。
在软件世界中,我们经常讲抽象(https://en.wikipedia.org/wiki/Abstraction_(software_engineering%29)。一个好的软件库或编程语言将会隐藏对用户来说的不必要的细节,仅以自然的方式暴露操作软件所必需的交互模式。我们称库或语言是底层软件的一个抽象层。
对于那些不熟悉这个概念的人,可以考虑一下C语言。在C中,我们可以写出如下的语句:
x = y + 3
C编译器将此操作转换为机器码,这需要知道x和y变量在内存中的位置,将这些变量加载到寄存器,并将"3"的二进制值加载到一个寄存器中,将这些值加到另一个新的寄存器中,产生一个新的变量,等等。
编程语言隐藏了机器代码和寄存器,所以我们可以根据操作符和变量来直接思考高层次问题的原语。此外,它暴露了一个接口(数学表达式,函数,结构等),相较于直接操作底层来说,它使我们能够以更有用和更自然的方式操作底层。从这个意义上说,C语言是一个非常好的抽象:它隐藏了很多我们几乎从不关心的事情,并以一种更易于使用的方式公开与这些事情所相关的功能。
在考虑压缩算法时用相同的方式去思考抽象是很有帮助的。它们(指算法,后同)可以是“强大的”,为此它们隐藏了很多细节,或者是“弱小的”,因为它们隐藏很少。它们也可能是“非常易损”的算法,因为它们暴露出糟糕的接口,至于“无损”的算法,它们暴露出的接口可以完成所隐藏细节能做到的一切。创建良好抽象的困难之处与创建一个好的压缩算法非常相似:您希望尽可能多地隐藏对用户而言不重要的细节,同时尽可能少地隐藏那些相同用户想要查看或使用的细节。C语言作为对机器代码的抽象而言是非常强大的(几乎隐藏了机器代码的所有细节)并且几乎没有损失(您可以直接通过C语言执行机器代码中绝大多数的事情) 。
聪明的读者可能会看到我们对机器学习的相同的看法。我们在隐藏苦差事(指使用机器代码等底层操作)和复杂行之间存在着同样的紧张局势,同时仍然需要在工具和用户提之间提供有用的交互模式。那么,谈到这里,“机器学习自动化”代表了我们发明的抽象尺度吗?
NIPS展示的一些自动化问题(实际上在整个行业中都)存在的问题(正如我所看到的那样)是有人使用抽象语言来吹捧它们。经常有人声称这种软件会“自动化数据科学”或“允许非专家人员使用机器学习”等。这正是您可能会提起的关于C语言的内容; 它“自动生成机器代码”或“允许不知道程序集的人编程”,而且你可能是对的。
作为一个我发现为什么这会有点不诚实的例子,请考虑使用贝叶斯参数优化来调整机器学习算法的参数,这是我最喜欢的新技术之一。这是一个好主意,机器学习社区的人们普遍喜欢它,它当然有能力从现有软件中生成更好的模型。但是,在避免苦差事(底层操作)和保证暴露出的接口质量的基础上,它能有多好呢?
换句话说,假设我们在scikit-learn(以及有一些人已经做了)的基础上实施了一些这样的参数优化。现在假设有一个用户想要在CSV文件中的数据上使用它来训练和部署模型。以下是她担心的其他的一些细节的示例:
当然,这些东西的规模会变得更加复杂,他们也会这样做:
这就是我为什么说机器学习自动化往往是弱抽象的:它们隐藏了很少的细节,并且几乎没有提供有用的接口。而且它们通常不会使机器学习变得更加容易使用。当然,它们可以防止你手工拟合几十个参数,但是学习算法已经可以适应数千个参数。在这种情况下,自动参数调整,算法选择或预处理似乎并不像突然就可以让该领域变得非专业人员可用那样。
另外,根据我们上面的定义,抽象也是“有损”的; 它隐藏了一些参数,但通常不会为人们与最优方案进行交互提供任何自然的方法。解决方案有多好?它与用户内部所代表的“好”概念相匹配的程度如何?你怎么修改它以做得更好?所有这些问题都没有答案。估计你会相信结果。正如我刚才所说,这可能不是一个好主意。
那么,为什么我要批评贝叶斯参数优化?我说我觉得这很厉害,而且我真的这么想。但我不认为这(贝叶斯参数优化)将会让大众接触到机器学习。为此,我们需要适当的抽象; 这些抽象层隐藏了来自用户的上述细节,同时为他们提供了新颖且有用的方法来与算法协作。
这是我们创建WhizzML和Flatline的原因之一,我们的DSL用于机器学习工作流程和功能转换。是的,你必须学习使用它们的语言。但是一旦你去这样做,你就会意识到编程语言是对上述问题的强烈抽象。硬件,软件和扩展问题不再成为问题,因为所有事情都发生在BigML维护的基础架构上。此外,您可以使用BigML接口于任何通过脚本中创建的资源进行图形化交互。
使机器学习更容易被任何人使用是一个很好的目标。当然,有很多机器学习子任务可以承受自动化,而更易于访问的机器学习的一部分途径可能是“一键式”自动化。然而,我猜想,更大的部分(指机器学习自动化)是需要进行抽象的; 以直观的方式展示人们希望和需要的与机器学习交互的方式,同时隐藏不必要的细节。那些研究社群自动化和交互性都想要是正确的:如果我们聪明,小心,我们真的可以实现两种方式(自动化和交互性)同时拥有!