【问题标题】:Why should I use a 2**N value and how do I choose the right one?为什么要使用 2**N 值以及如何选择正确的值?
【发布时间】:2022-01-06 13:53:15
【问题描述】:

我正在学习building a neural network 上的课程,我很困惑为什么示例代码中的 linear_relu_stack 使用了 512:

class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
            nn.ReLU()
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

我开始四处搜索,看到许多使用 2**N 的各种值的 torch.nn.Linear 函数示例,但我不清楚他们为什么使用 2 的幂,也不知道他们如何选择使用哪个值。

【问题讨论】:

  • 当我检查你的链接时,我没有看到任何示例代码,我只是看到一个测验问题。
  • datascience.stackexchange.com/questions/16416/… 会回答您的问题吗?我通过输入neural network why power of twointo a search engine 发现它是第一个结果。你试过这个吗? Why not?
  • @KarlKnechtel,谢谢。我不清楚示例代码中的 512 是否与节点有关,我在 pytorch 文档中也没有发现任何内容,也没有在 SO 上进行搜索。下次我会尝试扩大搜索范围。虽然它没有回答我问题的第二部分,但它引导我朝着正确的方向寻找答案。

标签: python deep-learning neural-network pytorch


【解决方案1】:

虽然有未经证实的声称 2 的幂有助于优化神经网络各个部分的性能,但它是选择/测试/找到用于各种参数/超参数的正确数量级的便捷方法。

【讨论】:

    【解决方案2】:

    原因在于硬件是如何完成这个过程的。在深度学习中,矩阵运算是浮点运算 (FLOP) 的主要计算和来源。

    CPU 中的单指令多数据 (SIMD) 操作以批量大小发生,即 2 的幂。如果您有兴趣,不妨看看:

    https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37631.pdf

    对于 GPU:

    https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html

    通过 CUDA Runtime API 分配的内存,例如通过 cudaMalloc() 保证至少对齐 256 个字节。 因此,选择合理的线程块大小,例如 warp 大小(即当前 GPU 上的 32),便于内存访问 通过正确对齐的经线。 (考虑会发生什么 第二个、第三个和后续线程访问的内存地址 如果线程块大小不是扭曲大小的倍数,则阻塞,对于 例子。)

    这意味着当您使用 gpu 时,32 的任何倍数都将优化内存访问,从而优化处理速度。

    关于正确的值,金字塔形状通常效果更好,因为随着您的深入,神经网络倾向于以预期的层次结构创建转换数据的内部表示,即金字塔形状。所以一个很好的猜测是当你接近输出时,在每一层使用递减的神经元数量,例如:

    self.flatten = nn.Flatten()
    self.linear_relu_stack = nn.Sequential(
        nn.Linear(28*28, 512),
        nn.ReLU(),
        nn.Linear(512, 128),
        nn.ReLU(),
        nn.Linear(128, 10),
        nn.ReLU()
        )
    

    但没有一般规则,您可以找到整个研究领域(如神经架构搜索),了解如何为神经网络找到最佳超参数。

    您可以在这里查看一些更深入的信息:

    https://arxiv.org/pdf/1608.04064.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2018-03-12
      相关资源
      最近更新 更多