thu-spmi/CAT

关于ctc反向传播求导公式的实现问题

Closed this issue · 2 comments

在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);
这里的实现是否有问题,还请帮确认一下?

image

你好,我想这个问题和 beta 的初始化定义无关。左边来自博客的公式我不确定是否正确,仅从右边论文原文公式分析。

公式 (15) 中 y_k^t 表示的是softmax输出的概率,而代码中计算的是对 log-softmax 输出的梯度,又因为有
截屏2023-07-04 21 28 00
可知公式 (15) 与当前代码是一致的。

今早想到是logsoftmax和softmax的差异,想过来关闭一下,没想到作者已经回复了。
代码是关于logsoftmax求导的 ,公式是对softmax, 有这个差异 ,问题关闭 ,感谢。

如果都是关于softmax或者都是关于logsoftmax,初值是有影响的,在于alpha*beta这项,中间那个ykt 是否乘了2次。