如何训练一个 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
      • 递推的时候就三种情况
        1. 停留在当前state:a(t-1,s)
        2. 从s-1过来顺序推进:a(t-1,s-2)
        3. 从s-2过来,跳过blank:a(t-1,s-2);但是要求扩展后的s-2≠s
      • p(l|x) = α_T(|l′|) + α_T(|l′|−1)因为最终的路径可以以:最后一个 blank 结束;或者以最后一个字符结束
      • 还需要归一化——防止underflow
    • backward和forward是差不多的,只是方向相反
  • loss的计算
    • L(x,l)=−logP(l∣x)

tip

  • CTC只是一个计算loss的方法,提供了一种对于输入X的长度比标签Y长太多的对齐的方法
  • 计算loss的时候

image.png

image.png