关于ctc反向传播求导公式的实现问题
Closed this issue · 2 comments
l2009312042 commented
在gpu_ctc_kernels.h 这个文件中,计算的关于softmax的梯度,代码如下
// grad for softmax
for (int idx = tid, j = 0; idx < uniquelabels; idx += blockDim.x, ++j) {
const int grads_offset = prob_offset + start_prob_col + keys_shared[idx];
// output[idx] = accum[j];
grads[grads_offset] = exp(accum[j] - probs[grads_offset] - log_partition);
}
不同的beta初值,其梯度是有差异的,下图是反向传播的推导公式,
左边来自博客
右边来自原始论文
我们这边使用的右边的初值方式,感觉应该是
grads[grads_offset] = exp(accum[j] - 2*probs[grads_offset] - log_partition);
这里的实现是否有问题,还请帮确认一下?
maxwellzh commented
l2009312042 commented
今早想到是logsoftmax和softmax的差异,想过来关闭一下,没想到作者已经回复了。
代码是关于logsoftmax求导的 ,公式是对softmax, 有这个差异 ,问题关闭 ,感谢。
如果都是关于softmax或者都是关于logsoftmax,初值是有影响的,在于alpha*beta这项,中间那个ykt 是否乘了2次。