对于更高级别的框架,这个问题经常被问到:
答案总是:因为 CuDNN 就是这样做的。
但这是为什么呢?是否有技术原因,有一些优势吗?
目前我只看到多个缺点:
这只是 CuDNN 开发人员的疏忽吗?
我也想知道(我没有验证):这两个偏差项得到相同的梯度,还是不同的梯度?在数学方面,他们必须得到相同的梯度。如果他们不这样做,那将是不正确的。但我可以想象这可能是他们实现它的方式,b_hh 只从经常性部分获得 grad,而 b_ih 只从前馈部分获得 grad。
如果它们确实获得相同的梯度,如果您将它们初始化为相同的,它们应该始终保持完全相同(我也没有验证这一点)。
如果是这种情况,则相当于使用
2 * b
,它只是一个单一的偏差 b
。请注意,在缩放方面,仅使用 b
而不是 2 * b
仍然存在细微差别。
还有
cudnnRNNBiasMode_t
。但是我真的不明白CUDNN_RNN_SINGLE_INP_BIAS
和CUDNN_RNN_SINGLE_REC_BIAS
的区别。应该没有任何区别,否则这将是数学上的错误。