关于cudnn lrn backward possible implementation的问题

questions about cudnn lrn backward possible implementation

lrn的方程如下:

 y = x * pow(lrn_k + lrn_alpha/lrn_size * sum(Xj * Xj), -lrn_beta)

cudnn 向后的 lrn api 是

cudnnStatus_t cudnnLRNCrossChannelBackward(
cudnnHandle_t                    handle,
cudnnLRNDescriptor_t             normDesc,
cudnnLRNMode_t                   lrnMode,
const void                      *alpha,
const cudnnTensorDescriptor_t    yDesc,
const void                      *y,
const cudnnTensorDescriptor_t    dyDesc,
const void                      *dy,
const cudnnTensorDescriptor_t    xDesc,
const void                      *x,
const void                      *beta,
const cudnnTensorDescriptor_t    dxDesc,
void                            *dx)

我发现没有工作空间来节省caffe中实现的规模,即

    scale = lrn_k + lrn_alpha/lrn_size * sum(Xj * Xj)

这个变量对于反向计算 lrn 很有用。 所以我想也许在后向内核中只会从 y、x 和 lrn_beta 计算来计算这个变量,等式类似于这样:

   y/x = pow(scale, -lrn_beta)
   y/x = pow2(-lrn_beta * log2(scale))
   log2(scale) = -1/lrn_beta * log2(y/x)
   scale = pow2(-1/lrn_beta * log2(y/x))

当我使用这些方程计算比例时,cuda 内核生成 NAN,是否有其他方法可以在不保存前向比例值的情况下向后计算 lrn?为什么我的方法不稳定?

查了一下ptx,这个backforward pass还需要计算scale,这个scale是forward计算的