关于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计算的
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计算的