训练深度网络最耗时的部分是什么?

人工智能 神经网络 深度学习 训练 深度神经网络
2021-11-02 07:06:08

众所周知,深度网络需要很长时间来训练。

培训他们最耗时的方面是什么?是矩阵乘法吗?是前传吗?它是后向传播的一些组成部分吗?

3个回答

查看本文中的图 6:PyTorch 分布式:加速数据并行训练的经验

它分解了在 NVIDIA Tesla V100 GPU 上运行 ResNet50 和 BERT 的前向传播、后向传播、通信步骤和优化步骤的延迟。

通过测量图中的像素,我估计了前进、后退和优化步骤的时间占总时间的百分比。(我忽略了图中所示的通信步骤,因为那只是为了显示在进行数据并行训练时未优化的通信步骤需要多长时间)。这是我得到的估计:

  • 前锋:23%
  • 落后:74%
  • 优化:3%

因此后向传播所需的时间大约是前向传播的 3 倍,并且优化步骤相对较快。

前传

给定前一层的输出,可以计算出一层的输出。因此,GPU 可以在每一层和小批量上并行计算,这是通过计算一个大矩阵来完成的。但它需要从层到层(从早期层到较高层)是顺序的。关于层类型的卷积或特别是完全连接的层可能会导致大的矩阵计算。

向后传球

层相对于层输入(和层参数)的梯度只能通过给定层输出(后续层的输入梯度)和层的输入(前一层的输出)的梯度来计算。这再次可以在层和小批量上并行化,但从较高层到较早层是顺序的。此外,由于后向传播依赖于前向传播的输出,因此前向传播的所有中间层输出都必须为后向传播进行缓存,这会导致 (GPU) 内存使用率很高。

向前和向后传球花费大部分时间

因此,这两个步骤需要很长时间进行 1 次训练迭代,并且(取决于您的网络)GPU 内存使用率很高。但是你应该阅读并理解基本解释一切的反向传播算法。

此外,从头开始训练网络通常需要大量迭代,因为特别是在早期训练层中,参数基于受许多先前层影响的梯度,这可能导致噪声更新等,确实如此并不总是直接将网络参数推向正确的方向。相比之下,例如,在一些新任务上对预训练网络进行微调,例如已经可以用少得多的训练迭代来完成。

训练神经网络没有这样单一的困难和缓慢的步骤,前向传递涉及大量的矩阵乘法,反向传递也是如此,即使有高度优化的矩阵乘法库,神经网络在两者中都作用于非常高维(张量)的乘法。向前和向后的传球,这使得训练变得困难。然而,如果我们在大型神经网络的情况下不使用反向传播,反向传播会更慢甚至更难处理,因为计算导数需要时间。

请参阅培训结果以获取确切数字https://github.com/baidu-research/DeepBench#types-of-operations