ITPub博客

首页 > > > 10320 CTC开山之作中的推导错误及更正

10320 CTC开山之作中的推导错误及更正

作者:格伯纳 时间:2016-07-29 05:07:31 0 删除 编辑

  (这篇并不是科普,我尽量写得简略,学过 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 是这样的:

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

  方程 15 是方程 14 的导数:

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

\frac{\partial p}{\partial y} = \frac{\partial}{\partial y} \sum_s \frac{\alpha \cdot \beta}{y} = \frac{\partial}{\partial y} \sum_s \frac{ay \cdot by}{y} = \sum_s ab = \frac{1}{y^2} \sum_s \alpha \cdot \beta \\

与方程 15 差了一个负号。这个错误其实很容易看出来:y越大,p也应该越大,导数应该是正的才对。

  受这两个错误(尤其是方程 14)的影响,网上的一些 CTC 源码对t进行了求和,比如:

因为各个时间步的求和是相等的,对t求和只是让结果放大了T倍,不至于导致错误,但无端增加了计算量。如果你使用 Theano 的自动求导功能,其实用方程 8 的对数值作为目标函数就可以了,连 backward pass 都不需要。

  Alex Graves 后来也发现了这两个错误,并作出了更正。可惜,现在网上流传的版本,仍然有不少是错误的,比如:

但下面这个版本是更正后的:

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984152