任务定义和概念解释
CTC是一种损失函数,解决的是未分段的序列数据的转换任务的训练问题。
序列数据:比如说一段语音;
标注:语音的内容是“我爱你”三个字
未分段:比如说采样率是16000Hz,音频的时间长度是1S,那么数据有16000帧,未分段就是没有告诉你哪些帧是哪个字。
转换任务:把A序列转换成B序列,比如把音频文件转换成字符串序列。
Temporal Classification
S——样本集合,其中一个样本就是一个(x,z)对组合
x——样本中转换前的原序列,x是一个由m维向量组成的序列,其所属的集合X叫做输入空间(例如经过MFCC后的音频序列)
z——样本中转换后的序列,z是一个其所属的集合L叫做目标空间,L是由有限的元素组成的序列的集合,并且z的长度一定小于x的长度(例如L可以是所有汉字的任意排序的集合,香农采样定理告诉我们一句话里能解析出来的字数不可能比音频帧数还多)
Temporal Classification就是训练一个从X到L的映射h(x,z),来满足下面的标准
Label Error Rate(衡量Temporal Classification任务的标准)
这个值越小,说明任务完成得越准确。
S`是S的一个子集,这里就是测试集
ED:编辑距离——用来衡量两个序列之间的差异大小
the minimum number of insertions, substitutions and deletions required to change p into q.
From Network Outputs to Labellings
x序列(假设长度是T)首先通过RNN网络+softmax(或者FC+softmax也可以?)转化成一个n维向量组成的序列(长度也是T),这里的n是目标空间中有限元素的数量+1(其实就是字库里有多少个字,为啥加一往下看),n个数字代表在这个位置出现某个字的概率。
下面这个公式就是在输入为x这个条件下输出序列π的条件概率。
π是某一个长度为T的序列比如“- - 我 我 - 爱”,其中的“-”代表blank,这就是加一的原因。
上面的公式成立的条件是每一帧之间条件概率相互独立。
然后定义一个多对一的映射B,把blank和相连的重复字符都去掉,这个意思:
就得到了转换成最终表达的条件概率公式,公式中的l是最终生成的字符序列。
至此我们的问题转换成了寻找h(x),其生成的字符序列l使得上面的条件概率p(l|x)取到最大值
到这里我们可以想一下,h(x)应该由两部分组成,第一部分是x到n维向量的转换(RNN+softmax),第二部分是这个向量到最终序列l的转换。文中沿用了隐马尔可夫模型中的术语将第二部分称作decoding。并列出了两种在实际中用到的decoding方法。
第一种是best path decoding:非常简单,就取每一个n维序列元素的最大值生成的序列,然后经过转换B。简单粗暴,但是并不能保证取到的序列使得上述条件概率最大。
第二种是Prefix search decoding:其实这个问题是有确定解的,条件概率最大的组合只有一个,这种方法其实就是去暴力搜索,但是随着序列长度和维度的增加,求解这个问题的复杂度呈指数级上升(细思恐极),一种折中的方法就是限定prefix的数量,比如每一步只考虑前一步概率最大的那三个项目的子情况,这里贴一个链接,图画得很美,比我讲的强。
有点累了,后面就是一脸懵逼的前向后向,还没看明白,留个坑,希望能填上,下班。