语音识别CTC算法中,最后一个公式如何推导?

论文为 Alex Grave的Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks 。链接为cs.toronto.edu/~graves/ 式子左边为最大似然目标函数O对于输出层输入的偏导数,右边为输出层的真实输出ytk与后面那一坨预测输出的差值,文章将这个式子描述为网络在backword propagation中的错误信号,我理解就是梯度。如果有人看过这篇论文的话,求问这个等式如何推导出来的?坐等大神
关注者
74
被浏览
2,783

2 个回答

刚刚真的去推了一遍 XD

首先把符号整理一下:
  • 整个推导过程中,涉及的时间下标都是t,所以这个t就省略不写了。
  • 最后的结果中,\alpha, \beta是戴帽子的,它们跟不戴帽子的\alpha, \beta差一个系数。但结果中的求和式(相当于在分子上)里的\alpha, \beta戴帽子,分母上的Z展开后里面的\alpha, \beta也戴帽子,于是帽子就可以抵消了。
  • 去掉帽子后,Z跟上文 (14) 式中的p(\mathbf{l}|\mathbf{x})(以下简记作p)就变成了同一个式子。
再看 (15) 式,它长这样:
我们把求和号外面分母上的两个y_k拿一个到求和号里面,让它跟Z的表达式更像一些。
(其实这个麻烦就是因为\beta的定义包括了t时刻,如果像 HMM 里那样把\beta定义成从t+1时刻开始的累乘,求和号里面就不用除以y_k了)
然后定义\sum_{s \in lab(\mathbf{l}, k)} \frac{\alpha_t(s) \beta_t(s)} {y_k^t} = s_k,于是有p = Z = \textstyle\sum_k s_k\partial p / \partial y_k = s_k / y_k

然后我们来处理u_k。文章中说u_k是 unnormalized output,我推测它应该是这个意思:y_k = \exp(u_k) / \textstyle\sum_j \exp(u_j)
由此式容易求得\partial y_j / \partial u_k = y_j (\delta_{jk} - y_k),其中\delta_{jk}j=k时取 1,其它时候取 0。

下面推导 (16) 式:
\frac{\partial O}{\partial u_k} &=& \sum_j \frac{\partial O}{\partial y_j} \frac{\partial y_j}{\partial u_k} \\
&=& \sum_j \frac{\partial (-\ln p)}{\partial y_j} \frac{\partial y_j}{\partial u_k} \\
&=& - \frac{1}{p} \sum_j \frac{\partial p}{\partial y_j} \frac{\partial y_j}{\partial u_k} \\
&=& - \frac{1}{Z} \sum_j \frac{s_j}{y_j} \cdot y_j (\delta_{jk} - y_k) \\
&=& - \frac{1}{Z} (s_k - \sum_j s_j y_k) \\
&=& y_k - \frac{s_k}{Z}

这正是原文中的 (16) 式。

这个结果似乎可以直观理解。y_k(实际上是y_k^t)是仅观察t时刻输出层时,输出符号k的概率;s_k/Z是从整体上看,所有路径中,在t时刻输出符号k的那些所占的概率比例。当网络参数取最优值时,梯度等于 0,即y_k = s_k / Z,也就是说这两个东西应该相等,也就是局部和整体一致(?)。
好久没看了,刚才看 @王赟 Maigo 对ctc中的错误写了一篇文章,拿出来再过一遍,还算比较好理解,具体实现的话估计还有很多细节需要注意。有错误还望大神指出,有些地方理解的不是很透