维度表示

维度表示是一种实验性尝试,旨在为张量轴提供语义描述,从而提供类型,并随后基于这些描述执行验证步骤。

动机

这种机制的动机可以通过一个简单的例子来说明。在下面的线性神经网络规范中,我们假设了一个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 描述了一个特征维度。这对应于RNN中的HW维度或特征维度。

  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操作,其中输入如果在2D情况下标注了维度表示,则应具有表示[DATA_BATCH, DATA_CHANNEL, DATA_FEATURE, DATA_FEATURE]。如果预期的维度表示与实际维度表示不匹配,则应报告错误。

类型表示法

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