机器学习和人工智能 (ML/AI) 对不同的人意味着不同的事物,但最新的方法有一个共同点:它们都基于这样的理念,即程序的输出应该主要从高维且可能巨大的数据集自动创建,并且几乎不需要或不需要人的干预或指导。开源工具被用于各种机器学习和人工智能项目中。在本文中,我将概述当今机器学习的现状。
过去,人工智能程序通常被明确编程来执行任务。在大多数情况下,机器的“学习”包括调整一些参数,引导固定的实现将事实添加到其他事实的集合(知识数据库)中,然后(高效地)搜索知识数据库以找到问题的解决方案,形式是从一个已知的解决方案到下一个解决方案的许多小步骤的路径。在某些情况下,数据库不需要或无法显式存储,因此必须重建。
一个例子是对象/场景操作,例如“拿起红色石头并将其放在黄色石头上”,其中包含隐式信息(例如,红色石头在蓝色石头下面)。这个世界的可能变换是给定的;这取决于人工智能程序找到从开始到结束的解决方案。
另一个例子是驾驶汽车。人工智能被赋予特定的边界条件,并表达可能的动作(转向、制动、加速)。对于给定的动作,有一个起始位置、一个结束位置和边界条件,这取决于人工智能来处理它。例如:“向右转 90 度,在前方和右侧 50 米处结束,行驶速度不超过 15 公里/小时,减速度不超过 10 米/秒2。”
这些是搜索和优化问题,解决它们不一定是人工智能或学习程序。学习的核心部分——以及使其有趣的原因——是如果存在一组规则,它们是大量的。但有时不存在规则,这只是程序中的各个步骤是否可能且有用。这些类型的问题无法真正用旧式人工智能程序解决。
新方法
新的 ML/AI 方法不是依赖于大量的规则,而是提供一个起始状态,基于问题存在的宇宙和特定目标(如果存在),然后让学习过程找出中间状态以及如何从一个状态进展到下一个状态。内部状态和转换(我们称之为模型)是在统计学的帮助下开发的。(顺便说一句,我认为当今 ML/AI 的更好名称是统计学习。)问题越复杂,公式中的(内部)变量就越多。
这一切都相当抽象,所以让我们看一些例子。
示例 1:图片集合被标记为猫、狗或布丁。在学习阶段之后,程序有望正确分类它以前未见过的图片。
很难设计一种算法,从图片中提取特征,作为搜索算法的输入。手工设计和实现几十个以上的特征在逻辑上是不可能的,而且这些特征可能不足以使用。
统计方法可以使用大量(简单)函数和更大数量的变量。函数的输入可以是大量的——可能是图片中每个像素的值。任务是确定所有变量的适当值,以确保对所有函数结果的解释与给定的标签匹配。
使用这种方法,没有人需要理解中间状态的内部规则以及如何从一个状态到下一个状态。唯一重要的是结果是正确的,并且可以设计一种算法来有效地调整内部变量。
示例 2:从大量文档中,将关于相关主题的文本组合在一起。
训练这样的程序可能从提取单个词开始,因为假设关于相似主题的文本共享一个共同的词汇表。也许可以检查句子结构,名词可能暗示联系。但是,对于没有独特词汇表的文本呢?或者不完整的句子结构?或者用不同的语言书写?编写专家级文本理解算法根本不具有可扩展性。
另一方面,让人类制定规则(例如,“如果在同一文档中使用‘manifold’和‘tensor’,则主题可能是理论物理学”)的相同统计数据可以被机器使用到 nth 度;即,与其仅查找一些有望相关的突出词语,不如使用大量(或巨大)此类规则——只要没有人必须显式创建规则。此外,如果一切都是自动的,则没有理由停止使用单词;您还可以查找短语或词序,以及自动识别和过滤最常见的单词。
示例 3:为了导航未知区域,算法有效地创建了一个搜索计划,该计划最终覆盖整个区域以找到特定目的地。
这样的计划必须处理不可预见的障碍,例如墙壁、无法通行的地形等,因为它们正在被导航。因此,不能有一个静态计划;而是每次有新信息可用时都必须修订它。该程序甚至可能没有针对代码未编程处理的情况的答案。
现代方法将需要少得多的前期信息。它只需要一个评估当前情况的函数,然后确定它比以前的情况更好还是更糟。例如,模拟搜索可能让搜索者从一个位置移动到下一个位置,但这可能意味着离开搜索区域或确定由于限制(例如,地形太陡)而不可行或不切实际。这种差异信息通常比评估全局规划算法的整个场景更容易获得。局部评估函数可以创建一个算法,该算法经过多次迭代,无需明确告知如何到达目的地——甚至无需了解世界的规则。
让计算机来完成
这些示例的共同点——机器学习新方法的重点以及以前未完成的原因——是计算机做了大量工作。它必须采取许多细微的步骤,甚至是错误方向的步骤,而不是立即专注于解决方案。如果做得正确,大量的重复最终将有助于识别解决方案。
在上一次人工智能热潮中,25 到 30 年前,我们没有今天可用的计算能力、规模或复杂性,因此这些方法是不可能的。模型复杂性的增加带来了差异,使得问题能够通过(看起来像是)直觉和超人的力量来解决。
今天,我们可以将问题抛给算法,并在给定足够数据的情况下,在数百、数千甚至数百万计算机小时后获得结果。结果是否可用是另一个问题,这引出了最重要的观点之一。
注意结果
所有新方法都依赖于统计数据。基本上,我们有函数,它们接受输入数据,并以严格的数学方式生成一个或多个输出。例如,虽然基于规则的规划算法不会进入(或至少可以识别)无效状态,但统计函数并非如此。
尽管新方法为以前过于复杂而无法考虑或不值得高昂开发成本的问题提供了解决方案,但现在我们必须批判性地评估每个模型的价值。不仅一次,而且在模型的整个生命周期中定期和重复地评估,因为输入数据可能会不知不觉地从有用变为垃圾(以及相应的垃圾结果)。
在某些情况下,可能没有足够的模型。也许任务根本不可能完成,或者没有提供输入数据,或者模型没有足够的自由度来表示所有细微之处。生成模型的算法通常会终止并呈现结果。模型是否有用必须在事后确定。
模型开发的科学方法
模型开发的问题并不新鲜。许多代科学家已经开发出一种严谨的方法来解决未知解决方案的问题,理想情况下,没有偏见
- 陈述给定问题的假设。
- 收集可用作模型输入的数据,并了解答案。
- 确定模型和预期结果的匹配程度。
- 如果不够好,则返回第 1 步。
这是科学方法的核心,我们可以将其转化为机器学习的世界,如下所示

opensource.com
模型统计数据和参数的选择就像创建假设。大多数方法都有一些可以自由和独立选择的参数,从而创建可能无限的搜索空间。另一方面,存在大量的计算能力,并且存在有限数量的方法可以同时测试许多不同的模型。
必须提前收集输入数据以用于两个目的
- 训练模型
- 测试模型
由于同一数据记录不能用于这两个目的,因此必须将完整数据集分成两部分(70% 用于训练,30% 用于测试),并且必须在测试阶段之前锁定和隐藏测试数据集。只要需要或想要,同一数据可以重复用于训练。
首先,将训练数据应用于模型。如果每个输入数据集记录都与预期结果相关联,我们谈论的是监督学习问题,我们尝试发现一种函数,该函数允许从可以测量的关于实体的一组输入值计算目标值。(测量数据是“输入数据集记录”,目标是预期结果。)如果输出值是给定集合之一,我们谈论的是分类问题。如果输出是实值,我们看的是回归问题。否则,它是无监督的,这意味着我们有数据,但没有特定的目标或目标。
模型训练完成后,必须使用测试数据进行验证。模型应用于来自训练数据集的输入。在监督学习问题的情况下,将结果与来自测试集的可用结果进行比较,并测量匹配度。在无监督方法的情况下,我们必须找到其他方法来评估模型的“正确性”。
最后,我们得到了当前模型的得分,该得分基于当前可用的数据集。然后我们可以决定模型是否足够好,我们可以使用它(我们称之为推理),或者是否重新开始并开发一个新模型,可能使用新参数。
要求和限制
遵循这个食谱听起来很容易,尤其是在计算机应该承担繁重的工作时。但没有灵丹妙药,甚至不能保证解决方案。成功使用机器学习需要一些东西
- 选择适合问题的方法/算法
- 缩小搜索范围以考虑模型参数的(通常)巨大搜索空间
- 评估模型的精度,尤其是在自动化搜索时
如果模型区分猫、狗和布丁,并且只有几张图片,则后者可能很容易。在高维数据中或当数据集的数量对于人类来说太高而无法处理时,情况会变得更加复杂。即使我们可以将模型的输出减少到单个数字或数字向量,我们仍然必须为整个模型创建一个坏值分数。盲目地计算平均值和标准差可能是一个坏主意,具体取决于问题和数据。有很多可能的方法来“测量”数据,数据科学家必须了解它们。
此外,期望模型找到与观察数据 100% 匹配是不现实的。存在太多限制,例如

opensource.com
其他限制包括
- 实际事件或“事物”可能与理想的蓝图解决方案不符。
- 观察到的事件或事物可以用有限的精度来测量。
- 模型不是用影响真实系统的所有必要输入构建的,可能是因为它们无法(或无法实际)测量(例如,蝴蝶效应)。
- 必须在搜索中做出妥协,或者必须提前终止搜索,因为参数的搜索空间太大。
这些限制可能意味着模型并没有真正反映它试图预测的真实世界系统。可接受的差异取决于具体情况。
让我们做数学题
让我们从简单的方法开始。希望您还记得学校时代的线性回归和逻辑回归(后者是分类版本)。这些方法要求输入以数字形式提供(即,将类数据转换为具有单个非零条目的向量),并包括找到给定度的最优多项式以匹配预期结果。计算的有效方法是已知的,并且可以解释结果模型——至少在一定程度上。通过 lasso 和 ridge 等扩展,您甚至可以搜索更简单的模型,该模型可能对意外输入的行为不太剧烈。
在类似的直观水平上,存在用于查找相似性的算法。鉴于我们可以测量两个数据集之间的“距离”,我们可以使用 k 最近邻 (kNN) 方法将相似的数据集记录聚集在一起。该算法不需要知道我们正在寻找多少个集群,并且它可以处理(虽然更不稳定)高维数据。这是一种无监督方法,不需要从输入数据计算任何值。输入数据集是使用的数据。
决策树也易于使用和解释。它们主要用于分类问题,但在某些限制下,也可以用于回归。它们的工作原理是在沿值的一个维度上的每一步将剩余的输入集分成两部分。之后,理想情况下,分割的一侧或两侧仅包含相同类的值(仅猫、仅狗、仅布丁)。如果不可能,至少分割每一侧的数据点集更“纯”。
重复该过程,直到集合是纯的(如果集合只有一个元素,则很容易实现)或生成的树超过深度限制。通过根据树的每个分割测试新数据元素,一直到树的叶子来使用结果模型,然后它采用该叶子中剩余集合的大多数结果作为答案。这样的模型可以很容易地作为if-then-else语句的级联翻译成人类语言。
那么神经网络呢?
关于机器学习的新闻主要由神经网络 (NN) 和特别是深度学习主导。神经网络并非新鲜事物;它们是上次人工智能复兴不可或缺的一部分,但在 80 年代末/90 年代初,没有人想到使它们像今天这样复杂,因为实现是不现实的。
使用神经网络进行推理很简单:输入作为向量应用。可能存在大量的内部“神经元层”,它们从上一层(或输入)接收输入,并为下一层(或输出)生成结果。每个神经元可以从上一层中获取全部或一部分值,用一个因子缩放每个值,然后将所有值相加。然后添加一个常数值,使该方法更通用。
此操作可以表示为简单的向量-矩阵乘法。一次执行一层的所有操作是张量乘法。然后,可选地将得到的标量值应用于尝试创建二进制输出(0/1 或 1/-1)的函数。通常使用 sigmoid 或 ArcTanh 函数。重复该过程直到结束,此时可以使用自定义方法从最后一层的输出值或值中确定结果。神经网络特别擅长分类,但也可以用于回归。
棘手的部分是如何构造表示从一层到下一层的步骤的矩阵。我们有许多输入数据集记录,可以评估神经网络。也许我们甚至可以计算矩阵的星座,这将导致一个输入数据集记录的完全正确的值。但是这种计算很可能会使我们为匹配其他记录所做的类似步骤无效。没有用于计算正确值的封闭公式。需要一种渐进的学习方法,其中反复查看所有数据集记录,每次计算与预期结果的差异,然后朝着纠正错误迈出一小步(通过称为梯度下降的方法)。
我们已经创建了许多神经网络的变体,它们擅长不同的任务。卷积神经网络 (CNN) 擅长处理图片。卷积可以隔离特征,而与其位置甚至方向无关。猫是在图片的右下角还是左上角对 CNN 都没有影响。
循环神经网络 (RNN) 擅长处理时间问题。预测时间序列(和异常检测)、模拟长期与短期记忆以及类似任务可以使用 RNN 实现。
独立于这些广泛的类别,存在一些方法可以提高学习速度、提高可以解决的问题的规模或加快训练系统的时间。对于后者,有一些方法可以构建神经网络,使其不需要标记的训练数据并成为无监督算法。
像谷歌、Facebook、领英和亚马逊这样的公司已经基于这些算法建立了他们的商业模式。
不要与优化混淆
许多人在谈论优化时说人工智能或机器学习。当优化算法找到新颖的解决方案时,它可能看起来像智能,但这并不是真正的人工智能。优化算法通常用于机器学习技术的实现中。
凸优化问题是简单的搜索问题。实现方式在速度和对所提供数据的要求方面有所不同,但根据定义,它们能够找到解决方案。非凸优化问题可以概率地解决;这可能是混淆的来源。然而,优化与人工智能/机器学习不同。它们在商业世界中很普遍,大多数这些问题很可能可以通过优化来解决。
了解更多
人工智能/机器学习不是数据科学家的专属领域;每个人——有想法的人、可以帮助解释原始数据的主题专家、知道在哪里找到数据并将其整理成形的人(例如,数据工程师)、任何只是受到启发学习数据科学的人——都可以与数据科学专家合作并为人工智能/机器学习做出贡献。
您如何在您的机器学习或人工智能项目中使用开源工具?将文章提案发送至 open@opensource.com。
3 条评论