ASR-CTC

前言

    CTC(Connectionist Temporal Classification)可以在未对输入序列与输出标签进行FA(Force Alignment)的情况下完成时序对齐及分类工作,主要用于语音识别及手写识别[1]。

原理

    CTC的工作原理如下图所示[1]:

CTC work

    以ASR为例,给定语音信号输入序列$X=[x_1, x_2,…, x_T]$,输出序列记为$Y=[y_1, y_2, …, y_U]$,当前需要找到$X$到$Y$的精确映射。
    因以下几点的存在使得寻找映射的工作比较困难:
1)X和Y是可变的序列
2)X和Y的长度比率不是固定的
3)X和Y的对应关系事先无法确定
    CTC不仅解决了以上的问题,还基于给定的输入序列$X$得出了$Y$的概率分布,可通过使用该概率分布推断可能的输出或评估输出的概率。
    目标:
1)损失函数:驱使概率分布更接近准确的输出,计算Y在给定输入X下的概率分布($P(Y|X)$)
2)推论:最大化$P(Y|X)$,即

时序对齐

    论文举例 cat:

    实现时序对齐的几个问题:
        1)输入和输出可能无法完全对应,比如输入有长时间的静音
        2)[h,h,e,l,l,l,o]可能会被识别成helo,实际为hello

    为实现时序对齐,解决上述问题,论文提出的方案(remarkable):

    作用是指代静音,区分字符相似的单词(如hello和helo)
    基于此,hello的输入序列可以表示为[h,h,e,$\epsilon$,$\epsilon$,l,l,l,$\epsilon$,l,l,o],去除重复字符后为[h,e,$\epsilon$,l,$\epsilon$,l,o],去除空白字符后表示为[h,e,l,l,o]

损失函数

    CTC使用RNN作为训练网络,在每一步都会生成输出序列的概率分布,其中对于每一对$(X,Y)$,其条件概率为:

    CTC loss的计算十分费时,论文使用动态规划对计算过程进行了优化,合并同一time step的相同输出,如下图所示:

CTC DP

    CTC算法的预测序列为

    当前字符为空白字符$\epsilon$时,下一个字符有两种可能:空白字符或$Z$序列中的下一个字符。
    当前字符不是空白字符时,下一个字符有三种可能:当前字符、空白字符或$Z$序列中的下一个字符。
    下图为CTC的计算过程:

CTC computation

    基于动态规划,可用前向和后向概率计算CTC的loss,计算过程可参考[2]。
    对于训练集D,CTC的loss计算可归纳为下式:

    参考博客[2],CTC的loss函数求解如下图所示:

CTC loss

    其中的z就是博客前半部分讨论的y,

CTC loss definition

推论

    由于直接暴力计算,$𝒑(𝒛│𝒙)$的复杂度非常高,论文中提及了greedy search和beam search两种方法[3]:
    greedy search:每个时间片均取该时间片概率最高的节点作为输出
    beam search:Beam Search是寻找全局最优值和Greedy Search在查找时间和模型精度的一个折中

CTC与HMM

    作者借鉴HMM的Forward-Backward算法思路,利用动态规划算法求解[2]。

CTC缺陷

    CTC假设每个时间片之间是相互独立,这种假设使输出丢失了时间片之间的语义信息,因此在CTC后部添加语言模型可有一定的优化效果。

References

[1] https://distill.pub/2017/ctc/ Sequence Modeling With CTC
[2] https://xiaodu.io/ctc-explained/
[3] https://zhuanlan.zhihu.com/p/42719047