ctc 解码原理
贪心解码是CTC的默认快速实现,适合大多数轻量级应用。
束搜索是精度优化的选择,但需权衡计算成本。通常在语音识别中,
k=5
的束搜索就能显著优于贪心解码。
CTC 解码原理
CTC(Connectionist Temporal Classification)是一种用于处理输入序列和输出序列长度不一致的算法,常用于语音识别或手写识别等任务。其解码过程是将神经网络的输出(通常是帧级别的概率分布)转化为最终的标签序列。以下是CTC解码的原理说明及示例:
1. CTC的输出表示
CTC的网络输出是一个矩阵,维度为(时间步T × 标签集合L')
,其中L' = L ∪ {blank}
(L
是有效标签,blank
表示空白或无输出)。
例如,对语音识别任务(标签集 L = {a, b}
,blank = "-"
),某时刻的输出概率可能如下:
时间步 | P(-) | P(a) | P(b) |
---|---|---|---|
t=1 | 0.6 | 0.2 | 0.2 |
t=2 | 0.1 | 0.8 | 0.1 |
t=3 | 0.1 | 0.1 | 0.8 |
2. CTC解码的目标
找到概率最高的输出序列。常用两种解码方法:
贪心解码(Greedy Decoding):每一步取概率最高的标签。
束搜索解码(Beam Search):保留多条候选路径,避免局部最优。
3. 贪心解码示例
步骤:对每个时间步独立选择概率最大的标签,然后合并重复标签并移除blank
。
对上述输出矩阵:
逐帧选择:
t=1:
-
(0.6)t=2:
a
(0.8)t=3:
b
(0.8)
合并序列:
- a b
→a b
最终输出:
ab
4. 束搜索解码示例(束宽=2)
保留概率最高的两条路径,逐步扩展。
初始状态:
路径1:
-
(P=0.6)路径2:
a
(P=0.2)路径3:
b
(P=0.2)
步骤1:保留Top 2路径(-
和a
)。
步骤2:扩展路径:
路径
-
+-
: 0.6×0.1=0.06路径
-
+a
: 0.6×0.8=0.48路径
a
+-
: 0.2×0.1=0.02路径
a
+a
: 0.2×0.8=0.16
更新Top 2路径:-a
(0.48),a
(0.16)
步骤3:继续扩展:
路径
-a
+-
: 0.48×0.1=0.048路径
-a
+b
: 0.48×0.8=0.384路径
a
+-
: 0.16×0.1=0.016路径
a
+b
: 0.16×0.8=0.128
更新Top 2路径:-a b
(0.384),a b
(0.128)
合并重复并移除blank
:
-a b
→a b
a b
→a b
最终输出:ab
(概率总和更高)。
5. CTC的特殊规则
重复标签处理:只有中间隔
blank
时才保留重复(如a-a-b
→aab
,但a-a
→a
)。空白符作用:分隔相同字符或跳过无效帧。
总结
贪心解码:简单高效,但可能忽略全局最优。
束搜索:通过保留多条路径提高准确性,但计算复杂度更高。
通过这两种方法,CTC可将变长的帧级别输出转化为最终的标签序列。