前言
最近在看这个论文,本来想要写一个翻译,但是鉴于本人英语的渣水平,再加上论文本身一些说明,虽然能够看懂,但是很难翻译过来,所以还是写个阅读笔记好了。在这篇文章,我会跟着论文的思路大致说明论文的内容和自己的理解。
CTC解决什么问题
在许多的训练任务中,我们需要输入一个序列,这个序列有可能有噪声,并不是我们需要的信息都连续存在。比如声音的识别之类的,对于一个语音,假设我们要翻译成文字,但是声音中的信息并不是连续的,说了一个字可能要停顿个1秒才会说下个字:
- 我~~~~要吃饭
- 我要~~~~吃饭
- 我要吃~~~~饭
像上面这三种情况,显然结果都是我要吃饭。想要让RNN做到这一点,我们要解决两个问题,一个是,如何将RNN的输出翻译成同一句话,另一个问题,如何训练这样一个网络。CTC就这两个问题提供了一个可行的方案,使得训练这样的网络成为可能。
2.时序分类器(Temporal Classification)
论文的第二节,实际上是定义了一些基础的概念和问题,这个小标题大概是这么翻译吧……
这里提到了一大堆符号,不过有一些都是为了后面少说几个字~
S :表示训练集
χ=(Rm)∗ :输入空间,表示m维的所有序列(这里的m就是输入序列长度)
L :字符集
Z=L∗ :输出空间,是字符集中的字符的组合序列。
(x,z) :表示训练集中的一个训练样例。
x=(x1,x2,...,xT) :一个训练样例中的输入的序列。
z=(z1,z2,...,zU) :一个训练样例中的label的序列(就是应该输出的结果)。
U≤T :这里要说明的是,输出序列长度要小于等于输入序列的长度(RNN对于序列的每个元素都有个输出,但是我们要做一些操作吧这些输出转化成真正的结果)。
说了这么多,终于可以说训练的目标了,我们的目标是训练一个时序分类器 h 来将输入转换(映射)成我们需要的结果:
2.1 label的错误率计算
在论文里,评价标签的错误率使用了最小编辑距离的方法,也就是说,想要把一个串变成目标串最少需要几步(可用的操作包括添加、修改、删除一个字符)。最小编辑距离用 ED(p,q) 表示,这里的 p,q 就是要计算的两个字符串。
论文里还是用符号和公式来表达了最终测试的评价结果:
S′ :表示测试集
LER :标签的错误率(label error rate)
LER(h,S′)=1|S′|∑(x,z)∈S′ED(h(x),z)|z|a(1)
使用分类器 h 在测试集S′ 上测试的标签错误率,计算方法是,对于每个样例,计算分类器的输出与label的最小编辑距离,然后除label的长度,把这些求和除测试集的长度~
3. Connectionist Temporal Classification
也不知道具体如何翻译,就这样吧。这一节是说,要把RNN的输出使用CTC来描述,最重要的一步是把网络的输出转化成标签上每个字符的独立的条件概率,然后网络就可以根据对应的最有可能的label来训练分类器。
3.1 从网络输出到标签
这里大概说了一下CTC网络的结构,首先是有一个softmax的输出层,输出层除了字符集 L 还有一个额外的单元,论文里称为’blank’,可以看作是一个特殊符号,表示这个输出不对应的字符集的元素。这些输出通过排列组合就可以得到所有可能的输出。
接下来,又是惯例的公式时间:
Nw:(Rm)T↦(Rn)T :这里对于一个长度为 T 的输入序列x ,定义了一个 m 个输入,n 个输出,权重向量为 w 的RNN网络作为映射函数。这里m,n 指的是网络的输入输出,而 T 指的一个输入序列的长度,有些绕,就是一个输入到输出的定义,大概理解就好了。
y=Nw(x) :这里 y 就是网络的输出序列。
ytk :这个就是在 t 时刻,网络输出的k 元素的值(概率)。
L′=L∪{ blank}