去神话的机器学习:分类框架、摊销思维与业务导向

最近上完了机器学习课程(cs-c3240),终于有时间认真思考和总结一下了。这是我第一次接触正式机器学习,身为小白一枚,在这门课上受益良多,非常感谢老师和助教对课程内容的付出,也非常感谢同学们(由于我们的同行评审机制的存在),他们的作品和对我们的作业的评价也让我对机器学习有了更加深入的理解。

什么是机器学习?

第一堂课,老师就给了我们答案。简单来说,机器学习就是一门通过编程让计算机从数据中进行学习的科学。科学家们研究了一套方法的集合,运用这套方法,我们就能够自动的在数据中去识别出一些模式,当然,这种模式它是不是100%准确(这也是机器学习领域在不断发展改进的点之一),但是它可以 cover 住大部分场景。然后,我们就可以用这些模式去预测未来的数据。在这个领域中,科学家们研究的主要问题是如何让计算机无需进行明确编程就具备学习能力。我们只通过定义学习的方法,不去定义具体的条件语句,通过“训练”,也就是我们定义的策略函数,去自己寻找模型的具体实现。

什么是模型

我们都知道机器学习描述的是在用数据去构建模型这个过程。那么什么是模型呢?在我看来,模型的本质就是一个数学函数f(x_i) = y, 它可以有多个入参,基于你给出的参数,会给出结果 y。但是,这个函数我们只定义了它的“形状”,也就是假设函数,但具体的参数设定为多少,就是我们通过定义好的规则“训练”出来的了。我认为机器学习的产出——模型,它和任何编程语言中描述的 function 并没有本质区别。他们都是调用时给定入参,他们都是返回固定类型的结果。只不过和传统的 function不同的是,这个函数并不是我们 hardcode 的,而是通过大量的实例学习到的近似模式。从某些视角来看,所谓的模型有点像我们在设计系统时访问的第三方 API,我们只知道需要传入什么和会返回什么,但是并不知道它是怎么实现的。所以,我们也不必过度神化机器学习,它仍然是软件工程的一部分,一个 artifact。它也和其他的软件服务一样,需要打包,版本化,发布和回滚。从这个视角出发,机器学习又显得没有那么复杂了。

机器学习系统的分类

上文提到了模型需要通过数据“训练”出来。之所以打上引号,就是因为有一些模型其实是不需要真正的训练的。机器学习系统的类型繁多,我们可以从不同的视角对方法进行分类。

监督、无监督、强化学习

通过是否在人类的监督下训练,我们可以把机器学习系统分为监督机器学习,无监督机器学习和强化学习。有监督机器学习指的是每一个数据点除了提供特征之外,还提供标签,也就是我们想要预测的结果属性。有监督机器学习常常用于分类和回归任务。从简单的线性回归到 SVM 再到现代复杂的神经网络,都属于有监督机器学习。而无监督机器学习则是数据点只提供了特征属性,但是没有任何的标签属性,它常常被用于聚类问题,也就是给一群数据点进行归类,发现其中的规律,生成某种“标签”。在特征工程中常用的 PCA 技术,聚类时使用的 k-均值算法和 DBSCAN 算法则属于这一类。强化学习则有些特殊,它的学习系统(通常称之为智能体)能够观察环境,做出选择,执行动作并获得回报或者是惩罚。它的核心在于**探索–利用的权衡,**通过不停的试错,找到它已知情况下的最优解。

批量学习 vs 在线学习

如果通过模型是否能够动态的进行增量学习,我们又可以把他们分为在线学习和批量学习。这种分类方式主要是看系统是否可以从部署上线后传入的数据流中进行增量学习。对于传统的批量学习,系统无法进行增量学习,即必须使用所有可用的数据进行训练。这往往会需要大量的时间和计算资源,并且每一次有更新都需要从头训练。而在在线学习系统中,我们可以基于新的数据进行小步的训练,即在当前模型基础上进行部分训练和微调。这种训练方式在像 Tiktok 这样的短视频平台中比较常见,因为他们需要基于用户的行为模型和市场的发展进行动态的变化。然而,在线学习也存在着一些问题。一个是如果系统持续的输入不良的数据,系统的性能可以会逐步下降。为了避免这种情况,我们就需要为系统增加额外的可观测性系统来保证正常的运作。另外一方面,更复杂的训练模式意味着更加高的实现成本,往往这类系统也只有大公司才有足够的人力资源和技术去实施。

基于实例(instance-based)vs 基于模型(model-based)

最后,有一种分类方式我很喜欢,也是我认为最恰当的分类方式。它按照模型是否会对训练数据进行模式检测来建立预测模型,将它分为了基于实例的学习(instance-based)和基于模型的学习(model-based)。所谓基于模型的学习,就是上文所提到的需要通过大量的数据去训练,让模型的参数在一轮轮迭代中进行调整,最终尽量的适配大部分的数据,然后进行预测的思路。这也是现在流行的各种深度学习算法遵循的思路。而基于实例的学习则不相同。它的思路是通过将新的数据点和已知的数据点进行匹配,然后给出最终结果。这种方法也叫做传统机器学习。它不需要去预先定义模型的假设空间然后通过数据集来调整参数。它常常被用作一些分类问题,最经典的就是k-近邻算法(KNN),对于新的数据点,kNN 算法会比较它和所有数据点之间的空间距离,找出距离最近的 K 个实例,然后将新数据点分为 k 个实例中的 majority 所归属的类别。

值得一提的是,当前比较火的 RAG 技术,其实也不是什么新起之秀。它背后的思想和我们刚刚提到的 kNN很像,只是它为了解决我们刚刚提到的基于实例的学习系统的普遍问题,额外做了一些关于搜索性能和准确率上的优化,这里就不再展开。不过这也告诉我们传统机器学习仍有用武之地。

摊销推理与生产时延

基于实例的学习(instance-based)和基于模型的学习(model-based)这种分类方式其实蕴含着传统与现代模型的设计理念的改变。在基于模型的学习(model-based)中,我们在真正使用最终的产物 模型 时其实是不会用上训练时的数据集的,因为我们已经获得了想要的模型参数。为了能够实现较好的效果,我们常常需要大量的数据来进行训练。相反,基于实例的学习(instance-based)则是直接使用数据集来让模型工作。它不需要大量数据来帮助模型调整参数。所以,仅仅是小规模的数据就可以起到很好的效果。

这么看来,好像传统机器学习模型就很不错,那我们为什么还需要基于模型的学习呢?除了广为人知的现代深度学习模型对于图像,视频,自然语言处理比较好之外,这背后其实隐藏着更加深层次的原因。从我们举例的 kNN 的工作原理可以得知,基于实例的学习带来的问题是每次进行推理时都会消耗大量的计算时间,因为它的本质是一种遍历操作,它需要访问所有的已知实例来得出结果,并且每次推理的时间都随着数据集大小的增长而增加。而基于模型的学习则大部分时间都花在训练上了,一旦参数训练完成,部署后的模型进行推理时其实不会花太多时间。基于模型的学习其实是一种“摊销推理”,它把复杂推理的步骤前置到训练期,从而降低在生产环境中的模型的响应时间。它大大提升了生产环境下的用户体验。

跳出盒子之外

在现实场景下,不论是使用基于实例的学习还是基于模型的学习,都需要具体问题问题分析。现在业界的许多真正需要落地的场景,运用传统的机器学习系统往往就可以解决的很好。例如一些工厂的异常检测问题,或者是银行信贷,医疗等领域需要强监管和强解释性的问题。但是,对于一些对于精准度要求较高,特征比较难以描述的问题,例如人脸识别,AI 客服等等,基于模型的学习则表现地更好。

机器学习模型一定是为了解决实际的业务问题存在的。作为一名软件工程师,或者说是计算机领域的从业人员,我们要时刻铭记着软件是为了降本增效而存在的。所以,在我们完成一个任务之前,我们首先得问问老板,业务目标是什么,因为建立模型本身可能不是最终目标。公司如何使用这个模型从中收益?有没有可能有性价比更高的解决方案?这才是最重要的问题,因为这将决定我们要怎么设定问题,选择什么算法,用什么方式来评估模型,以及花多少精力去调整它。业务决定技术,一名好的软件工程师,不一定是那个技术水平最高的人,但他一定是那个对于业务的理解最深刻,能够时刻以公司利益为导向,给出最优解决方案的人。

共勉。