首页 > > > 10320 CTC开山之作中的推导错误及更正
(这篇并不是科普,我尽量写得简略,学过 CTC 的人会知道我在说什么)
CTC(connectionist temporal classification)是 sequence-to-sequence learning 的一个重要里程碑。它为 RNN 设计了一种新型的目标函数,使得输入、输出序列不必等长,也不需要在训练前对输入、输出序列进行对齐。有了 CTC 之后,语音识别等系统的性能又上了一个台阶。
在用到 CTC 的时候,大家一般都会引用 Alex Graves 在 2006 年的 ICML 会议上发表的开山之作《Connectionist Temporal Classification: Labelling Unsegmented
Sequence Data with Recurrent Neural Networks》。这篇论文介绍了 CTC 的解码与训练方法,其中训练方法用到了 forward-backward 算法。不过,在推导过程中,方程 14、15(连带着后面的方程 16)出现了错误。
方程 14 是这样的:

这里不应该对
求和,而应当任选一个
。事实上,可以直接选取
,这样方程就化归为上一页的方程 8:

方程 15 是方程 14 的导数:

这里对
的求和在各种“马虎眼”下居然恰好消失了。这里的“马虎眼”在于,求和式内部的
、
之积,无论
等于多少,都是隐含了所有的时间步的;对
求导的时候,并不是只有
时间步能留下来。但就时间步方面来说,方程 15 恰恰“错错得对”了。不过,方程 15 里还有另一个错误,就是
、
其实也隐含了
(下略作
),并且是它的线性函数。这样,求导的过程应该是(省略一切下标等):

与方程 15 差了一个负号。这个错误其实很容易看出来:
越大,
也应该越大,导数应该是正的才对。
受这两个错误(尤其是方程 14)的影响,网上的一些 CTC 源码对进行了求和,比如:
因为各个时间步的求和是相等的,对
求和只是让结果放大了
倍,不至于导致错误,但无端增加了计算量。如果你使用 Theano 的自动求导功能,其实用方程 8 的对数值作为目标函数就可以了,连 backward pass 都不需要。
Alex Graves 后来也发现了这两个错误,并作出了更正。可惜,现在网上流传的版本,仍然有不少是错误的,比如:
但下面这个版本是更正后的:
原文作者:;如有侵权,请联系管理员删除。