维度表示

维度表示是尝试为张量轴赋予语义描述,从而为其赋予类型,并随后基于这些类型执行验证步骤。

动机

这种机制的动机可以通过一个简单的例子来说明。在下面的线性神经网络规范中,我们假设一个 NCHW 模型输入

input_in_NCHW -> Transpose(input, perm=[0, 2, 1, 3]) -> AveragePool(input, ...)

在这个神经网络中,用户错误地构建了一个神经网络,它将 NCHW 输入转置为奇怪的 NHCW 格式,并通过假设 NCHW 输入格式的空间池化。尽管这是一个明显的错误,但现有的基础设施不会向用户报告错误。这对那些严重依赖类型检查作为程序正确性保证的程序员来说应该是非常令人不安的。本提案旨在解决当前神经网络规范范式中固有的适当类型检查的空白。

本提案包含三个关键组成部分:表示定义、表示传播和表示验证,每个部分将在下面详细讨论。

表示定义

首先,我们为张量类型定义一组类型。这些类型是基于以下原则定义的

  1. 足够细粒度以消除潜在的陷阱。例如,动机部分中说明的上述示例要求我们区分通道维度和空间特征维度,以确保 AveragePool 操作执行的正确性。

  2. 足够粗粒度以减轻用户的认知负担。例如,在上述示例中,没有必要区分宽度维度和高度维度,因为池化和卷积等操作通常不会区分不同的空间维度。因此,我们将所有空间维度总结为特征维度。

  3. 作为 2 的一个重要推论,与模型无关。例如,循环神经网络 (RNN) 中特征维度的语义和卷积神经网络 (CNN) 中空间维度的语义几乎没有区别,因此我们允许用户和开发人员将两者描述为特征维度。

具体来说,在我们的第一个提案中,我们定义了以下标准表示集

  1. DATA_BATCH 描述训练数据的批次维度。这对应于更常用的张量格式表示法 NCHW 中的 N 维度。

  2. DATA_CHANNEL 描述训练数据的通道维度。这对应于 C 维度。

  3. DATA_TIME 描述时间维度。

  4. DATA_FEATURE 描述特征维度。这对应于 HW 维度或 RNN 中的特征维度。

  5. FILTER_IN_CHANNEL 描述滤波器输入通道维度。此维度的大小与输入图像特征图的通道维度相同。

  6. FILTER_OUT_CHANNEL 描述滤波器输出通道维度。此维度的大小与输出图像特征图的通道维度相同。

  7. FILTER_SPATIAL 描述滤波器空间维度。

表示传播

表示传播发生在操作相对于其输入张量置换、销毁或创建维度时。在这种情况下,我们将实现自定义的、特定于操作的函数,以根据输入张量维度表示来推断输出张量维度表示。表示传播发生的一个示例操作是转置操作,其中输出维度表示推断的伪代码可以表示为输入维度表示的函数

for i, j in enumerate(perm):
    out_dim_denotaion[i] = in_dim_denotation[j]

表示验证

表示验证发生在操作期望其输入以特定格式到达时。表示验证发生的一个示例操作是 AveragePool 操作,其中输入(如果用维度表示进行注释)在二维情况下应具有表示 [DATA_BATCHDATA_CHANNELDATA_FEATUREDATA_FEATURE]。如果预期维度表示与实际维度表示之间存在不匹配,则应报告错误。

类型表示

有关如何描述图像和其他类型的更多详细信息,请参阅类型表示文档