使用 TFX 进行分布式 PCA
2020 年 2 月 27 日
maiot 的 Hamza Tahir 以及 Robert Crowe 和 Tris Warkentin 代表 TFX 团队撰写

简介

主成分分析(PCA)是一种降维技术,在许多不同的机器学习场景中都有用。本质上,PCA 以保留数据集中的最大方差的方式降低输入向量的维度。降低模型输入的维数可以提高模型性能,减少训练所需的尺寸和资源,并降低非随机噪声。

TensorFlow Extended (TFX) 是一个用于创建生产就绪、端到端机器学习管道的免费开源平台。在maiot,TFX 是我们核心引擎的重要组成部分。最初构建为我们资产优化平台的基础,现在开发人员可以独立使用核心引擎来管理自己的深度学习工作负载。

在引擎内部,我们提供了许多用于预处理数据的机制。这包括将 PCA 应用于海量输入数据以用于可视化和学习目的。鉴于此,我们准备了这篇文章来展示如何使用 TFX 将分布式 PCA 应用于数据集。

TensorFlow Transform

TFX 管道由组件组成,这些组件反过来利用各种TensorFlow 库。其中之一是TensorFlow Transform:一个强大的库,用于对 TensorFlow 的输入数据进行预处理。TensorFlow Transform 的输出以 TensorFlow 图表的形式导出,并在训练和服务时使用。这可以防止偏差,因为在两个阶段都应用了相同的转换。

与 TFX 的许多库和组件一样,TensorFlow Transform 使用Apache Beam 来在计算集群上分配工作负载以执行处理。这使得 Transform 能够处理非常大的数据集并有效利用可用资源。Apache Beam 作为抽象层运行在广泛可用的分布式计算框架之上,包括Apache SparkApache FlinkGoogle Cloud Dataflow。在 maiot,我们在托管的无服务器Cloud Dataflow 服务上运行 Apache Beam,这是 Google Cloud 的一部分。

使用 TensorFlow Transform,可以将 PCA 作为 TFX 管道的一部分进行应用。PCA 通常被实现为在单个计算节点上运行。由于 TFX 的分布式特性,现在比以往任何时候都更容易实现分布式 PCA 算法,以便可扩展地处理大型数据集。

展示 - 使用 TFX 的 PCA

此示例colab 笔记本包含了运行使用 PCA 的 TFX 管道的完整示例。它利用TFX 交互式笔记本上下文来创建 TFX 管道,该管道输出广泛使用的 Iris 数据集的主成分投影。

所有神奇之处都发生在preprocessing_fn函数内部,该函数被馈送到 TFX 管道中的 Transform 组件中。此函数接受特征张量的字典并输出包含应用相关转换的特征字典。虽然您可以在此处使用普通的 TensorFlow 代码,但许多基本转换已经与 TensorFlow Transform 一同内置(例如,归一化、分桶、计算词汇表等)。在此处找到开箱即用的转换的完整列表此处

这些内置转换之一是tft.pca转换,我们将使用它来计算我们数据集的 PCA。以下是您如何在preprocessing_fn函数中利用此转换的方法。
def preprocessing_fn(inputs):
    features = []
    outputs = {}
    for feature_tensor in inputs.values():
        # standard scaler pre-req for PCA
        features.append(tft.scale_to_z_score(feature_tensor))
          
    # concat to make feature matrix for PCA to run over
    feature_matrix = tf.concat(features, axis=1)  
    
    # get orthonormal vector matrix
    orthonormal_vectors = tft.pca(feature_matrix, output_dim=2, dtype=tf.float32)
    
    # multiply matrix by feature matrix to get projected transformation
    pca_examples = tf.linalg.matmul(feature_matrix, orthonormal_vectors)
    
    # unstack and add to output dict
    pca_examples = tf.unstack(pca_examples, axis=1)
    outputs['Principal Component 1'] = pca_examples[0]
    outputs['Principal Component 2'] = pca_examples[1]


    return outputs
注意:在此示例中,我们假设所有输入特征都是数值型的,并且都被馈送到 PCA 转换中。如果需要,可能只使用输入特征的子集。

上面的代码片段中有很多事情正在发生,让我们仔细看看。

首先,我们对所有输入张量应用归一化转换。这很重要,因为 PCA 算法期望输入向量分量已转换为相似的测量单位。

其次,我们将输入张量连接在一起以创建一个特征矩阵。这里就是我们应用tft.pca函数的地方。这将计算我们数据的正交向量矩阵。正如tft.pca 文档中所解释的,该矩阵可用于计算我们数据的最终投影。我们通过将此矩阵与特征矩阵相乘来实现这一点。最后一步是“拆分”投影矩阵,将各个主成分分开。然后,我们在输出字典中返回这些值。

当您实际使用上面的preprocessing_fn执行 Transform 组件时,幕后发生了很多被抽象掉的事情。为了在计算集群上执行分布式处理,TFX 创建了一个分布式Apache Beam 管道,该管道计算相关协方差和正交向量矩阵。它还创建了一个包含此嵌入转换的普通 TensorFlow 图表,该图表将成为您训练模型的一部分,以便您可以在服务时使用 PCA 转换。PCA 的结果是一个新的向量空间,具有更少的维度。在服务时,新数据将从原始高维空间投影到该低维空间。

在成功运行 TFX 管道之后,您可以轻松地使用 Transform 组件的输出来提取转换后的数据以进行可视化。在附带的 colab 中,这正是所展示的内容
data visualization of iris dataset PCA
如您所见,三个类别之间的分离在降维空间中清晰可见。

结论

PCA 只是众多数据转换中的一种,可以通过特征工程来提高机器学习模型的性能。与 PCA 一样,许多转换都需要大量的处理能力,尤其是在大型数据集的情况下。我们在本文中展示了 TensorFlow Transform 如何使开发人员能够以可扩展的方式应用 PCA 等复杂的转换,并利用计算集群中可用的资源。我们还展示了如何在 TFX 管道中包含转换处理,以及如何将这些特征工程转换与您训练的模型一起包含,以便在模型进行预测时执行完全相同的转换。

更多信息

要了解有关 TFX 的更多信息,请查看TFX 网站,加入TFX 讨论组,深入研究TFX 博客中的其他文章,观看我们TFX YouTube 播放列表,并订阅 TensorFlow 频道。
下一篇文章
Distributed PCA using TFX

- maiot 的 Hamza Tahir 以及 Robert Crowe 和 Tris Warkentin 代表 TFX 团队撰写
简介主成分分析(PCA)是一种降维技术,在许多不同的机器学习场景中都有用。本质上,PCA 以保留数据集中的最大方差的方式降低输入向量的维度。降低模型输入的维数可以提高模型性能,减少训练所需的尺寸和资源,并降低非随机噪声。