今天,我想讨论最简单的人工智能类型——没有神经网络的机器学习。
为什么?
因为它将永远改变软件的创建方式。
让我们把几件事弄清楚。虽然神经网络、深度学习、机器学习和人工智能似乎都是一样的,但它们都有各自的历史、起源和等级制度。
好在多数术语实际上都有其逻辑。简单地说,人工智能是能够自己做出决定的系统。基于意图和目的,考虑到过去三十年的研究和进展,你可以安全地交换这两个术语。人工智能中几乎所有有趣的东西都与机器学习有关。
幸运的是,机器学习是不言自明的。你可以教机器如何做出决定而不是直接告诉他们答案。
· 分类可以教算法将现有的数据分割成类,比如动物的名字。然后当你给它新的数据时,它会告诉你它属于哪一类,比如说这是一只鸡而不是一只狗。
· 回归算法基本上是通过根据过去的数据预测未来的数据来学习数据集的功能。与Excel中的“回归线”完全一样,但有多种用途。
· 无监督学习如果你有大量的数据而你无法理解它,你就可以使用它,所以你教机器试着去理解它。
· 强化学习是学习如何在围棋和国际象棋之类的游戏中击败地球上的每一个人,或者驾驶自动驾驶汽车和无人驾驶飞机。
虽然后两者得到了很多媒体的关注,但前两个是当今盈利最多的领域。所以我们要把注意力集中在他们身上。回归是试图了解你的情节中的点是如何相互关联的。分类是相反的,并试图将你的图中的点分成几个组。有很多方法可以做到这些,而神经网络只是其中之一。所以,在我们开始实际的工作之前,让我们把它弄清楚。
神经网络和相关的学习算法占据着一个特殊的位置,因为它们受到大脑的启发。我们知道,神经元是连接在我们大脑内的巨大网络中的,而电信号从神经元中传递出来,产生我们所有的意识体验。看、听、想、说,所有神经网络都在起作用。
一个简单网络和一个深层网络之间的区别是额外的神经元层。
实际上,这些层的功能是引入额外的复杂性。否则,你只能做一些简单的事情,比如把数字相加在一起。但是当你把这些网连接到数百甚至数千个神经元的几层时,它就变成了魔法。
它可以通过一个名为“反向传播”的学习过程来学习几乎任何东西,该过程首先比较预测与预期结果的距离。然后,它在整个网络中做了一系列微小但经过仔细计算的变化,然后再次尝试,看看它是好还是坏。真正的解释不仅仅是高中数学,还包括从输出到输入的偏导数的计算。
它能有什么魔力?它能辨认笔迹,它能识别图片中的物体,甚至下棋。魔法还意味着我们不能百分之百地确定里面发生了什么。只要在其中一条连接的线路上更改一个值,整个输出就会发生变化。为什么会起作用?什么时候起作用?我们如何找到最好和最快的方式来训练网络?
在左侧,你会看到三个具有白色背景的数据集。从左到右,每列代表一种机器学习算法,试图将蓝点与红点分开。这称为分类。请记住,我们已经告诉每个算法每个点的颜色。这就是所谓的训练数据。它只是试图创建一个区域蓝点进入的规则,以及红点进入的区域。正如你所看到的,结果可能会有所不同。
你可能会注意到,右边第四个神经网络正在做一些有趣的事情。对于每个数据集,它会做一些完全不同的事情。这是怎么发生的?
为了真正说明这一点,上面的图片只是一个有三个不同数据集的神经网络。这次,列表示更改网络的一个设置,称为“超参数”。即使如此,你也会得到截然不同的结果。
神经网络本质上是不可预测的,所以他们才这么强大。
1. 它们很复杂,为它们的设计作出明智的决定需要较高的数学技能,大多数人还没有。
2. 它们是不可预测的,所以你必须摆弄,才能让它发挥作用,即使你知道你在做什么。
3. 除非你尝试了很多不同的事情,否则很难说你是否做了正确的事情。
4. 即使有许多方法来衡量你的网络有多好,也很难理解如何解决任何问题。
5. 做出以上决定可能需要很多尝试,而每一次尝试都需要花费大量的时间和金钱。考虑每一批培训完成后的几个小时或几天的等待时间。
正如你前面所看到的,有许多选择。我将重点讨论这两种方法,它们通过两种非常不同的方法给出简单和可预测的结果。为什么?因为大多数情况下,其中之一会很快解决你的问题。这两种方法都可以用于回归和分类,这取决于你的问题。同样,我会选择专注于分类,原因我稍后会解释。
观察数据科学竞赛(如Kaggle)获奖作品的轶事证据表明,结构化数据最好用XGBoost和Random Forests等工具进行分析。在获奖作品中使用深度学习仅限于分析图像或文本。
神经网络和其他机器学习方法的区别它们学习的方式。正如我们前面所看到的,神经网络可以猜测出它们的最佳解决方案。他们会考虑你给他们的数据,并使用各种各样的数学优化方法来简单地找到一个最好的答案。这些方法训练速度快,执行速度快。
尝试分离数据集的最符合逻辑和最简单的方法是使用标尺绘制一条直线。这是支持向量机(SVM)所做的,该算法试图找到最佳的单条直线来分隔数据集,然后在这条线周围设置一个缓冲区,以尽可能地分离数据集。
你可能会发现,最初的支持向量机算法是在1963年发明的,早在人工智能诞生之前几十年就已经发明了。许多变化包括非线性求解器,它可以绘制多项式分离线,甚至是径向区域,即不是直线,但我们确实希望保持它简单易懂。
决策树根据数据集选择最能预测结果的变量和值。它试图“切割”你的数据点,在其值中的某些范围内分离变量。一旦它进行了切割,它就会移动到剩余的可用变量并尝试执行相同的操作,同时尝试尽可能少地进行切割以保持简单。结果就像在你的数据上拟合矩形俄罗斯方块一样。
甚至比这更好的是,有一个名为graphviz的免费工具可以生成所得算法的直观表示。你可以检查逻辑,并100%确定你知道它的作用和时间。
决策树的一个有用的变体是随机森林,它在输入数据的子集上运行一组独立的树解决方案,并给出一个平均值。在上面的大分类器比较图中,将它们并排比较,你就会看到这个想法。还有一组超级高效的增强树算法。
如何创建软件
首先,让我们确定今天大多数软件是如何创建的。软件是基于规则的。这意味着你定义了一组关于事物如何工作的规则,然后软件就会一遍又一遍地做同样的事情。
这是现代软件中常用的典型结构。你有三种代码。一个显示事物(视图),一个定义事物(模型),一个决定两者之间发生的事情(控制器)。在这种结构中,有两种方式强加显式规则:模型本身和控制器的“业务逻辑”。商业逻辑是一个奇特的词,“如果发生这种情况,那么就这样做”。
模型盒里装的是有固定关系的固定模型。这就是为什么软件是难以创建的,因为你必须把它全部绘制出来。随着自由度降低到零,创新速度会随着迭代和版本的推移而减慢。
人工智能(A.I.)和M.L.(M.L.)这两个词已经被过度使用,以至于现在大多数人嘲笑任何一个说这两个词的人。事实上,有一种合法的方法可以在任何软件中撒一点人工智能。
停止编写规则,让你的软件学习它们!
什么是逻辑?什么是决策?它将许多输入连接到许多输出,也称为多类分类。为达此目的,什么是一个很好的算法?什么允许你训练数据而不是定义代码,但是简单易懂?决策树是如何工作的?
要使用scikit-learn训练任何分类器,你需要两行代码。
classifier = sklearn.tree.DecisionTreeClassifier()
classifier = clf.fit(inputs, outputs)
最重要的是它可以用一行代码代替复杂的逻辑和建模工作。一旦你训练了一个模型,它就是这样工作的:
output = model.predict(inputs)
或者,你可能希望获得一组输入的所有可能输出的概率分布。正如你所看到的,这要难得多。
outputs = model.predict_proba(inputs)
如果你有新的数据,或者需要替换模型,你必须更改一个文件。
那么你可以把什么样的数据输入到这些分类器中呢?下面是一个简化的例子。让我们想象一下,你的应用程序正在根据用户的喜好推荐用户应该购买的宠物。你可能会询问用户希望宠物具有的特性,并对模型进行培训以产生推荐。输出将取决于你拥有多少数据,以及你希望建议的具体程度。不必使用复杂的JOIN语句返回完全匹配的数据集的数据库模型,你可以在一行代码中返回前3种最可能的选择。
例子:简单的输入,几百个数据点。
在大多数情况下,你的数据不会那么简单,并且输入不会统一为仅为是/否,可以转换为1和0。因此,你可能需要调整你的数据,使其成为分类器可以学习的内容。你可以手动执行一些操作,将字符串转换为数字类,或者运行自动算法对数据进行编码,例如一个热编码器。由于训练试图在你的数据中建立关系,使数字更容易关联将有助于获得一个更好的结果。
简单的例子:许多不同格式的输入,数千个数据点
因此,你可能对如何生成这样的培训数据有疑问。我是说,谁有资格说什么是正确的行为?如果你有输入标签但没有输出标签怎么办?当然,这完全取决于你要解决的问题,但答案可以从创建和标注你自己的数据,到找到现有的研究数据,甚至抓取现有的数据库或网站,比如维基百科等网站。
传统上,采用人工智能的挑战之一是需要在后端运行这些模型。首先,你需要一个实际的后端服务器,这通常意味着学习一种不同的编程语言,以及托管的麻烦和成本等等。其次,这意味着这些模型只能在连接到服务器时才能运行。例如,如果它是应用程序的核心功能,那么它只能在线工作。
苹果公司第一次将CoreMLSDK作为iOS 11的一部分来解决这个离线问题。你所需要做的就是将现有模型转换为CoreML格式,你可以将其拖放到XCode项目中。从那里,模型将为你生成一个类API,你可以按如下方式调用它:
guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {
fatalError("Unexpected runtime error.")
}
有传言称,包括苹果在内的几家公司将致力于为下一代设备开发专用人工智能芯片,这样就可以在你自己的设备上快速执行复杂的神经网络了。
1. Scikit-学习教程是个很好的起点。所有这些都是用Python编写的,因为Python是最容易掌握的语言。
2. 如何运行不同的分类器并在2D中可视化结果。
3. 如何使用CoreMLSDK将机器学习添加到iOS应用程序中。
4. 如果你想从一本书开始,推荐这本关于scikit-learn和Tensorflow的入门指南。
原文标题《How Machine Learning is changing Software Development》
作者:Aki Ranin
译者:lemon
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。