神经网络模型中的乘法量

数据挖掘 机器学习 神经网络 深度学习
2022-02-22 16:15:22

我目前正在阅读这本书,希望有人告诉我目前我对神经网络的假设是否正确。 https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/

如果一层有 30 个神经元:在前馈神经网络中,第一层的每个神经元与第二层的所有神经元相乘。这将是第一层的 30 个神经元乘以第二层的 30 个神经元,总共可以得到 900 (30*30 = 900) 次乘法(这是正确的吗?)

但是这 900 次乘法仅适用于神经网络 (nn) 的第一层和第二层。因此,如果我有一个具有 3 层的前馈 nn,我将不得不再进行 900 次乘法运算,因为它们是第一层的输出(它们是第二层的输入)与第三层的权重的乘法。

因此,回顾一下我到目前为止所说的内容,我有一个前馈 nn,前两层有 3 层,前两层有 30 个神经元,每个神经元与第二层的所有神经元相乘,每增加一层,我将 30 * 30 = 900 次乘法add,它增加了 900 个额外的乘法。

然后对于具有三 (3) 个全连接层的模型,前两层将是 900 次乘法,因为对于我之前所说的,第二层和第三层中的 900 次乘法总共 1,800 (900 + 900) 次乘法,不包括激活功能,这仅用于前向传递,我的理解正确吗?

除了典型的神经网络中的前向传播之外,它们还有一个后向传播,由于我之前的计算,它们是整个后向传播的 1,800 个导数(梯度)。假设对于神经网络,我是否正确?这就是 CPU 计算机需要这么长时间来训练模型的原因,因为它必须进行大约 3,600 (1,800 + 1,800 ) 次数学运算。

1个回答

基本上你是对的,处理输入和训练神经网络需要大量的计算。

你有一些术语有点错误或模糊。例如

在前馈神经网络中,第一层的每个神经元与第二层的所有神经元相乘。

神经元不会直接一起繁殖。为神经网络层编写方程的常用方法,调用输入层值xi和第一个隐藏层值aj, 其中有 N 个输入可能是

aj=f(bj+i=1NWijxi)

在哪里f()是激活函数bj是偏置项,Wij是重量连接ajxi.

所以如果你有M隐藏层中的神经元,你有N×M乘法和M单独的总和/加法N+1条款,以及M传递函数的应用f()

除了典型的神经网络中的前向传播之外,它们还有一个后向传播,由于我之前的计算,它们是整个后向传播的 1,800 个导数(梯度)。

它的工作并不那么直接,并且作为一个小因素涉及更多计算(您不会用单个乘法计算每个导数,通常有几个,一些结果被重复使用,并且可能涉及其他操作)。但是,是的,您确实需要为每个权重和偏差项计算导数,并且您的网络中大约有相同数量的权重需要完成计算。

与用于图像问题的典型神经网络相比,您建议的数字实际上非常小。这些通常为前向传递执行数百万次计算。

这就是 CPU 计算机需要这么长时间来训练模型的原因,因为它必须进行大约 3,600 (1,800 + 1,800 ) 次数学运算。

实际上,对于现代 CPU 来说,这只是微不足道的计算量,并且可以在不到一毫秒的时间内完成。但这乘以几个因素:

  • 您必须对训练数据中的每个示例执行此操作

  • 您的示例网络很小,请考虑更大

  • 这不包括激活函数计算 - 通常比乘法慢

  • 您的粗略估计忽略了一些必要的操作,因此作为猜测,将分析中的 CPU 级操作数乘以 3 或 4。

    . . . 并且操作的数量确实开始达到 CPU 在实践中可能需要数小时或数天才能执行训练任务的值。