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而又不向前存储比例值?为什么我的方法不稳定?
答案 0 :(得分:0)
检查了ptx,此后退传递仍需要计算向前计算的比例。