我最近学习了一种名为“梯度检查”的算法,用于确保我的神经网络反向传播的导数计算正确。
我所学的课程,以及许多其他来源,如这个,都声称它比计算导数要慢得多,但我似乎找不到任何地方解释为什么会这样。
那么,为什么梯度检查比直接计算导数要慢呢?
它到底慢多少呢?
回答:
在反向传播中,你所做的是对一个具有大量输入N
和只有一个输出的函数进行自动/算法微分的反向模式。这里的“输入”主要指的是神经网络节点的实数参数,可能还包括网络的输入变量。
在反向模式中,你通过操作链的一次传递计算所有输入的导数。这大约需要3次函数评估的成本,加上执行操作链反向运行以及存储和访问中间结果的组织开销。
在相同情况下使用的前向模式,你用在“梯度检查”中,无论你是推进AD导数还是计算分离差分,你都需要单独计算每个导数。这总共大约需要2*N
次函数评估的成本。
由于N
很大,2*N
远大于3。