关于cudnn lrn向后可能实现的问题

时间:2019-02-20 03:11:46

标签: cudnn

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而又不向前存储比例值?为什么我的方法不稳定?

1 个答案:

答案 0 :(得分:0)

检查了ptx,此后退传递仍需要计算向前计算的比例。