如何训练一个 RNN,使其直接对“未分段”的长输入序列进行标注,而不需要事先对齐
no presegmented training data and post-processed outputs
Temporal classfication
- 输入往往比输出要长一点,有着没有对齐的缺点,所以希望找到一个函数使得学会哪些输入是对应哪些标签
Connectionist Temporal Classification
- 3.1. From Network Outputs to Labellings
- CTC输出的时候softmax比label多一个,即blank,用来代表当前帧是no label的概率
- 由于有blank的存在,所以一个标签会对应多种路径——标签的概率=路径概率之和
- 3.2. Constructing the Classifier
- 由于path会很多种,所以直接算argmax P(x|l)不太现实
- method1:假定最可能的path组合之后就是最可能的label
- method2:通过动态规划求出给定前缀之后的条件概率;但是有可能退化到指数时间,所以要heuristic——利用blank来切块,每块单独做前缀树
train
- forward&backword variable 上网找视频
- 就是一动态规划,每条路径经过标签 s 的概率 = 前半部分 α × 后半部分 β × 当前帧概率
- 定义α_t(s) = 所有在第 t 步时已经对齐到 l′₁:s 的路径概率之和
- 先扩展,在每个token的前后加blank
- 递推的时候就三种情况
- 停留在当前state:a(t-1,s)
- 从s-1过来顺序推进:a(t-1,s-2)
- 从s-2过来,跳过blank:a(t-1,s-2);但是要求扩展后的s-2≠s
- p(l|x) = α_T(|l′|) + α_T(|l′|−1)因为最终的路径可以以:最后一个 blank 结束;或者以最后一个字符结束
- 还需要归一化——防止underflow
- backward和forward是差不多的,只是方向相反
- 就是一动态规划,每条路径经过标签 s 的概率 = 前半部分 α × 后半部分 β × 当前帧概率
- loss的计算
- L(x,l)=−logP(l∣x)
tip
- CTC只是一个计算loss的方法,提供了一种对于输入X的长度比标签Y长太多的对齐的方法
- 计算loss的时候

