为什么 log 和 exp 在 ML 中被认为是“昂贵的”计算?

计算科学 浮点 复杂
2021-12-18 08:47:16

在许多资源/视频中,我看到有人按照“我们可以在这里看到我们有一个对数/指数,所以这将是一项昂贵的计算”。(例如使用 NN 的 sigmoid 激活函数)。这些声明的背后是什么?

一个更具体的例子是:是什么让在计算机计算中之类的东西有很大不同?exx44x

2个回答

要添加到 Lutz Lehmann 的答案,您可以在Agner Fog的这个综合表中查找 CPU 指令的延迟。例如,在 Intel Ivy Bridge 处理器上:

  • FADD / FSUB(浮点加减)都需要 3 个周期
  • FMUL(乘法)需要 5 个周期
  • FDIV(除法)需要 10-24 个周期
  • FYL2X ( ) 需要 90-106 个周期ylog2(x)
  • F2XM1 ( ) 大约需要 68 个周期2x1

要计算底数不是 2 的指数,您必须结合使用 FYL2X 和 F2XM1 指令。除了 Lutz 所说的原因之外,IEEE-754 标准对于必须如何准确地评估超越函数有非常严格的要求——正确到最后一位和正确的舍入。对于许多应用程序来说,这种精度水平是完全没有必要的,人们将在软件中使用比内置硬件指令所需的周期少得多的近似值。例如,这篇博文展示了如果您愿意牺牲一些准确性,如何快速计算指数函数的近似值。我认为,与 ML 相比,使用较低精度的浮点数也很常见——只有 32、16 甚至 8 位——而不是完整的 64 位。

exp,sin,tan并且它们的反函数和其他相关函数是超越函数,由无限幂级数定义。这意味着需要一些努力来评估一致的良好近似值。这是通过使用这些函数的属性和多项式近似的参数简化来完成的,或者使用多项式的商 à la Padé 近似(但再次转向某种一致收敛)。

所以确实是一个sigmoid11+ex应该比例如花费更多的周期0.5+max(0,x)1+|x|.

幂函数通过或一些包装器来评估,这些包装器删除了更易于计算的部分,因此特别是对于非整数比指数函数更昂贵。xy=exp(ylog(x))y