文章

CTCLoss

随着时序模型的发展,当下做不定长解码的方法越来越丰富。
比较知名的有深度学习中的:

  1. encoder-decoder架构:
    优点是泛用性好,无论怎么对齐都可以,尤其配合transformer架构下,注意力可以理解几乎任何信息。
    唯一缺点是体积大,不轻便。

  2. ctcloss+encoder架构:
    核心在于ctcloss这个损失函数,其数学原理比较复杂,下面我将尽我所能,介绍清楚,文章中设计ai攥写部分会有标明。

CTCLoss

包含ctcloss的结构目前分为两类,一类是轻量级的纯ctcloss架构,一类是结合了词袋(ngram)模型的ctcloss架构

这里提到了词袋模型,其原理简单,数学原理就是全概率公式和马尔可夫链,属于纯统计学模型,其中的n就是其建模假设中,第m个词(即下一个词)跟前n个词相关。虽然模型很简单,推理时间复杂度极低,但是由于词典单词总体量巨大,模型参数两与n成指数关系,例如3-gram模型加载到内存的参数量仅 30GB 左右,5-gram 400GB左右。

闲言碎语

后续皆为2026/10/16日补,之前实在太懒了,哈哈哈哈。

下面直接介绍一下ctcloss的前向解码和反向传播的方案

前向解码

在RNN类的序列模型输出了一个序列的多分类输出后(在语音翻译场景下,这里的输出为一串音素序列),解码的时候,模型把相邻的重复值合并成一个,没了

反向传播

ctcloss的梯度回传方案需要用到BPT(时序反向传播算法,说白了就是记录每次RNN单元输出所产生的更新然后加起来一次更新,简单粗暴,hhh)。剩下就要关注loss怎么从ctcloss传递到RNN上去的。

ctcloss是个概率统计学的损失函数,数学性质很强(至少比交叉熵损失啥的有意思(不好理解))

这里最大的问题是,RNN类模型的输出不能和target对齐。ctcloss解码方案选择的是把target序列拆成多条RNN规范下的序列,而且很显然,不同的序列出现的概率不一样,由此,我们就得到了RNN的 伪target,以及这个伪target对应的权重,在使用BPT更新参数的时候,我们这条序列的参数更新方向还要×上这个权重。

由此,ctcloss通过美妙的数学实现了反直觉的数学传播。概率还是太重要了

许可协议:  CC BY 4.0