0


你真的需要特征存储吗?

每个成熟的 ML 团队都为他们的 ML 平台构建了特征存储。例如Uber 的Palette。Airbnb 的 Zipline。Netflix 建立了Time Travel。

Google Cloud Vertex AI 与 Sagemaker 还提供了提供完全托管的特征存储功能。甚至还有像 tecton.ai 这样的公司致力于构建与云无关的特征存储平台。这样看来特征存储似乎是机器学习的数据仓库——不仅应该使用特征存储,而且还应该围绕特征存储建设我们的 ML 平台。

但是在大多数情况下,特征存储会增加不必要的复杂性。并且在少数情况下特征存储没有任何的价值。

如无必要 勿增实体

训练服务的倾斜

让我们看看特征存储试图解决的问题。

机器学习的主要挑战之一是训练服务倾斜。当在预处理数据上训练ML模型时,必须对传入的预测数据执行相同的步骤。这是因为我们需要为模型数据提供与训练它的数据相同的特征。如果我们不这样做就会在训练和服务之间产生偏差,模型的预测就不会那么好。

有三种方法可以确保在训练期间所做的预处理在预测期间是相同的:将预处理代码放在模型中,使用转换函数,或使用特征存储。让我们一个一个地讨论一下。

把代码放到模型中

最简单的选择是将预处理步骤合并到模型函数本身中。例如,它可以在Keras中的Lambda层中执行。Keras还提供开箱即用的预处理层。这样当保存模型时,预处理步骤将自动成为模型的一部分。

这种方法的优点就是简单。不需要额外的基础设施。预处理代码与模型放在一起。如果需要在边缘或在另一个云上部署模型,不需要做什么特别的事情。

这种方法的缺点是预处理步骤在通过训练数据集的每次迭代中会重复,计算的预处理的步骤越复杂,浪费的时间就越多。

另一个缺点是,必须在与ML模型相同的框架中实现预处理代码。例如,如果模型是使用Pytorch编写的,那么预处理也必须使用Pytorch完成。如果预处理代码使用自定义库,会变得非常麻烦。

使用转换函数

将预处理代码放在模型函数内的缺点是在模型训练过程的每次迭代期间,需要使用这些代码来转换原始数据。

如果将预处理步骤封装成函数,并将该函数一次性的应用于原始数据。然后对预处理后的数据进行模型训练,这样预处理只进行了一次,可以提高效率。但是必须确保预测代码中也需要调用相同函数。这种做法虽然提高了效率,但也增加了复杂性——因为必须确保将转换函数保存为与模型相关的工件,并知道要调用哪个转换函数。

像Tensorflow Extended (TFX)这样的框架提供了转换功能来简化相关操作。一些基于sql的ML框架,比如BigQuery ML,也支持TRANSFORM子句。

使用转换函数,而不是将转换代码放到模型中会增加额外的计算成本,如果能够接受这样的额外成本,这种方法是最好的。

特征存储

将预处理代码放在模型函数中或将其封装在转换函数(或 SQL 子句)中绝对足以满足绝大多数的特征需求。

但是有两种情况上述的方法是处理不了的,这时候就要引入特征存储。特征存储是用于存储和提供 ML 特征的存储库。特征存储本质上是一个键值库,其中键由一个实体(例如hotel_id)和一个时间戳组成,而值则由该实体的属性(如价格、预订数量、过去一小时内酒店列表的网站访客数量等)组成。

需要特性存储的第一种情况是,预测时需要动态特征,这种动态特征必须在服务器上计算,这时特性库就发挥了作用。例如动态定价模型的特征之一可能是过去一小时内网站上商品列表的访问数量。请求酒店价格的客户是无法实获取这个特征的,这些信息是在服务器上通过点击流数据的流管道进行实时计算的,所以特征库可以保存实时的计算结果并且提供对外的访问。

第二种情况是防止不必要的数据拷贝。例如有一个计算开销很大的特性,并且在多个ML模型中使用。与使用转换函数并将转换后的特性存储在多个ML训练数据集中相比,将它存储在一个集中的存储库中是更加高效的选择。但是要小心——增加的效率也会增加系统的复杂性。所以是需要在效率和复杂性之间做出平衡的考量。例如,一些重复使用特性可以一次计算、多次使用,这样是最好的。

特征存储的使用

假设需要“时间点查找”来获取训练数据以训练模型。使用过去一小时的网站访问者数量或过去一小时司机的出行次数等特征用于训练多个模型。它们是由流式管道直接计算的,实时值可以作为数据仓库的一部分。这种简单的特征不需要特征存储。

但是另外一种被许多模型使用并且在不断改进的特征——例如,在音乐流媒体服务中嵌入了歌曲、艺术家和用户。有一个团队每天都会更新用户和歌曲嵌入向量。每次重新训练使用此特征的模型时——高商业价值的用例将需要定期重新训练——训练代码将需要获取与训练标签和最新版本的嵌入算法一致的特征值。这种特征定期更新并且计算复杂的特征是需要特征存储来进行支持的。

特征存储对于那些频繁更新的难以计算的特征特别有用。

如何判断是否需要特征存储

本决策图总结了上面讨论的因素

希望这个图对你的选择有所帮助。

作者:Lak Lakshmanan

“你真的需要特征存储吗?”的评论:

还没有评论