thu-spmi / CAT

A CRF-based ASR Toolkit
Apache License 2.0
326 stars 74 forks source link

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

Closed l2009312042 closed 1 year ago

l2009312042 commented 1 year ago

在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

maxwellzh commented 1 year ago

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

公式 (15) 中 y_k^t 表示的是softmax输出的概率,而代码中计算的是对 log-softmax 输出的梯度,又因为有

截屏2023-07-04 21 28 00

可知公式 (15) 与当前代码是一致的。

l2009312042 commented 1 year ago

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

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